web-dev-qa-db-ja.com

add_rewrite_ruleがページvarに対して機能しない

mypageというページとmycustomvarというカスタムクエリvarがあります。次のURLを書き換えようとしています。

http://example.com/index.php?name=mypage&mycustomvar=someword

http://example.com/mypage/someword

使う

add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?name=mypage&mycustomvar=$matches[1]', 'top' );

しかし、私が得るのは以下のとおりです。

http://example.com/mypage/?mycustomvar=someword

uRLに表示されます。私も両方を追加してみました

add_rewrite_tag( '%mycustomvar%', '([^/]+)' );

mycustomvarquery_varsフィルタを介して私のカスタムクエリ変数に追加されていることを確認する

(そして、私はページ名の有無にかかわらず、そしてpageの代わりにpagenameまたはnameを使って、いろいろな組み合わせを試してみました。

3
Stephen

さて、最初に適切なクエリ変数についての明確な説明を得ましょう。

WP_Query codexページの PostおよびPage parameters を参照してください。

name(文字列) - ポストスラッグを使う。

pagename(文字列) - ページスラッグを使用します。

これはWP_Queryで確認できます。

$args = array(
    'name' => 'mypage'
);
$mypage = new WP_Query( $args );

echo '<pre>';
print_r( $mypage );
echo '</pre>';

どれが生成されます:

SELECT wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_name = 'mypage'
AND wp_posts.post_type = 'post'
ORDER BY wp_posts.post_date DESC

mypage投稿タイプでpostスラッグを探しています。これをpagenameに変更すると、ポストタイプpageになります。

kindnameを持つメインクエリで機能するのは、元のリクエストが404のときに開始される redirect_guess_404_permalink 関数が原因です。最も近いものを見つけるために別のクエリを実行します。何かが見つかった場合は、そこにリダイレクトしてください。これにより、余分なパラメータがURLから削除されます。

階層型投稿タイプで注意すべき重要なことの1つ - 自分のページが別のページの子である場合は、親が異なれば同じスラッグを持つ子を持つことができるので、pagename query varをparent/childパスで設定する必要があります。

質問に関しては、クエリvarをpagenameに変更すると、v4.7.2の元のコードとTwenty Sixteenテーマで動作します。

function wpd_mypage_rewrite() {
    add_rewrite_tag(
        '%mycustomvar%',
        '([^/]+)'
    );
    add_rewrite_rule(
        '^mypage/([^/]+)/?',
        'index.php?pagename=mypage&mycustomvar=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wpd_mypage_rewrite' );

ここではadd_rewrite_tagを使用したことに注意してください。代わりにquery_vars filter )を使うこともできます。 add_rewrite_tagが機能するのは、同じフィルタを介して内部的にクエリvarを追加するためです。

ルールを追加/変更した後は、 フラッシュ書き換えルール を忘れないでください。また、設定>パーマリンクページにアクセスしてこれを行うことができます。

テンプレートにecho get_query_var( 'mycustomvar' );を入力すると値が出力されます。

2
Milo

UGH私は(おそらく)それを考え出した。変数に名前を付ける必要はありませんでした。場所だけです。

だから私の書き換えルールをこれに変更するとうまくいきました:

add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?pagename=mypage&$matches[1]', 'top' );

今すぐ私のページは正しくURLをロードします:

http://example.com/mypage/someword

それにもかかわらず、私は変数somewordを読んでそれを使って何かをするためのURL配置以外に方法はありません。名....

0
Stephen