重写加载自定义模板文件,但is_home()返回TRUE,并且没有404

时间:2011-11-21 作者:deadlyhifi

我想为我的主题创建一些自定义页面,这些页面不会出现在wp admin的页面列表中。

我有一个截取url的类。

class jtvRewrite {

var $path = \'\';

function __construct($path) {

    $this->path = $path;

    register_activation_hook( __file__, array($this, \'activate\') );

    // Write rules -> Add query vars -> Recalculate rewrite rules
    add_filter(\'rewrite_rules_array\', array($this, \'create_rewrite_rules\'));
    add_filter(\'query_vars\',array($this, \'add_query_vars\'));

    add_filter(\'admin_init\', array($this, \'flush_rewrite_rules\'));
    add_action(\'template_redirect\', array($this, \'template_redirect_intercept\') );
}

function activate() {
    global $wp_rewrite;
    $this->flush_rewrite_rules();
}

function create_rewrite_rules($rules) {
    global $wp_rewrite;
    $newRule = array($this->path . \'/(.+)\' => \'index.php?\' . $this->path . \'=\'.$wp_rewrite->preg_index(1));
    $newRules = $newRule + $rules;
    return $newRules;
}

function add_query_vars($qvars) {
    $qvars[] = $this->path;
    return $qvars;
}

function flush_rewrite_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

function template_redirect_intercept() {
    global $wp_query;
    if ($wp_query->get($this->path)) {
        $this->output($wp_query->get($this->path));
        exit;
    }
}

function output( $output ) {
    global $wp_query;

    if (file_exists( TEMPLATEPATH . \'/\' . $this->path . \'/\' . $output . \'.php\' )) {
        include( TEMPLATEPATH . \'/\' . $this->path . \'/\' . $output . \'.php\' );
        exit;
    } else {
        return $wp_query->is_404();
    }
}

}
$member = new jtvRewrite(\'member\');
但是,如果我跑步is_home() 在此页上,它返回true。这是有道理的,因为重写的背后是/index.php?member=profile.

有什么东西我可以扔进去让它不在家吗?原因是我有另一个功能,可以在is_home().

其次,我有return $wp_query->is_404(); 如果主题文件不可用(即页面不存在),但在不存在的url上,只返回一个空白页面(WP\\u DEBUG true不返回任何内容)。

知道如何正确发送404吗?

使用解决方案编辑:

奥托建议加上$wp_query->is_home = falsetemplate_redirect_intercept() - 这很管用。然后我做了output 根据最初请求的路径检查函数是否存在。如果该函数存在(见下文),它将调用它。该函数提供重定向。如果没有设置404。

这样我就可以使用class jtvRewrite 对于我添加的每个新模板文件,我都很喜欢。

function template_redirect_intercept() {
    global $wp_query;
    if ($wp_query->get($this->path)) {
        $wp_query->is_home = false; // set is_home parameter to false

        if (! $this->output($wp_query->get($this->path)))
            $wp_query->set_404();
    }
}

function output( $output ) {
    global $wp_query;

    $function = \'jtv_rewrite_action_\' . $this->path . \'_\' . $output;

    if (function_exists($function)) {
        $function();
        exit;
    } else {
        return false;
    }
}
然后,我可以使用以下功能启动到正确的模板文件:

$member = new jtvRewrite(\'member\');

/**
 * Provide the theme template file
 */
function jtv_rewrite_action_member_profile() {

include( TEMPLATEPATH . \'/member/profile.php\' );

}

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

条件变量基于主页查询($wp\\U查询)。如果希望is\\u home()为false,则需要手动将其设置为false($wp\\u query->is\\u home=false)或重写主查询,使其不再为true。您可能会在那里的template\\u redirect\\u intercept函数中这样做,或者在使用query\\u posts()创建的单个页面模板中这样做。

对于第二个问题,您有两个主要问题。

template\\u redirect\\u intercept正在不分青红皂白地退出。它不关心输出函数调用的返回值是什么。

返回“is\\U 404”的结果可能没有用,因为主查询认为它返回的是主页,而不是404。这里要做的是调用$wp\\u query->set\\u 404(),如果该页面不存在,则返回将导致template\\u redirect\\u intercept转到not退出的内容。在这种情况下,您希望该函数返回,从而允许正常的404处理程序接管。

结束

相关推荐