web-dev-qa-db-ja.com

書き換え後にクエリ変数が削除された

私は WCKプラグイン を使用して作成しているカスタム投稿タイプを使用するWordPressブログを持っています。そのうちの1つが投稿タイプです。特定の番組へのパーマリンクは、次のようになります。

http://my-website.com/wordpress/shows/show-slug/

これはすべてWPの現在の機能とWCKプラグインを通して行われます。しかし、私はその単一のショーページに表示される詳細情報の別の「レベル」を追加しようとしています。これを指定するために、URLクエリ変数itemを使用しています。

たとえば、ある番組のエピソードのリストを表示したい場合は、次のURLにアクセスしてください。

http://my-website.com/wordpress/shows/show-slug/?item=episodes

これらの "アイテム"はショーごとに異なり、多少恣意的ですが、URLクエリで提供されたアイテムがそのショーに有効かどうかを判断するためのsingle-shows.phpテンプレートのロジックがすでにあります。

とにかく、書き換え機能を使用して、URLをもう少し見やすくします。形式は次のとおりです。

http://my-website.com/wordpress/shows/show-slug/episodes

これが私が問題にぶつかっているところです。これは私のテーマのfunctions.phpファイルにある、そのURLクエリvarと書き換えルールを登録するための私のPHPスクリプトです:

function shows_item_tag_registration() {
    global $wp; 
    $wp->add_query_var('item'); 
}

function shows_item_rule_registration($rules) {
    $newrules = array();
    $newrules['^shows/([^/]+)/([^/]+)/?$'] = 'index.php?pagename=shows/$matches[1]&item=$matches[2]';
    return $newrules + $rules;
}

add_filter( 'rewrite_rules_array','shows_item_rule_registration' );
add_action( 'init','shows_item_tag_registration' );

WP AdminのPermalinks設定によって書き込まれたルールを失いたくないので、私は自分自身で書き換えルールをフラッシュすることはしません。代わりに、ご覧のとおり、rewrite_rules_arrayフィルタの「現在のリスト」に自分のルールを追加しています。変更を適用するために、私はWP adminのパーマリンク設定を再保存します、そしてそれはそれに関する限りトリックをしているようです。

イライラして、それはほとんどうまくいきます、しかし、私が最後のアイテムでURLを訪問しようとするとき、そのように:

http://my-website.com/wordpress/shows/show-slug/episodes

それは単に私にリダイレクトします。

http://my-website.com/wordpress/shows/show-slug/

そして、クエリからアイテムを完全に削除します。私は このStack Exchangeの質問 がかなり似ているように見えましたが、そこからの答えで私の問題を解決することはできませんでした。

1
William Thomas

たぶんあなたは正しいフックも正しい書き換え規則も使っていません。ページ用のpagenameに書き換えています。 slugで投稿するにはnameを使うべきです。

add_filter('query_vars', 'cyb_add_query_vars');
function cyb_add_query_vars( $vars) {
   $vars[] = "item";
   return $vars;
}
add_action('init','cyb_add_rewrite_rules');
function cyb_add_rewrite_rules() {
    add_rewrite_rule( ''^shows/([^/]+)/([^/]+)/?$'' , 'index.php?post_type=shows&name=$matches[1]&item=$matches[2]' , 'top' );
}

エンドポイントを追加してhttp://my-website.com/wordpress/shows/show-slug/item/episodesのようなURLを使用することもできます。

add_action('init','cyb_add_endpoint');
function cyb_add_endpoint() {
    add_rewrite_endpoint( 'item', EP_PERMALINK );
}

そしてrewirteのルールをフラッシュすることを忘れないでください。フラッシュをコーディングしたくない場合は、wp-admin領域のパーマリンク設定ページにアクセスし、保存をクリックすると書き換えルールがフラッシュされます。

2
cybmeta