web-dev-qa-db-fra.com

add_rewrite_rule () vs $ wp_rewrite-> règles vs 'rewrite_rules_array'?

J'ai écrit les règles de réécriture pour mes types d'articles personnalisés. ils fonctionnent bien, sauf que WP ne met pas à jour l'URL de l'agent d'utilisateur lorsque le paramètre redirect_url ne correspond pas à request_url.

tout le reste fonctionne très bien, y compris mes permavancements personnalisés ('post_type_link') et les options de modèles personnalisés ('modèle unique').

mes règles:

// 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' );
}

Je me demandais quelles étaient les différences entre l'utilisation de add_rewrite_rule (), l'ajout direct de règles à $ wp_rewrite-> rules et le raccordement à rewrite_rules_array? Y a-t-il des différences? L'une des alternatives obligerait-elle WP à mettre à jour l'URL dans l'agent d'utilisateur lorsque le permalien de la publication ciblée diffère de l'URL demandée?

un exemple d'URL non mise à jour ... L'album et les posts de piste sont liés par un terme de taxonomie commun. le crochet dans 'post_type_link' pour les pistes trouve l'album lié et insère son slug dans le permalien. les règles de réécriture ci-dessus garantissent que les permastructs nouveaux et traditionnels fonctionnent, mais demander cette URL /album/serenity/track--beetle-attack/ trouvera la publication mais ne mettra pas à jour l'URL à /album--serenity/track--beetle-attack/.

il est peu probable que quiconque utilise les permastructs traditionnels, car je ne les publierai pas sur mon site, mais ce serait un plus pour Nice de voir les URL mises à jour de toute façon dans l'agent utilisateur, si possible.

à votre santé,
Gregory

6
Gregory

Tout d’abord, utilisez add_rewrite_rule() pour déconner directement avec $wp_rewrite->rules si possible. Ce dernier est un peu bas.

En ce qui concerne "l'URL ne met pas à jour" - ce n'est pas le travail des règles de réécriture. Ces URL pointent simplement vers leur contenu, mais elles ne mettent pas à jour la barre d'adresse de l'utilisateur.

Le fichier responsable est /wp-includes/canonical.php . En particulier, la fonction redirect_canonical() est liée à template_redirect.

Cette redirect_canonical() a son propre filtre:

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