Est-il possible de passer des «éléments» dans la chaîne de requête d'URL?

4

Je rencontre des cercles qui tentent de définir une règle de réécriture simple et je pense que certains des experts en réécriture répondraient à la question.

J'ai un type de message personnalisé, "plan de repas", et j'essaie d'implémenter une réécriture d'URL de base dans laquelle visitng site.com/mealplan/current amène le visiteur au dernier message de type "plan de repas".

J'ai essayé d'utiliser plusieurs variantes de cette règle:

global $wp_rewrite;
$wp_rewrite->add_rule('mealplan/current', 
  'index.php?post_type=mealplan&numberposts=1&orderby=date&order=DESC', 
  'top' ); 

... mais je n'arrive pas à obtenir les paramètres 'numberposts' ou 'posts_per_page' pour faire quoi que ce soit dans la chaîne de requête de ce type. Il va directement à la page d'archive avec le nombre de messages par page par défaut.

Cela fait ce que je veux:

global $wp_rewrite;
$current_mealplan = get_posts( array(
  'post_type'=>'mealplan',
  'numberposts'=>1,
  'orderby'=>'date',
  'order'=>'DESC' ) );
$wp_rewrite->add_rule('mealplan/current', 
  'index.php?post_type=mealplan&post_id='.$current_mealplan[0]->ID, 
  'top');

... mais au prix d'une requête supplémentaire et de règles de vidage potentielles à chaque chargement de page. Même si j'optimise cela en enregistrant l'ID de publication en cours dans une option mise à jour le update_post (les règles ne doivent donc être vidées que lorsqu'elles changent), cela ressemble à un travail inutile qui pourrait être évité si je ne pouvais obtenir que les paramètres d'URL. ci-dessus pour fonctionner correctement.

    
posée goldenapples 03.01.2011 - 20:42

1 réponse

5

Eh bien, numberposts n'est pas réellement une variable de requête. Il vient d'être transformé en posts_per_page dans get_posts() avant que la requête ne soit exécutée. posts_per_page est une variable de requête privée, ce qui signifie que vous ne pouvez pas l'exécuter dans la chaîne de requête. Une solution possible serait d’enregistrer une variable de requête personnalisée (disons 'latest_mealplan' et d’ajouter cette variable à la règle de réécriture (par exemple index.php?post_type=mealplan&orderby=date&order=DESC&latest_mealplan=1 ).

Ensuite, connectez-vous à 'parse_request' , qui transmet l'objet $wp au rappel. A partir de là, il suffit de définir le paramètre:

if( !empty( $wp->query_vars['latest_mealplan'] ) ){
  $wp->query_vars['posts_per_page'] = 1;
  add_filter( 'template_include', create_function( '$a', 'return locate_template(array("single-mealplan.php"));' ) );
}

J'espère que cela aide!

    
réponse donnée John P Bloch 03.01.2011 - 22:04

Lire d'autres questions sur les étiquettes