web-dev-qa-db-ja.com

カスタムの投稿タイプの投稿ではなく、ページに対して書き換え規則が機能するのはなぜですか。

更新:カスタム書き換えルールが子/親ページ/投稿で使用されている場合、カスタム書き換えルールが上書きされ、パラメータ変数が削除されることがあります。私のカスタム書き換えルールの投稿は、子/親ではなく、カスタム投稿タイプの一部です。これは同様の書き換えの問題(パラメータ変数の削除)を引き起こしているのでしょうか?

アップデート2(問題解決):上記のアップデートで述べたように、カスタム投稿タイプの投稿の書き換え規則に関するものであるという事実が、実際に問題を引き起こしていました。解決策については 私の答え を見てください。

私の質問

以下のコードを使用すると、IDが160の投稿に正しくつながるので、実際の投稿の書き換えはうまくいくようです。そしてそれはかわいいパラメータURLを使っているときでさえこれをします。しかし、可愛らしいパラメータURLがID 160の投稿にリダイレクトされると、すべてのパラメータ値は削除されます。

かわいいパラメータのURLを使用しているときに、カスタムパラメータを削除しないようにWPを取得する方法を教えてください。

そのため、URLは次のようになります。

site.com/post/parameter-value/

次のように(ID 160の投稿に)リダイレクトする必要があります。

site.com/custom-post-type-slug/post-title-of-160/parameter-value/(パラメータ値は削除されません)

私が使っているコード

function add_custom_query_vars($vars) {
    $vars[] = 'member_view';
    return $vars;
}
add_filter('query_vars', 'add_custom_query_vars');

function add_rewrite_rules($rules) {
$newrules = array('page/([^/]+)/?$' => 'index.php?page_id=158&member_view=$matches[1]',
                  'post/([^/]+)/?$' => 'index.php?p=160&member_view=$matches[1]');
$rules = $newrules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

詳細

上記のコードを使用して、URLをきれいなURLに書き換え、きれいなカスタムパラメータ値で終わります。これが機能するものと機能しないものがあります。

Pagesの場合(これは動作します)

ページの書き換え規則は機能します。のようなURL:

site.com/page/parameter-value/

次のように(ID 158のページに)リダイレクトします。

site.com/page-title-of-158/parameter-value/

そしてget_query_var('member_view')parameter-valueを返します。

投稿用(見栄えの悪いURLを使用)(これは動作します)

投稿の場合、パラメータは「かわいらしい」URLを使用した場合にのみ固定されます。

site.com/?p=160&member_view=parameter-value

または

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

両方とも次のように(ID 160の投稿に)リダイレクトします。

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

そしてmember_viewの値を取得することができます。

投稿の場合(かわいいURLを使用)(これは機能しません)

プリティパラメータURLを使用する場合、カスタムパラメータはcanonical.phpリダイレクトプロセスが完了した後に削除されます。そのため、URLは次のようになります。

site.com/post/parameter-value/

次のように(ID 160の投稿に)リダイレクトします。

site.com/custom-post-type-slug/post-title-of-160/(パラメータ値はなくなりました)

そしてget_query_var('member_view')$_GET['member_view']はどちらも何も返しません。

1
Ralph

まあ、私は解決策を見つけました。カスタム投稿タイプの投稿に書き換えルールを適用する場合、書き換えルール自体の中でWPカスタム投稿タイプの名前を指定する必要があるようです。

これはNOTが機能するコードです(書き換えの代わりにパラメータ変数をリダイレクトしてドロップします)。

function add_rewrite_rules($rules) {
    $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&member_view=$matches[2]');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

これはを動作させる(パラメータ変数を書き換えて保持する)コードです。

function add_rewrite_rules($rules) {
    $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&post_type=cpt_name&member_view=$matches[2]');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

&post_type=cpt_nameがその規則に追加されたら、書き換えはうまくいきました。私が見つけて読んだ(そして2日間検索した)書き換えルール関連の情報の中でこれが明示的に指摘されていなかった、または明らかにされていなかったことに驚きました:)

次のようなURL

site.com/cpt-slug/INSERT-ID-OF-CPT-POST/INSERT-PARAMETER-VARIABLE/

正しく書き直され、パラメータ変数は削除されません。パラメータ変数はget_query_var('member_view')を使って取得できるようになりました。

1
Ralph

add_rewrite_tag関数を探します。書き換えの際に変数に追いつくには、タグを追加する必要があります。またはドロップされます

あなたの場合は、これでうまくいくはずです。

add_rewrite_tag( '%ps-cpt-parameter%', '([^/]+)');
add_rewrite_rule('post/([^/]+)/([^/]+)/?', 'index.php?p=$matches[1]&ps-cpt-parameter=$matches[2]', 'top' );

// And then you could get the variable with

get_query_var('ps-cpt-parameter');

ちなみに、add_rewrite_ruleを使うと、あなたがあなたのカスタム書き換え規則が他のどの規則の前でも後でも欲しいかどうかを設定することができます

0
PotterSys