web-dev-qa-db-fra.com

Réécriture d'URL et pagination

Je dois dire que je suis un nooby complet à la réécriture d'URL personnalisées par Wordpress. J'ai cherché pendant plusieurs jours pour trouver une explication claire sur la façon de déterminer et d'écrire le modèle correct pour les réécritures d'URL. J'ai un modèle de page personnalisé qui utilise la requête var qui lui est transmise, par exemple. http://example.com/pagename?user=username . Dans ce "nom de page" se réfère au modèle de page personnalisé et "utilisateur" à la requête personnalisée var. J'ai besoin que cela soit représenté à l'aide de l'URL http://example.com/nom_page/nom_utilisateur .

J'ai également besoin de ce qui précède pour travailler avec la pagination. So http://example.com/pagename/username/page/2 devrait pouvoir représenter http://example.com/pagename/page/2?user=username

Ce serait formidable si quelqu'un puisse me fournir un exemple de travail et une explication sur la façon dont je devrais déterminer et écrire le modèle correct pour la réécriture d'URL.

Cordialement, John

3
John

Prolonger l'excellente réponse de @Stephen Harris, j'opterais pour;

add_action( 'generate_rewrite_rules', 'my_rewrite_rules' );
function my_rewrite_rules( $wp_rewrite )
{
    $wp_rewrite->rules = array(
        'mypageslug/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?pagename=mypageslug&user=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
        'mypageslug/([^/]+)/?$' => $wp_rewrite->index . '?pagename=mypageslug&user=' . $wp_rewrite->preg_index( 1 )

    ) + $wp_rewrite->rules;
}

Cela suit la norme de facto regex utilisée dans le noyau de WordPress. Le principal changement par rapport à l'exemple de code de Stephen est l'utilisation de $wp_rewrite->index pour garantir que la réécriture est transmise à WordPress (sinon, il pourrait être ajouté à la liste "externe" en écriture).

Deuxièmement, et surtout, passer la variable pagename dans la chaîne de requête - cela signifie que WordPress se comportera comme si elle chargeait normalement une page avec le slug mypageslug.

UPDATE: J'ai oublié d'ajouter, assurez-vous que user est une requête publique, sinon WordPress ne le mappera pas à partir de l'URL. Filtrez-le avec query_vars ou ajoutez-le en utilisant le $wp global;

add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $vars )
{
    $vars[] = 'user';
}

// my preferred method - make sure you run this only after 'init' has fired!
$GLOBALS['wp']->add_query_var( 'user' );

// then once the request has been parsed (anything after the action 'parse_request')
$user = get_query_var( 'user' );
1
TheDeadMedic

J'ai eu un problème similaire et l'ai résolu avec succès. En fait, j'ai récemment écrit cet article de blog qui utilisait cette solution.

WordPress utilise des règles pour rendre les urls jolies, l’idée est d’utiliser un filtre pour appeler une fonction qui ajoute des règles (puis, après avoir accédé à Paramètres> Permaliens et cliqué sur Enregistrer, les règles doivent être ajoutées). C'est le code:

add_action('generate_rewrite_rules', 'my_rewrite_rules');
function my_rewrite_rules( $wp_rewrite ) {
  $new_rules = array(
     'pagename/(.+)' => 'pagename?user='.$wp_rewrite->preg_index(1),
       );

  // Add the new rewrite rule into the top of the global rules array
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

L'idée est que WordPress vérifie si l'URL est de la forme www.example.com/pagename/something et l'utilise pour définir la variable utilisateur.

Pour que la pagination fonctionne, vous devez ajouter la règle suivante au tableau $ new_rules - ci-dessus la règle déjà présente (car WordPress vérifie les règles dans l'ordre).

    'pagename/(.+)/page/?([0-9]{1,})' => 'pagename?user='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2),

De même, cela vérifie www.example.com/pagename/something/page/2 et l’interprète comme exemple.com/pagename?user=username&paged=2. (Paged est la variable de requête reconnue par WordPress pour déterminer la page en pagination).

J'espère que cela t'aides!

0
Stephen Harris