WordPress认为你在这些页面上是因为pagename
在重写规则中查询var。
你的旅程将从wp-includes/default-filters.php
, 每一位WP开发人员都应该知道并热爱这一点:WordPress care在这里使用自己的插件API来连接和更改内容。
您的问题:
<?php
add_action( \'wp_head\', \'rel_canonical\' );
如果您查看
wp-includes/link-template.php
您会发现:
<?php
/**
* Output rel=canonical for singular queries.
*
* @package WordPress
* @since 2.9.0
*/
function rel_canonical() {
if ( !is_singular() )
return;
global $wp_the_query;
if ( !$id = $wp_the_query->get_queried_object_id() )
return;
$link = get_permalink( $id );
if ( $page = get_query_var(\'cpage\') )
$link = get_comments_pagenum_link( $page );
echo "<link rel=\'canonical\' href=\'$link\' />\\n";
}
遗憾的是,没有用于修改链接的筛选器。所以你需要做的是在晚些时候,但在之前
wp_head
激发,检查查询变量,取消挂钩
rel_canonical
功能和滚动您自己的。
第一步,稍微整理一下重写内容:
<?php
add_action(\'init\', \'wpse64535_add_rewrite_rules\');
function wpse64535_add_rewrite_rules()
{
add_rewrite_rule(
\'^roller-derbies/([^/]+)/?$\',
\'index.php?pagename=states&var_state=$matches[1]\',
\'top\'
);
add_rewrite_rule(
\'^roller-derbies/([^/]+)/([^/]+)/?$\',
\'index.php?pagename=cities&var_state=$matches[1]&var_city=$matches[2]\',
\'top\'
);
}
add_filter(\'query_vars\', \'wpse64535_add_query_vars\');
function wpse64535_add_query_vars($vars)
{
$vars[] = \'var_state\';
$vars[] = \'var_city\';
return $vars;
}
第二部分,钩入
template_redirect
并检查自定义查询变量。如果找到其中一个,请删除默认值
rel_canonical
功能和使用您自己的。
<?php
add_action(\'template_redirect\', \'wpse64535_maybe_fix\');
function wpse64535_maybe_fix()
{
if(get_query_var(\'var_state\') || get_query_var(\'var_city\'))
{
remove_action(\'wp_head\', \'rel_canonical\');
add_action(\'wp_head\', \'wpse64535_fix_canonical\');
}
}
function wpse64535_fix_canonical()
{
$link = home_url(\'roller-derbies/\');
// might want to validate these before just using them?
if($state = get_query_var(\'var_state\'))
$link .= "{$state}/";
if($city = get_query_var(\'var_city\'))
$link .= "{$city}/";
echo \'<link rel="canonical" href="\' . esc_url($link) . \'" />\';
}
以上所有内容
as a plugin.