私のサイトの各投稿に「サブ投稿」を追加しようとしています。
site.com/product-one/changelog site.com/product-two/changelog site.com/product-three/changelog
これは私がatmを使っているコードです。
global $wp,$wp_rewrite;
$wp->add_query_var('sub-page');
$wp_rewrite->add_rule('([^/]+)/(changelog)','index.php?pagename=$matches[1]&sub-page=$matches[2]', 'top');
$wp_rewrite->flush_rules(false); // This should really be done in a plugin activation
Site.com/product-one?sub-page=changelogを参照しても、site.com/product-one/changelogに移動しても、site.com/product-oneにリダイレクトされているだけでは、これで問題なく動作します。
それで、私はテストとして標準的なリダイレクトを無効にしました:
remove_filter('template_redirect', 'redirect_canonical');
site.com/product-one/changelogはリダイレクトしませんが404を返し、site.com/product-one?sub-page=changelogは引き続き機能します。
これを機能させるために書き直しで変更できるものはありますか?
注:私はカスタム投稿タイプでこれを簡単に行うことができ、そのルートをたどり始めたことを知っていますが、サイトはすでに%postname%パーマリンク構造を使用しているのでその構造とサイトのページ。
add_rewrite_endpoint( 'changelog', EP_ROOT );
エンドポイントchangelog
を追加します。これをtemplate_redirect
フックで確認できます。
一致するとクエリ変数($wp_query->query
)配列はキーchangelog
を含み、/
の値の後に来るものはすべて含まれます。そのため、URL example.com/product1/changelog/5
には、値5
を持つchangelog
という名前のクエリ変数があります。
終点の後に何もなければ、変数は存在しますが、空の文字列を含みます。 query varがまったく設定されていない場合、空の文字列を返すようにハードコードされているため、get_query_var()
はそのような用途には機能しません。
単に変数が存在するかどうかをチェックし、存在する場合は、クエリフックのクエリ変数(pre_get_posts
など)を変更して、changelogテンプレートを使用して独自のサブ投稿を読み込むだけで十分な場合があります。
また、パーマリンクの異なるエンドポイントマスクを試してみることもできます。 EP_PAGES
参考文献: