我想为我的主题创建一些自定义页面,这些页面不会出现在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 = false
到template_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\' );
}