添加_重写_规则和模板重定向不起作用

时间:2012-06-16 作者:Paul Dumitru

我有以下几对:

add_rewrite_rule(\'^questions/ask/?\',\'index.php?pagename=ask\',\'top\');
if(is_page(\'ask\')){
        $tname = \'add-question.php\';
        if(file_exists(TEMPLATEPATH.\'/\'.$tname)){
            $returntemplate = TEMPLATEPATH.\'/\'.$tname;
        }else{
            $returntemplate = $plugindir.\'/default-template/\'.$tname;
        }
        ahaali_do_theme_redirect($returntemplate);
以及:

add_rewrite_rule(\'^questions/ed/([^/]*)/?\',\'index.php?pagename=ed&id=$matches[1]\',\'top\');
if(is_page(\'ed\')){
            $tname = \'edit-question.php\';
            if(file_exists(TEMPLATEPATH.\'/\'.$tname)){
                $returntemplate = TEMPLATEPATH.\'/\'.$tname;
            }else{
                $returntemplate = $plugindir.\'/default-template/\'.$tname;
            }
            ahaali_do_theme_redirect($returntemplate);
        }
现在发生的情况如下:第一个规则和模板重定向有效,而第二个规则和模板重定向无效。我在主题的标题中添加了

print_r($wp->query_vars); 
结果是:

Array ( [pagename] => ed [id] => 10 ) 
因此,规则本身起作用,但模板重定向不起作用。知道为什么吗?

2 个回复
SO网友:Milo

据我回忆,如果一个页面是另一个页面的子页面,那么pagename值就是完整的父/子路径。在你的例子中pagename=questions/askpagename=questions/ed, 虽然你说第一条规则有效,但这令人费解。

还有,旁注-有一个locate_template 正确处理父/子主题的函数。

SO网友:Gembel Intelek

也许您需要添加自己的query\\u var来获得工作

// Add query_var
function add_question_var($question_vars) {
    $question_vars[] = \'ed\';    
    return $question_vars;
}
//add a rewrite rule
function do_rewrite_question() {
    global $wp_rewrite;
    add_rewrite_rule(\'question/ask/?$\', \'index.php?pagename=ask\',\'top\');
    add_rewrite_rule(\'question/ed/(.+)/?$\', \'index.php?pagename=question&ed=$matches[1]\',\'top\');    
}
function template_redirect_file()
{
    global $wp_query;
    if ( get_query_var(\'pagename\')==\'ask\')
    {
    // Do your stuff
    }
    if ( $wp_query->get(\'ed\'))
    {
    // Do your stuff
    }   

}
// redirect_canonical
function noredir($redirect_url)
{
    $vars = array (
    \'ed\' => get_query_var(\'ed\'),    
    );
    if (!empty($vars))
    return false;
}


add_filter(\'query_vars\', \'add_question_var\');
add_action(\'init\', \'do_rewrite_question\');
add_action(\'template_redirect\', \'template_redirect_file\');
add_filter(\'redirect_canonical\', \'noredir\');
那你应该update the permalink 通过wp admin/options permalink。phpto测试重写工作,将此代码添加到add-question.php

<?php
if(isset($wp_query->query_vars[\'pagename\'])) {
    echo urldecode($wp_query->query_vars[\'pagename\']);
}
?>
并且在edit-question.php

<?php
if(isset($wp_query->query_vars[\'ed\'])) {
    echo urldecode($wp_query->query_vars[\'ed\']);
}
?>

结束