【问题标题】:Redirect old custom Posts URL to new WordPress URL将旧的自定义帖子 URL 重定向到新的 WordPress URL
【发布时间】:2022-01-12 02:42:56
【问题描述】:

简而言之,我将旧的自定义站点转换为新的 WordPress 站点,域保持不变,我使用 PHP 将数千篇带有 cmets 的旧文章插入到 WordPress 数据库中,保持相同的 id 序列,这意味着如果旧链接是:

www.mysite.com/index.php?id=11058

www.mysite.com/index.php?category=12

比新的链接是:

www.mysite.com/?p=11058

www.mysite.com/?cat=12

一切都做得很好,唯一的问题是我不想丢失旧的反向链接,我想使用PHP进行重定向,例如:

    if (isset($_GET['old_id'])) {  $id=$_GET['old_id']; $Wordpress_post_id = $id; }

如何在 WordPress 中使用此代码?这种方法更好还是通过.htaccess重定向?或者有没有比这两个更好的方法?

【问题讨论】:

    标签: php wordpress .htaccess post redirect


    【解决方案1】:

    我会在template_redirect

    这个动作挂钩在 WordPress 确定要加载的模板页面之前执行。如果您需要在完全了解已查询的内容的情况下进行重定向,这是一个很好的钩子。

    add_action(
        'template_redirect',
        static function() {
    
            if(!isset($_GET['old_id'])){
                return;
            }
    
            // Do custom look up here, possibly get_posts()
    
            // Once you determine where to go, use wp_safe_redirect with the appropriate code (probably 301)
            // https://developer.wordpress.org/reference/functions/wp_safe_redirect/
    
            // Also possibly use get_permalink() to find the canonical link for the object
            // https://developer.wordpress.org/reference/functions/get_permalink/
        }
    );
    

    不幸的是,“自定义内容”实际上取决于您存储内容的方式。是post meta,你手动插入post ID,是自定义查找表吗?

    如果是传统 ID 到 PostID 的真实映射,您甚至可以通过简单的规则使用 Redirection 之类的插件。

    【讨论】:

    • 我认为使用插件比自己修改脚本更好,因为我是 WordPress 新手。
    • 我使用 WordPress 函数插​​入帖子和 cmets(wp_insert_post() 和 wp_insert_comment())。非常感谢。
    • 如果重定向插件有效,我说完全可以。但是,如果您熟悉 PHP,则此代码内部不需要大量 WordPress 内容。
    • 问题是我对 WordPress 的工作原理和结构知之甚少。插入帖子、cmets 和图像很容易,因为我所要做的就是将它们放入一个数组中,然后使用 WordPress 函数将它们插入到数据库中,但是重定向这件事似乎更复杂。我将在我的 pc localhost 上尝试 PHP 解决方案,如果成功,我将在网站上实施它。非常感谢你。
    【解决方案2】:

    既然您提到(并标记).htaccess,您可以在.htaccess 文件的顶部(# BEGIN WordPress 评论标记之前)这样做:

    # Redirect "/index.php?id=<number>" to "/?p=<number>"
    RewriteCond %{QUERY_STRING} ^id=(\d+)
    RewriteRule ^index\.php$ /?p=%1 [R=301,L]
    
    # Redirect "/index.php?category=<number>" to "/?cat=<number>"
    RewriteCond %{QUERY_STRING} ^category=(\d+)
    RewriteRule ^index\.php$ /?cat=%1 [R=301,L]
    

    其中%1 在这两种情况下都是对前面CondPattern 中捕获组的反向引用。 IE。 idcategory URL 参数的值。

    使用 302(临时)重定向进行测试以避免缓存问题。

    【讨论】:

    • 我会试一试..非常感谢
    【解决方案3】:

    我最近不得不做同样的事情。我重新组织了一个站点,并将结构从根目录(以及所有目录结构)移至 blog 文件夹。我试验了几种 WordPress 的方法,分析了日志中的问题等,并实现了以下方法。

    首先,我创建了每个页面、文章等的列表。

    然后我在站点根目录中创建了一个 .htaccess 文件。

    在下面的示例中,我显示了一个页面的重定向,但有两个条目(是否有斜杠)。底部处理文件和导向器等。

    我的 .htaccess 大约有 600 行。我没有注意到重定向的任何性能问题。

    注意:我使用 302 进行重定向,如果您的重定向是永久性的,请考虑使用 301。

    <IfModule mod_rewrite.c>
      <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
      </IfModule>
    
      RewriteEngine On
    
      RewriteRule ^aboutme$ https://www.example.com/blog/aboutme/ [L,R=302]
      RewriteRule ^aboutme/$ https://www.example.com/blog/aboutme/ [L,R=302]
    
      # Handle Authorization Header
      RewriteCond %{HTTP:Authorization} .
      RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
      # Redirect Trailing Slashes If Not A Folder...
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_URI} (.+)/$
      RewriteRule ^ %1 [L,R=301]
    
      # Send Requests To Front Controller...
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^ index.php [L]
    </IfModule>
    

    【讨论】:

    • 似乎有点复杂,因为我对 .htaccess 没有太多经验,而且我害怕犯错误。我想要一个简单的解决方案。谢谢
    • @AyadAttar 我认为 WordPress 没有简单的解决方案。你必须处理极端情况。 WordPress 有许多将文章和页面显示为 URL 的方法。无论您选择哪种方法,都要花时间研究日志文件,因为会有问题。
    • 你说得对,没有简单的解决方案..我真的应该更加努力学习WordPress的工作原理..问题是管理网站,编辑和写新帖子不会离开我任何时间学习新事物..这就是为什么我试图通过请教专家来缩短时间和精力..我认为我面临的问题,以及许多网站所有者,是他们没有组建一个团队来管理他们的网站..您不能自己做所有事情..非常感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2020-10-24
    • 2020-05-02
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2021-11-28
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多