web-dev-qa-db-ja.com

add_rewrite_rule()vs $ wp_rewrite-> rules vs 'rewrite_rules_array'?

カスタム投稿タイプの書き換えルールを書きました。 redirect_urlがrequested_urlと一致しない場合、WPがユーザーエージェントのURLを更新しないことを除けば、これらはうまく機能します。

私のカスタムのpermastructs( 'post_type_link')とカスタムのテンプレートオプション( 'single-template')を含め、他のすべてはうまくいきます。

私のルール:

// custom URL rewrite for Album posts
add_action( 'init', 'gregory_rewrite_album_link' );
function gregory_rewrite_album_link()
{
    // album--%album_slug%/ OR album/%album_slug%/
    // preferred permastruct: album--%album_slug%/
    add_rewrite_rule(
        '^album(/|--)([^/]+)/?$',
        'index.php?post_type=gregory-cpt-album&name=$matches[2]',
        'top' );
}

// custom URL rewrite for Track posts
add_action( 'init', 'gregory_rewrite_track_link' );
function gregory_rewrite_track_link()
{
    // accepts and rewrites the following permutations:
    // where album would be: album--%album_slug% OR album/%album_slug%
    // where track would be: track--%track_slug% OR track/%track_slug%
    // preferred permastruct: album--%album_slug%/track--%track_slug%/
    add_rewrite_rule(
        '^(album(/|--)[^/]+/)?track(/|--)([^/]+)/?$',
        'index.php?post_type=gregory-cpt-track&name=$matches[4]',
        'top' );
}

私はadd_rewrite_rule()を使用すること、$ wp_rewrite-> rulesに直接規則を追加すること、そしてrewrite_rules_arrayにフックすることの違いは何だろうかと思いましたか?違いはありますか?ターゲットの投稿のパーマリンクが要求されたURLと異なる場合、代替の1つはWPにユーザーエージェントのURLを更新させるでしょうか?

更新されていないURLの1つの例...アルバムとトラックの投稿が相互分類用語によってリンクされています。トラックの 'post_type_link'へのフックはリンクされたアルバムを見つけてそのスラッグをパーマリンクに挿入します。上記の書き換え規則は、新しいpermatructsと従来のpermastructsの両方が動作することを確認しますが、このURL /album/serenity/track--beetle-attack/を要求すると投稿は見つかりますが、URLを/album--serenity/track--beetle-attack/に更新することはできません。

私がそれらを宣伝したり私のサイトでそれらを使用したりしないので、だれもが伝統的なpermastructsを使用することはありそうもありませんが、URLがユーザーエージェントで更新されるのを見るのは可能であれば素晴らしい追加です。

乾杯、
グレゴリー

6
Gregory

まず第一に、可能であれば$wp_rewrite->rulesで直接めちゃくちゃになるよりadd_rewrite_rule()を使用してください。後者は少し低レベルです。

'url not updated'に関して - これは書き換えルールの仕事ではありません。これらは単にURLをそのコンテンツに向けるだけですが、ユーザーのアドレスバーは更新しません。

これを担当するファイルは /wp-includes/canonical.php です。特に、関数redirect_canonical()template_redirectにフックされています。

このredirect_canonical()には独自のフィルタがあります。

add_filter('redirect_canonical', 'wpse50912_redirect_canonical',10,2)
function wpse50912_redirect_canonical($redirect_url, $requested_url){

     //Do stuff - determine if url is requesting album/track and check
     //If it is, check it is using the new structure. 
     //Return the url you want in the address bar.

     return $redirect_url;
}
5
Stephen Harris