【问题标题】:Wordpress simple rewrite rule not workingWordpress 简单重写规则不起作用
【发布时间】:2013-10-13 17:33:58
【问题描述】:

我正在尝试在 Wordpress 中创建重写规则,以创建指向搜索结果的直接漂亮链接。

我正在使用一个名为“对象”的自定义帖子类型

我的结果页面位于此网址:http://www.domain.com/objects/

我想创建这种 URL 来指向新对象的列表:http://www.domain.com/objects/new

重写后的查询必须是:http://www.domain.com/objects/?filter=new

然后我将能够使用 $_GET['filter'] 值来查询我的对象 (meta_query)...

我的问题

我已经尝试使用此代码:

add_rewrite_tag('%filter%','([^&]+)');
add_rewrite_rule('objects/new/','objects/?filter=new','top');

.htaccess 看起来像这样:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule ^objects/new/ /objects/?filter=new [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

不幸的是,当我尝试访问 URL http://www.domain.com/objects/new 时,我遇到了 404 错误:(

调试栏告诉我这个:

Request:
   objects/new

Query String:
   attachment=new

Matched Rewrite Rule:
   [^/]+/([^/]+)/?$

Matched Rewrite Query:
   attachment=new

有人能告诉我为什么 Wordpress 会尝试检索附件吗? 我的重写规则有问题还是我遗漏了什么?

提前感谢您的帮助!

【问题讨论】:

  • 几个问题 1. 这是否正常工作 - domain.com/objects 2. domain.com/objects/filter/new - 你是否可以?
  • 您好 Pramod,我不明白您对这些问题的意思是什么? domain.com/objects 是一个现有的 WP 页面, domain.com/objects/filter/new 对我来说不是一个好的解决方案,因为我不想要最终 url 中的“过滤器”(我想要 domain.com/objects /新)

标签: wordpress


【解决方案1】:

重写规则需要放置为

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^objects/new(.*)$ /objects/?filter=new [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

【讨论】:

  • 嗨,即使这个规则高于 wordpress 常规规则,Wordpress 仍在查询“附件”
【解决方案2】:

使用这个插件Rewrite plugin 它将帮助您分析当您点击 url 时哪个规则正在工作..您可以创建新的重写规则并可以在此处检查它们是否相应地工作。

不需要在 wordpress 中写任何东西,因为 wordpress 本身有一个 wp_rewrite 类来管理所有的重写规则。

尝试使用多个重写规则并相应地设置规则优先级。因为如果在上面找到匹配项,则列表中上面提到或列出的规则将首先匹配,然后 wordpress 将忽略下面列出的规则。

我已经按照我想要的方式使用了这个插件及其对我的工作。在此附上截图

【讨论】:

  • 您好,谢谢!这个插件看起来不错,但我从来没有找到如何删除添加的规则:(我使用调试栏来查看分析查询。不幸的是,我的问题不是那个,我知道如何添加重写规则,我根本不知道构建规则以实现我想要的正确方法:S
【解决方案3】:

好的, 我终于找到了实现这一目标的方法。

这是我添加到主题中的代码:

function custom_rewrite( $wp_rewrite ) {
    $feed_rules = array(
        'objects/(.+)'  =>  'index.php?page_id=27&filtre=' . $wp_rewrite->preg_index(1),
    );
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}

其中 27 是我想通过重写的 URL 访问的“/objects”页面的 Wordpress ID,并且:

function custom_wp_querystring() {
    add_rewrite_tag('%filtre%','([^&]+)');
}

为了告诉 Wordpress,我需要使用一个名为“filtre”的自定义查询变量。

最后一个函数必须在初始化动作中添加:

add_action( 'init', 'custom_wp_querystring');
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );

重要的是要知道,在我的页面模板(在我的示例中 ID 为 27 的那个)中,如果我想测试查询变量,则不可能进行这种测试:

if ( isset ( $_GET['filtre'] ) ) { ... }

GET vars 由于 Wordpress 重定向而被“隐藏”,您必须这样做:

if ( isset( $wp_query->query_vars['filtre'] ) ) { ... }

【讨论】:

  • 您正在通过编码添加规则,而插件将代码直接添加到 db..:)
  • 谢谢,使用index.php?pagename=some-page-name 的规则没有运气,使用index.php?page_id=123 一切正常。
猜你喜欢
  • 2017-01-13
  • 2017-10-06
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多