web-dev-qa-db-fra.com

add_rewrite_rule avec 3 correspondances ou moins?

J'ai beaucoup lu ici et sur Google concernant les règles de réécriture personnalisées dans WordPress et add_rewrite_rule. J'ai trouvé la réponse de Jan Fabry particulièrement utile, mais je suis maintenant un peu coincé.

J'utilise le code suivant pour activer 3 correspondances dans une URL,

add_action( 'init', 'wpa5413_init' );
function wpa5413_init()
{

    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'our-work/our-year/([^/]*)/([^/]*)/([^/]*)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=our-work/our-year&our_year_tax_slug=$matches[1]&our_quarter_tax_slug=$matches[2]&our_work_post_slug=$matches[3]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

add_filter( 'query_vars', 'wpa5413_query_vars' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'our_year_tax_slug';
    $query_vars[] = 'our_quarter_tax_slug';
    $query_vars[] = 'our_work_post_slug';
    return $query_vars;
}

Il est légèrement modifié par rapport à la réponse de Jan Fabry. J'utilise ([^/]*) au lieu de ([^/]+) même si j'ai constaté que cela ne change rien au résultat. Je l'utilise également sur une page enfant. J'ai donc inclus la page parent dans la correspondance des expressions rationnelles initiale et dans la valeur pagename=.

Cela fonctionne parfaitement avec les 3 valeurs spécifiées. Quand j'utilise le code suivant dans un template:

<?php 

    echo get_query_var( 'our_year_tax_slug' );
    echo "<br>";
    echo get_query_var( 'our_quarter_tax_slug' );
    echo "<br>";
    echo get_query_var( 'our_work_post_slug' );

?>

et accéder à l'URL comme test.dev/our-work/our-year/one/two/three/ Je reçois un deux trois imprimé sur la page. Le problème est que je veux aussi que test.dev/our-work/our-year/one/two/ et test.dev/our-work/our-year/one/ fonctionnent. Cependant, si j'essaie d'accéder à ces URL, je reçois un 404.

J'ai essayé d'ajouter deux autres ensembles de add_rewrite_rules, comme ceci:

add_action ('init', 'wpa5413_init'); function wpa5413_init () {// N'oubliez pas de vider les règles une fois manuellement après avoir ajouté ce code! add_rewrite_rule (// La regex correspondant à l'URL entrante 'notre-travail/notre-année/([^ /] *) /?', // l'URL interne résultante: index.php car nous utilisons toujours WordPress // pagename parce que nous utilisons cette page WordPress // designer_slug car nous affectons la première partie regex capturée à cette variable 'index.php? pagename = notre-travail/notre-année et notre_year_tax_slug = $ correspond 1 ', // Ceci est une URL assez spécifique, nous l'ajoutons donc en haut de la liste // Sinon, les règles "fourre-tout" en bas (pour les pages et les pièces jointes) "gagneront"' haut ');

    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'our-work/our-year/([^/]*)/([^/]*)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=our-work/our-year&our_year_tax_slug=$matches[1]&our_quarter_tax_slug=$matches[2]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );

    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'our-work/our-year/([^/]*)/([^/]*)/([^/]*)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=our-work/our-year&our_year_tax_slug=$matches[1]&our_quarter_tax_slug=$matches[2]&our_work_post_slug=$matches[3]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

Mais cela n'a pas fonctionné. Je ne peux maintenant accéder qu'à la première requête var (our_year_tax_slug) même si test.dev/our-work/our-year/one/two/three, test.dev/our-work/our-year/one/two/ et test.dev/our-work/our-year/one/ fonctionnent tous sans erreur 404, le code de modèle imprime uniquement la première valeur, quelle que soit l'URL utilisée.

Je suis sûr que quelqu'un a déjà rencontré ce problème avant, toute aide serait grandement appréciée. Je clique sur enregistrer des permaliens chaque fois que je mets à jour le fichier functions.php. Merci

1
patrickzdb

Eh bien, apparemment, beaucoup d'essais et d'erreurs sont payants!

J'ai utilisé ce code à la place, où j'ai inversé mon add_rewrite_rules et maintenant cela fonctionne parfaitement.

// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
    // The regex to match the incoming URL
    'our-work/our-year/([^/]*)/([^/]*)/([^/]*)/?',
    // The resulting internal URL: `index.php` because we still use WordPress
    // `pagename` because we use this WordPress page
    // `designer_slug` because we assign the first captured regex part to this variable
    'index.php?pagename=our-work/our-year&our_year_tax_slug=$matches[1]&our_quarter_tax_slug=$matches[2]&our_work_post_slug=$matches[3]',
    // This is a rather specific URL, so we add it to the top of the list
    // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
    'top' );

// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
    // The regex to match the incoming URL
    'our-work/our-year/([^/]*)/([^/]*)/?',
    // The resulting internal URL: `index.php` because we still use WordPress
    // `pagename` because we use this WordPress page
    // `designer_slug` because we assign the first captured regex part to this variable
    'index.php?pagename=our-work/our-year&our_year_tax_slug=$matches[1]&our_quarter_tax_slug=$matches[2]',
    // This is a rather specific URL, so we add it to the top of the list
    // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
    'top' );

 // Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
    // The regex to match the incoming URL
    'our-work/our-year/([^/]*)/?',
    // The resulting internal URL: `index.php` because we still use WordPress
    // `pagename` because we use this WordPress page
    // `designer_slug` because we assign the first captured regex part to this variable
    'index.php?pagename=our-work/our-year&our_year_tax_slug=$matches[1]',
    // This is a rather specific URL, so we add it to the top of the list
    // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
    'top' );

Je suppose que cela a quelque chose à voir avec le paramètre 'top' de add_rewrite_rule. C'est probablement une sorte de magie mystique dont je n'ai aucune idée. Je serais intéressé de savoir exactement ce qui se passe ici cependant.

1
patrickzdb