我创建了一个插件,用于设置自定义路由,然后加载该url的模板文件。一切正常,除了WordPress似乎认为它是404,尽管它正确地呈现了我的模板。
例如,文档标题中显示404error404
类添加到<body>
自定义url为域。com/path/:id其中:id
是与帖子id相对应的动态值,因此URL可以是域。com/path/275。在下面的示例中some_id
用作post id变量。
以下是我的插件的简化版本:
<?php
class MyPlugin {
public function __construct() {
add_action( \'init\', array($this, \'add_response_endpoint\') );
add_filter( \'template_include\', array($this, \'add_response_template\') );
}
public function add_response_endpoint() {
add_rewrite_rule(
\'^path/([0-9]+)/?\',
\'index.php?pagename=my_custom_url&some_id=$matches[1]\',
\'top\'
);
add_rewrite_tag(\'%some_id%\', \'([^&]+)\');
}
public function add_response_template($template) {
if ( get_query_var( \'pagename\' ) === \'my_custom_url\' ) {
$template = trailingslashit( dirname( __FILE__ ) ) . \'templates/custom-page-template.php\';
}
return $template;
}
}
new MyPlugin();
我错过什么了吗?或者我应该开始在其他地方寻找这个bug?
最合适的回答,由SO网友:Ahrengot 整理而成
手动设置is_404 = false;
修复了我的问题。然而,我不确定这是最好的方法。我试着用pre_get_posts
过滤,而不是没有任何运气。
无论如何,对于同一条船上的任何其他人,你可以这样做来摆脱404状态:
public function add_response_template($template) {
global $wp_query;
if ( \'my_custom_url\' === get_query_var( \'pagename\' ) ) {
$wp_query->is_404 = false;
$template = trailingslashit( dirname( __FILE__ ) ) . \'templates/custom-page-template.php\';
}
return $template;
}
以及更新文档标题(其中的内容
<title>
在
<head>
(第节)这里有一个代码片段,可以让它很好地工作。
add_filter( \'document_title_parts\', function($title_arr) {
if ( \'my_custom_url\' === get_query_var(\'pagename\') ) {
$title_arr[\'title\'] = "Document title for my custom route";
}
return $title_arr;
}, 10, 1 );
如果有人知道更好的方法,请告诉我。