web-dev-qa-db-ja.com

Add_query_varを使ったきれいなURL

私のサイトの各投稿に「サブ投稿」を追加しようとしています。

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%パーマリンク構造を使用しているのでその構造とサイトのページ。

4
Adam Dempsey
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

参考文献:

6
Tom J Nowell