私はここ数時間の間答えを探していましたが、正しい方向に私を指し示すものを見つけることができませんでした。いくつかのアドバイスは大歓迎です!
'stores'
'query_vars'
フィルタフックを使用したパブリッククエリvar:'state'
。stores/state/([^/]+)/?$
index.php?post_type=stores&state=$matches[1]
'state'
はカスタムメタフィールドなので、アーカイブページで一致するstores
のみを表示するためにすべてのクエリマジックを行う(pre_get_posts
を作成する)ためにmeta_query
アクションフックにフックする関数を追加しました。すべてうまくいっています。
それで私がwww.myurl.com/stores/state/austria
を入力するならば、私のアーカイブページはオーストリアの店だけを示しています。
URLだけではなくストアをフィルタリングするために、アーカイブページにはそれらをフィルタリングするためのフォームが含まれています。これが私が私の問題に遭遇するところです:フォームは明らかにPOSTまたはGETデータのみを渡します。次のように:
www.myurl.com/stores/?state=austria
pre_get_posts
フィルタ関数にチェックを追加することでこれに対処できます。
if( isset( $_REQUEST['state'] ) || $query->get('state') != "" ) {
しかし、wordpressに書き換えられたURLに自動的にリダイレクトさせたいので、これは少し汚れています。
www.myurl.com/stores/?state=austria
にリダイレクトする必要があります
www.myurl.com/stores/state/austria
私がページまたは投稿IDを入力し、それがパーマリンクにリダイレクトした場合にも同じ方法が行われます。
私はまだ発見していない別のアクションフックはありますか?どうすればWordpressを自動的にかわいいパーマリンクにリダイレクトさせることができますか?
あらゆるヒントをありがとう。
私は自分で解決策を考え出しました。 JavaScriptは必要ありません。別のテンプレート機能のみです。 URLの作成は手動で行われました。
アイデアはフック 'template_redirect'を使用し、要求されたページが対応するストアアーカイブページであるかどうかを確認し、そしてそこに$ _REQUEST変数を確認して新しいURLを構築することです。最後にこのURLにリダイレクトしてください。
function my_template_redirect() {
if ( is_post_type_archive( 'stores' ) ) {
if ( isset( $_REQUEST['state'] ) ) {
$myurl = get_post_type_archive_link( 'stores' );
if (substr($myurl, -1) != "/") $myurl .= "/";
$myurl .= "state/";
$myurl .= trim( sanitize_title_for_query( $_REQUEST['state'] ) ) . "/";
exit( wp_redirect( $myurl ) ) ;
}
}
}
add_action( 'template_redirect', 'my_template_redirect' );
かなりうまくいきます。任意の修正/より良いアイデアはもちろん歓迎です。
たぶん、これは最善の解決策でもなければ、あなたが探している解決策でもありません。しかし、これは私の頭に浮かんだ、誰かがあなたに別のものを与えるかもしれません。
私はあなたがこのようなものを持っていることをページフォームに思います:
<select name="state">
<option value="austria">Austria</option>
...
</select>
Javascriptを使用すると、ユーザーをかわいいURLに簡単に送信できます。
(私はここにjavascriptを置きます、あなたはそれを別々のjsファイルに入れてwp_enqueue_script
でそれを確実に入れます)
未テスト:
jQuery().ready(function($) {
$('select[name="state"]').change(function(e){
e.preventDefault();
var state = $(this).children('option:selected').val();
window.location.href = window.location.href + '/' + state;
});
});