カスタムルートを設定し、そのURLのテンプレートファイルを読み込むプラグインを作成しました。 WordPressがテンプレートを正しくレンダリングしているにも関わらず404だと思われることを除けば、すべてうまくいきます。
たとえば、ドキュメントのタイトルに404と表示され、error404
クラスが<body>
に追加されます。
カスタムURLはdomain.com/path/:idです。ここで:id
は投稿IDに対応する動的な値なので、URLはdomain.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();
私はここに何かが足りないのですか?それとも他の場所でこのバグを探し始めるべきですか?
手動で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 );
誰かがより良い方法を知っているなら私に知らせてください。