web-dev-qa-db-ja.com

URLクエリ文字列で 'numberposts'を渡すことができますか?

私は簡単な書き換え規則を設定しようとしているところでサークルに出くわしています、そして、私はここで何人かの書き換え専門家によって質問を実行したいと思いました。

私はカスタムの投稿タイプ "mealplan"を持っています、そしてvisitng site.com/mealplan/currentが訪問者をタイプ "mealplan"の最新の投稿に導くような基本的なURL書き換えを実装しようとしています。

私はこの規則でいくつかの変種を使ってみました:

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

...しかし、 'numberposts'や 'posts_per_page'のどちらのパラメータでも、クエリ文字列でそのようなことをすることはできません。 1ページあたりのデフォルト投稿数でアーカイブページに直接移動します。

これは私が欲しいものです:

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

...しかし、追加のクエリとすべてのページロードに対する潜在的なフラッシュルールを犠牲にして。現在の投稿IDをupdate_postで更新されるオプションに保存することでこれを最適化したとしても(ルールが変更されたときにのみルールをフラッシュする必要がある)、これは不要な作業です。正しく動作します。

4
goldenapples

numberpostsは実際にはクエリ変数ではありません。クエリが実行される前に、get_posts()posts_per_pageに変換されただけです。 posts_per_pageはプライベートなクエリ変数です。つまり、クエリ文字列では実行できません。考えられる解決策は、カスタムクエリ変数を登録することです('latest_mealplan'と言って、その変数を書き換えルールに追加します(例:index.php?post_type=mealplan&orderby=date&order=DESC&latest_mealplan=1))。

それから'parse_request'にフックします。これは$wpオブジェクトをコールバックに渡します。そこから、パラメータを設定するだけです。

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

お役に立てれば!

5
John P Bloch