代码之家  ›  专栏  ›  技术社区  ›  Kai Qing

Wordpress永久链接和重定向

  •  1
  • Kai Qing  · 技术社区  · 9 年前

    我每天都在wordpress工作,以前从未见过这个问题。也许SO社区有一些见解。

    我有一个标准的wordpress安装v4.3,这是当前版本。我没有激活的重写模块。未设置基本类别或标记。对于干净的URL,Permalinks被设置为“Post-name”,这对整个网站都很有效,除了/blog下的所有内容

    我已尝试将/blog/*重写为索引。php?page_id=xxx,并编写了一个自定义解析器来处理URI段,这似乎在本地工作。然而,在服务器上,所有/blog/xxx都只是重定向到/blog/,尽管我没有明确告诉它这样做。

    我尝试过在.htaccess:

    RewriteRule blog/(category|tag|page|search)/(.+)/?$ index.php?page_id=123
    

    即使正则表达式签出并且我为自定义post类型设置的所有其他重写规则都有效,但这仍然不起作用。

    当失败时,我尝试编写重写规则钩子:

    // pathetic hack to fix wp permalink horror for blogs
    add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
    add_action( 'wp_loaded','my_flush_rules' );
    
    // flush_rules() if our rules are not yet included
    function my_flush_rules(){
        $rules = get_option( 'rewrite_rules' );
    
        if(isset($_GET['rules']))
        {
            echo '<pre>';
            print_r($rules);
            echo '</pre>';
        }
    
        if ( ! isset( $rules['blog/(category|tag|page|search)/(.+)/?$'] ) ) {
            global $wp_rewrite;
            $wp_rewrite->flush_rules();
        }
    }
    
    // Adding a new rule
    function my_insert_rewrite_rules( $rules )
    {
        $newrules = array();
        $newrules['blog/(category|tag|page|search)/(.+)/?$'] = 'index.php?page_id=123';
        return $newrules + $rules;
    }
    

    哪一个,如果你跑?浏览器中的规则显示当前的重写数组,并且确实将其添加到数组中。然而,出于某种原因,WP正在采取的行动是 重新使用 索引。php?page_id=123,而不是加载它并让我自己解析URI。就像“博客”这个词是有保留的。

    还有人见过这样的东西吗?我能想象到的唯一相关插件可能是CCTM,但博客不是自定义内容类型/博客只是一个普通的页面,就像任何其他根据URI段获取帖子的页面一样。

    我建议尝试对这些页面使用标准的WP架构,但客户端坚持所有内容都在/blog/category/category_name/page/x下。他们不想在这一点上让步,我理解,因为在当地,这是意料之中的。是的,服务器设置略有不同,但常见的核心元素是相同的-启用了htaccess,wp是根目录,而不是安装在目录中,等等。

    我尝试过禁用所有插件,切换到2015主题,刷新永久链接,清除缓存等。非常奇怪。

    任何输入或类似的故事都可能导致解决方案,所以我欢迎您的意见。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Community trashgod    7 年前

    我在回答我自己的问题,因为看起来很多其他人都有类似的问题,而且公认的答案很少。因此,对于我的具体案例,答案是:

    首先,接下来 huksley's answer 我编写了备用索引路径。php文件。该文件仅包含以下内容:

    <?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");
    

    接下来,我在wordpress默认值之前添加htaccess规则。E=URI:部分是这里的关键:

    RewriteEngine On
    RewriteBase /
    
    RewriteRule ^blog/(category|tag|page|search)/(.+)/?$ index_pass.php?page_id=123 [NC,L,E=URI:somedomain.com/blog/$1/$2/$3/$4]
    
    #wordpress defaults below
    

    然后在函数中。php的主题中,我添加了这个,以防止新的黑客垃圾解决方案抛出404:

    add_filter('template_redirect', 'my_404_override' );
    function my_404_override() {
        global $wp_query;
    
        if (strpos($_SERVER['REQUEST_URI'], "blog/category") > -1 || strpos($_SERVER['REQUEST_URI'], "blog/tag") > -1 || strpos($_SERVER['REQUEST_URI'], "blog/search") > -1) {
            status_header( 200 );
            $wp_query->is_404=false;
            $bypass = true;
            include('page-blog-index.php');
            exit;
        }
    }
    

    里面的流氓$bypass只是告诉我填补page-blog-index.php中这个破解解决方案造成的空白

    所以我们有了它。它起作用了。我不完全肯定为什么,我对此有点不舒服,但最终我不在乎,只要它有效。我更希望有一个实际的解决方案,它不会违背任何一个理智的程序员头脑中的每一个逻辑细节,并且在多个博士衍生CMS的实际框架内,但嘿,我们不能一直赢,对吧?

    希望它能帮助其他人。