2015-09-08 250 views
1

我每天与WordPress的工作,并没有看到过这个问题。也许SO社区有一些洞察力。WordPress的永久链接和重定向

我有一个标准的wordpress安装v4.3,这是当前版本。我没有活动的重写模块。没有设置基本类别或标签。固定链接被设置为“发布名称”为干净的URL,这适用于整个网站除了/博客以外的所有内容

我试图重写/ blog/*到index.php?page_id = xxx并写了一个自定义分析器来处理似乎在本地工作的URI段。然而,在服务器上,所有/ blog/xxx只是重定向到/ blog /即使我没有专门告诉它这样做。

我曾尝试在.htaccess中设置这样的:

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

这不,即使自定义文章类型正则表达式检查出来和所有其他重写规则,我有工作的工作。

当失败我试着写一个重写规则挂钩:

// 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正在采取的行动是重定向到index.php?page_id = 123,而不是加载它,让我自己解析URI。就像“博客”这个词在某种程度上是保留的一样。

有没有其他人看过类似的东西?我能想象的唯一相关插件可能会扰乱CCTM,但博客不是自定义内容类型。/blog只是一个普通的页面,像其他任何根据URI段获取帖子的普通页面。

我建议尝试为这些页面使用标准WP体系结构,但客户端坚持一切都在/ blog/category/category_name/page/x下。他们不想为此付出代价,而且我明白,因为它在当地按预期运作。是的,服务器设置有细微的差异,但常见的核心元素是相同的 - htaccess启用,wp是根目录,并没有安装在一个目录等。

我试过禁用所有插件,切换到2015主题,潮流固定链接,清除缓存等等。非常奇怪。

任何输入或类似的故事可能会导致解决方案,所以我欢迎你有什么。

回答

1

我回答我自己的问题,因为它看起来像很多其他人有类似的问题,并接受答案是稀缺的。因此,对于我的具体情况,这是答案:

首先,在huksley's answer之后,我在web根目录中编写了备用index_pass.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; 
    } 
} 

流氓$旁路只是告诉我,以填补在页面blog-造成这种失衡的解决方案的空隙index.php

所以我们有它。有用。我不完全肯定为什么,我对此有点不舒服,但最终我不在乎,只要它有效。我更愿意有一个实际的解决方案,它不会违反任何理智的程序员的思想的每一个逻辑碎片,并且不会违背多个PhD衍生CMS的实际骨架,但是,嘿,我们不能一直赢,对吗?

希望它可以帮助别人。