添加_查询_变量和规范链接

时间:2012-09-08 作者:Kenny Scott

我有两页,一页叫做城市,另一页叫做州。他们使用add\\u query\\u vars函数从数据库中获取城市和/或州。页面加载良好。例如,当某人转到sitename时。com/roller derbies/arizona/florence/以及该城市的活动展示。但当我查看页面源代码并查看插入到wp head中的规范链接时,它会显示sitename。com/城市或网站名。com/states位于页面名称之后。这就产生了一个问题,我的所有页面都没有被google索引,因为它们都指向城市或州的规范链接。如何使规范链接与url匹配?

下面是我正在使用的代码。

add_filter(\'query_vars\', \'add_query_vars\');
function add_query_vars($aVars) {
    $aVars[] .= \'var_state\';
    $aVars[] .= \'var_city\';
    return $aVars;
}

add_filter(\'rewrite_rules_array\', \'add_rewrite_rules\');
function add_rewrite_rules($aRules) {
    $aNewRules = array(
    \'roller-derbies/([^/]+)/?$\' => \'index.php?pagename=states&var_state=$matches[1]\', 
    \'roller-derbies/([^/]+)/([^/]+)/?$\' => \'index.php?pagename=cities&var_state=$matches[1]&var_city=$matches[2]\', 
    $aRules = $aNewRules + $aRules;
    return $aRules;
}

1 个回复
SO网友:chrisguitarguy

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.

结束

相关推荐

Permalinks Won't Work

由于某种原因,永久物不会起作用。我单击选项3的单选按钮,然后单击保存,但它会返回到选项1。发生什么事了?(这不应该是FTP问题-它有本地主机访问数据库的权限,我可以在Wordpress fine中下载插件。)