web-dev-qa-db-fra.com

Impossible d'ajouter des réécritures externes

J'ai le code suivant dans mon functions.php

function add_custom_rewrite_rules(){

   add_rewrite_tag('%gallery%','([^/]+)', 'gallery=');
   add_rewrite_tag('%album%','([^/]+)', 'album=');

   add_rewrite_rule('galleries/(.+)/?$' , 'index.php?pagename=galleries&album=1&gallery=$matches[1]');
}

add_action('init', 'flush_rewrite_rules');
add_action('init', 'add_custom_rewrite_rules');

Mais la règle de réécriture n'est pas ajoutée et elle n'apparaît pas dans la liste des réécritures de l'administrateur.

1
blurfman01

Tout d'abord, ne faites jamais cela:

add_action('init', 'flush_rewrite_rules');

Chaque fois que WordPress se charge, vous allez vider les règles de réécriture. Vous ne devez effectuer cette opération qu'une seule fois pour vous assurer que votre réécriture apparaît.

Deuxièmement, add_rewrite_tag ne prend que deux arguments, la balise et l'expression régulière. Si vous souhaitez spécifier directement une variable de requête, vous devez procéder comme suit:

<?php
global $wp_query;
$wp_query->add_rewrite_tag('%gallery%','([^/]+)', 'gallery=');
$wp_query->add_rewrite_tag('%album%','([^/]+)', 'album=');

Dans votre cas, cela n'a pas vraiment d'importance: vous utilisez la même variable de requête que la balise.

Enfin, il y a eu des erreurs dans votre regex. Vous devez commencer par une carotte, et je n’utiliserais pas (.*) pour la deuxième partie. Vous devez également spécifier le troisième argument de add_rewrite_rule qui indique à WP où placer la réécriture en évidence. Vous voulez que top indique à WordPress que cette règle doit venir avant les règles intégrées.

Cela marche:

<?php
add_action( 'init', 'wpse41778_add_rewrite' );
function wpse41778_add_rewrite()
{
    add_rewrite_tag('%gallery%','([^/]+)');
    add_rewrite_tag('%album%','([^/]+)');
    add_rewrite_rule(
        '^galleries/([^/]+)/?$', 
        'index.php?pagename=galleries&album=1&gallery=$matches[1]',
        'top'
    );
}

À condition de vider les règles de réécriture. Si vous déposez les règles dans un plugin, vous pouvez utiliser register_activation_hook pour les vider.

<?php
register_activation_hook( __FILE__, 'wpse41778_flush_rewrite' );
function wpse41778_flush_rewrite()
{
    wpse41778_add_rewrite();
    flush_rewrite_rules();
}

Pour obtenir la valeur des variables de requête gallery ou album, procédez comme suit:

$gallery = get_query_var( 'gallery' );
$album = get_query_var( 'album' );

En fonction de votre réécriture, votre utilisation ressemblera probablement à ceci:

<?php
if( get_query_var( 'album' ) )
{
    $gallery = get_query_var( 'gallery' );
    // do stuff with $gallery
}

Voici la partie de réécriture de cela comme un plugin .

3
chrisguitarguy