Os 'numberposts' podem ser passados na string de consulta de URL?

4

Eu estou correndo em círculos tentando configurar uma regra de reescrita simples, e pensei em fazer a pergunta com alguns dos especialistas em reescrita aqui.

Eu tenho um tipo de postagem personalizado, "mealplan", e estou tentando implementar uma reconfiguração de url básica em que visitng site.com/mealplan/current levará o visitante ao post mais recente do tipo "mealplan".

Eu tentei usar várias variantes nesta regra:

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

... mas parece que não consigo que os parâmetros 'numberposts' ou 'posts_per_page' façam nada na string de consulta assim. Ele vai direto para a página de arquivo com o número padrão de postagens por página.

Isso faz o que eu quero:

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

... mas com o custo de uma consulta adicional e um potencial de regras de liberação em cada carregamento de página. Mesmo que eu otimize isso salvando o ID do post atual em uma opção atualizada em update_post (para que as regras só precisem ser liberadas quando forem alteradas), isso parece um trabalho desnecessário que poderia ser evitado se eu pudesse obter apenas os parâmetros de URL acima para funcionar corretamente.

    
por goldenapples 03.01.2011 / 20:42

1 resposta

5

Bem, numberposts não é realmente uma variável de consulta. Ele acabou de se transformar em posts_per_page in get_posts() antes da consulta ser executada. posts_per_page é uma consulta privada var, o que significa que você não pode executá-la na string de consulta. Uma possível solução seria registrar uma variável de consulta personalizada (digamos 'latest_mealplan' e adicionar essa variável à regra de reconfiguração (por exemplo, index.php?post_type=mealplan&orderby=date&order=DESC&latest_mealplan=1 ).

Em seguida, conecte-se a 'parse_request' , que passa o objeto $wp para o retorno de chamada. A partir daí, é apenas uma questão de definir o 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 isso ajude!

    
por John P Bloch 03.01.2011 / 22:04