web-dev-qa-db-fra.com

Changer la page/2 en/transcription avec une réécriture

J'ai mis en place cette règle (dans functions.php)

function custom_rewrite_basic() {
    add_rewrite_rule(
      'episode/([^/]+)/transcript', 
      'index.php?post_type=episodes&episodes=$matches[1]&page=2', 
      'top');
}
add_action('init', 'custom_rewrite_basic');

s'attendant à ce qu'il redirige www.domaine.fr/episode/postname/2/ vers www.domaine.fr/ épisode/postname/transcript/ mais il continue à afficher/2 /.

Chose intéressante, si je tape www.domain.com/episode/postname/transcript/ cela fonctionne toujours, mais effectue une redirection vers/2 /.

J'ai installé le plugin Rewrite Analyzer et cela ne me donne aucune erreur ... mon type de message est "episodes" et le slug/url est "episode"

Quelqu'un peut-il me guider s'il vous plaît? Eternellement reconnaissant ... Sarah

3
Sarah

L'API de réécriture ne redirigera pas - elle "cartographiera" simplement les structures d'URL pour interroger les chaînes - vous devrez le faire vous-même.

Tout d'abord, corrigez cette règle de réécriture:

'episode/([^/]+)/transcript'; // Matches anything that follows transcript, not what we want!
'episode/([^/]+)/transcript/?$'; // Matches only "episode/name/transcript", optionally with a trailing slash

Maintenant, apportez une fonction d'assistance:

/**
 * Get transcript URL.
 *
 * @param   int     $post_id
 * @return  string
 */
function wpse_180990_get_transcript_url( $post_id ) {
    return trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( 'transcript' );
}

Et pour effectuer la redirection:

/**
 * Force "episode/postname/2" to canonicalize as "episode/postname/transcript".
 */
function wpse_180990_redirect_transcript() {
    global $wp;

    if ( is_singular( 'episodes' ) && get_query_var( 'page' ) === 2 && $wp->matched_rule !== 'episode/([^/]+)/transcript/?$' ) {
        $url = wpse_180990_get_transcript_url( get_queried_object_id() );
        wp_redirect( $url );
        exit;
    }
}

add_action( 'template_redirect', 'wpse_180990_redirect_transcript' );

S'il s'agit de la page 2 d'un seul épisode, mais que notre réécriture personnalisée ne correspond pas à l'URI de la demande, envoyez-la en direction de /transcript.

Passons maintenant à la redirection que vous avez en ce moment (/transcript à /2). WordPress a une fonction pratique redirect_canonical(), qui tente de conserver toutes les demandes aussi "singulières" (canoniques) que possible. Le problème, c'est qu'il est parfois trop malin pour son propre bien.

Dans votre cas, il détecte que les mêmes conditions sont vraies (page 2 d'un seul épisode), mais considère simplement que la requête en cours est la "mauvaise" et redirige vers la "bonne".

Disons-lui de ne pas faire ça:

/**
 * Override {@see redirect_canonical()}.
 *
 * @see wpse_180990_force_transcript()
 *
 * @param   string  $url
 * @return  string
 */
function wpse_180990_transcript_canonical( $url ) {
    if ( is_singular( 'episodes' ) && get_query_var( 'page' ) === 2 )
        $url = wpse_180990_get_transcript_url( get_queried_object_id() );

    return $url;
}

add_filter( 'redirect_canonical', 'wpse_180990_transcript_canonical' );
4
TheDeadMedic