web-dev-qa-db-ja.com

カスタムクエリ変数 - ニースパーマリンクのURLにリダイレクトするワードプレスを取得

私はここ数時間の間答えを探していましたが、正しい方向に私を指し示すものを見つけることができませんでした。いくつかのアドバイスは大歓迎です!

  • 私が既に持っているもの:
    • カスタム投稿タイプ'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を自動的にかわいいパーマリンクにリダイレクトさせることができますか?

あらゆるヒントをありがとう。

2
mndmkr

私は自分で解決策を考え出しました。 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' );

かなりうまくいきます。任意の修正/より良いアイデアはもちろん歓迎です。

2
mndmkr

たぶん、これは最善の解決策でもなければ、あなたが探している解決策でもありません。しかし、これは私の頭に浮かんだ、誰かがあなたに別のものを与えるかもしれません。

私はあなたがこのようなものを持っていることをページフォームに思います:

<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;
  });
});
0
gmazzap