¿Se puede pasar 'numberposts' en la cadena de consulta de URL?

4

Me estoy topando con círculos que intentan configurar una regla de reescritura simple, y pensé que la pregunta la harían algunos de los expertos en reescritura aquí.

Tengo un tipo de publicación personalizada, "mealplan", y estoy intentando implementar una reescritura de URL básica donde visitng site.com/mealplan/current llevará al visitante a la publicación más reciente del tipo "mealplan".

He intentado usar varias variantes en esta regla:

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

... pero parece que no puedo obtener los parámetros 'numberposts' o 'posts_per_page' para hacer algo en la cadena de consulta de esa manera. Simplemente va directamente a la página de archivo con el número predeterminado de publicaciones por página.

Esto hace lo que quiero:

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');

... pero a costa de una consulta adicional y de posibles reglas de descarga en cada carga de página. Incluso si optimizo esto guardando la ID de la publicación actual en una opción que se actualiza en update_post (por lo tanto, las reglas solo se deben borrar cuando cambian), se siente como un trabajo innecesario que podría evitarse si solo pudiera obtener los parámetros de url arriba para que funcione correctamente.

    
pregunta goldenapples 03.01.2011 - 20:42

1 respuesta

5

Bueno, numberposts no es realmente una variable de consulta. Se acaba de convertir en posts_per_page en get_posts() antes de ejecutar la consulta. posts_per_page es una var de consulta privada, lo que significa que no puede ejecutarla en la cadena de consulta. Una posible solución sería registrar una variable de consulta personalizada (digamos 'latest_mealplan' y agregar esa variable a la regla de reescritura (por ejemplo, index.php?post_type=mealplan&orderby=date&order=DESC&latest_mealplan=1 ).

Luego, enganche en 'parse_request' , que pasa el objeto $wp a la devolución de llamada. A partir de ahí, solo es cuestión de establecer el parámetro:

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"));' ) );
}

Espero que esto ayude!

    
respondido por el John P Bloch 03.01.2011 - 22:04

Lea otras preguntas en las etiquetas