web-dev-qa-db-fra.com

Est-il possible de transmettre des 'numéros d'affichage' dans la chaîne de requête d'URL?

Je rencontre des cercles qui essaient de mettre en place une simple règle de réécriture et je pense que certains des experts en réécriture répondront à la question.

J'ai un type de message personnalisé, "plan de repas", et j'essaie de mettre en œuvre une réécriture d'URL de base dans laquelle visitng site.com/mealplan/current conduira le visiteur au message le plus récent 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 d'une éventuelle règle de vidage à chaque chargement de page. Même si j'optimise cela en enregistrant l'ID de l'article actuel dans une option mise à jour le update_post (les règles ne doivent donc être vidées que lorsqu'elles changent), c'est un travail inutile qui pourrait être évité si les paramètres d'URL ci-dessus étaient évités. fonctionne correctement.

4
goldenapples

numberposts n'est pas réellement une variable de requête. Il vient d'être transformé en posts_per_page dans get_posts() avant l'exécution de la requête. 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 t'aides!

5
John P Bloch