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%', '([^/]+)' );
mycustomvar
がquery_vars
フィルタを介して私のカスタムクエリ変数に追加されていることを確認する
(そして、私はページ名の有無にかかわらず、そしてpage
の代わりにpagename
またはname
を使って、いろいろな組み合わせを試してみました。
さて、最初に適切なクエリ変数についての明確な説明を得ましょう。
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
になります。
kindがname
を持つメインクエリで機能するのは、元のリクエストが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' );
を入力すると値が出力されます。
UGH私は(おそらく)それを考え出した。変数に名前を付ける必要はありませんでした。場所だけです。
だから私の書き換えルールをこれに変更するとうまくいきました:
add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?pagename=mypage&$matches[1]', 'top' );
今すぐ私のページは正しくURLをロードします:
http://example.com/mypage/someword
それにもかかわらず、私は変数someword
を読んでそれを使って何かをするためのURL配置以外に方法はありません。名....