重写后删除查询变量

时间:2014-07-16 作者:William Thomas

我有一个使用自定义帖子类型的WordPress博客,我正在使用WCK plugin. 其中之一是post类型shows. 然后,特定节目的永久链接显示为:

http://my-website.com/wordpress/shows/show-slug/
这一切都是通过WP和WCK插件的当前功能完成的。然而,我正在尝试添加另一个“级别”的详细信息,以显示在单个显示页面上。为此,我使用URL查询变量item 指定此。

例如,如果我想查看某个节目的剧集列表,我可以访问URL:

http://my-website.com/wordpress/shows/show-slug/?item=episodes
这些“项目”在每个节目中都有所不同,或多或少都是任意的,但我已经掌握了单个节目的逻辑。php模板,用于确定URL查询中提供的项目是否是该节目的有效项目。

无论如何,我想使用重写功能使URL更加友好,格式如下:

http://my-website.com/wordpress/shows/show-slug/episodes
这就是我遇到问题的地方。这是我的主题函数中的PHP脚本。用于注册URL查询变量和重写规则的php文件:

function shows_item_tag_registration() {
    global $wp; 
    $wp->add_query_var(\'item\'); 
}

function shows_item_rule_registration($rules) {
    $newrules = array();
    $newrules[\'^shows/([^/]+)/([^/]+)/?$\'] = \'index.php?pagename=shows/$matches[1]&item=$matches[2]\';
    return $newrules + $rules;
}

add_filter( \'rewrite_rules_array\',\'shows_item_rule_registration\' );
add_action( \'init\',\'shows_item_tag_registration\' );
我自己并没有刷新重写规则,因为我不想丢失WP Admin中永久链接设置编写的规则。相反,正如您所看到的,我正在将规则添加到rewrite_rules_array 滤器为了应用更改,我在WP admin中重新保存了Permalinks设置,这似乎就达到了目的。

令人沮丧的是,它几乎可以正常工作,但当我尝试访问URL时,最后是项目,就像这样:

http://my-website.com/wordpress/shows/show-slug/episodes
它只是将我重定向到:

http://my-website.com/wordpress/shows/show-slug/
并从查询中删除该项。我发现this Stack Exchange question 这看起来很相似,但我无法用那里的答案解决我的问题。

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

可能您没有使用正确的挂钩或正确的重写规则。您正在重写到pagename, 这是用于页面的。您应该使用name 通过slug获得帖子。

add_filter(\'query_vars\', \'cyb_add_query_vars\');
function cyb_add_query_vars( $vars) {
   $vars[] = "item";
   return $vars;
}
add_action(\'init\',\'cyb_add_rewrite_rules\');
function cyb_add_rewrite_rules() {
    add_rewrite_rule( \'\'^shows/([^/]+)/([^/]+)/?$\'\' , \'index.php?post_type=shows&name=$matches[1]&item=$matches[2]\' , \'top\' );
}
您还可以添加端点并使用URL,如http://my-website.com/wordpress/shows/show-slug/item/episodes:

add_action(\'init\',\'cyb_add_endpoint\');
function cyb_add_endpoint() {
    add_rewrite_endpoint( \'item\', EP_PERMALINK );
}
别忘了刷新rewirte规则。如果不想对刷新进行编码,请访问wp admin区域中的permalink设置页面,单击save,重写规则将被刷新。

结束

相关推荐

Updating URLs in many posts

我将我的WP内容复制到另一台服务器上的新安装中,因此现在我上载的PDF文档具有旧的URL。有没有一种简单的方法可以在我所有的帖子中一次解决这个问题,也许可以使用SQL或一些插件?

重写后删除查询变量 - 小码农CODE - 行之有效找到问题解决它

重写后删除查询变量

时间:2014-07-16 作者:William Thomas

我有一个使用自定义帖子类型的WordPress博客,我正在使用WCK plugin. 其中之一是post类型shows. 然后,特定节目的永久链接显示为:

http://my-website.com/wordpress/shows/show-slug/
这一切都是通过WP和WCK插件的当前功能完成的。然而,我正在尝试添加另一个“级别”的详细信息,以显示在单个显示页面上。为此,我使用URL查询变量item 指定此。

例如,如果我想查看某个节目的剧集列表,我可以访问URL:

http://my-website.com/wordpress/shows/show-slug/?item=episodes
这些“项目”在每个节目中都有所不同,或多或少都是任意的,但我已经掌握了单个节目的逻辑。php模板,用于确定URL查询中提供的项目是否是该节目的有效项目。

无论如何,我想使用重写功能使URL更加友好,格式如下:

http://my-website.com/wordpress/shows/show-slug/episodes
这就是我遇到问题的地方。这是我的主题函数中的PHP脚本。用于注册URL查询变量和重写规则的php文件:

function shows_item_tag_registration() {
    global $wp; 
    $wp->add_query_var(\'item\'); 
}

function shows_item_rule_registration($rules) {
    $newrules = array();
    $newrules[\'^shows/([^/]+)/([^/]+)/?$\'] = \'index.php?pagename=shows/$matches[1]&item=$matches[2]\';
    return $newrules + $rules;
}

add_filter( \'rewrite_rules_array\',\'shows_item_rule_registration\' );
add_action( \'init\',\'shows_item_tag_registration\' );
我自己并没有刷新重写规则,因为我不想丢失WP Admin中永久链接设置编写的规则。相反,正如您所看到的,我正在将规则添加到rewrite_rules_array 滤器为了应用更改,我在WP admin中重新保存了Permalinks设置,这似乎就达到了目的。

令人沮丧的是,它几乎可以正常工作,但当我尝试访问URL时,最后是项目,就像这样:

http://my-website.com/wordpress/shows/show-slug/episodes
它只是将我重定向到:

http://my-website.com/wordpress/shows/show-slug/
并从查询中删除该项。我发现this Stack Exchange question 这看起来很相似,但我无法用那里的答案解决我的问题。

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

可能您没有使用正确的挂钩或正确的重写规则。您正在重写到pagename, 这是用于页面的。您应该使用name 通过slug获得帖子。

add_filter(\'query_vars\', \'cyb_add_query_vars\');
function cyb_add_query_vars( $vars) {
   $vars[] = "item";
   return $vars;
}
add_action(\'init\',\'cyb_add_rewrite_rules\');
function cyb_add_rewrite_rules() {
    add_rewrite_rule( \'\'^shows/([^/]+)/([^/]+)/?$\'\' , \'index.php?post_type=shows&name=$matches[1]&item=$matches[2]\' , \'top\' );
}
您还可以添加端点并使用URL,如http://my-website.com/wordpress/shows/show-slug/item/episodes:

add_action(\'init\',\'cyb_add_endpoint\');
function cyb_add_endpoint() {
    add_rewrite_endpoint( \'item\', EP_PERMALINK );
}
别忘了刷新rewirte规则。如果不想对刷新进行编码,请访问wp admin区域中的permalink设置页面,单击save,重写规则将被刷新。

相关推荐

WordPress URLs without posts

我们正在开发基于WordPress的更大系统,但WordPress只用于“静态”内容,系统的主要部分应该是使用外部API和显示数据。我的观点是:我是否能够告诉URL重写不要对某些URL使用WordPress内部系统,而使用其他系统?E、 g。mysite.com/news/news-title 会显示帖子,但是mysite.com/customcontent/anotherlink 将调用某种机制从API加载数据并显示它。我不知道WordPress是否能做到这一点。。谢谢你的观点。