カテゴリ駆動のサイトがあります。カテゴリごとに異なるテンプレートがあります。投稿の数を変えたい - カテゴリーごとに違う 。さらに、各カテゴリに適切な前と次のリンクを追加したいと思います。
例えばこれでcategory-1.php
私はページあたり4の投稿が欲しい:
<?php query_posts('showposts=4'); ?>
<a href="<?=next_posts()?>"> PREVIOUS </a>
<a href="<?=previous_posts()?>"> NEXT </a>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
...
<?php endwhile; endif; ?>
しかし、この例ではnext_posts()
とprevious_posts()
は機能しません。
@StephenHarrisが指摘したように は pre_get_posts
フィルタ もあります。
function hwl_home_pagesize( $query )
{
if ( is_category( 9 ) )
{
// If you want "posts per page"
$query->query_vars['posts_per_page'] = 1;
return;
}
if ( is_category( 'movie' ) )
{
// If you want "showposts"
$query->query_vars['showposts'] = 50;
return;
}
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );
例はコーデックスの例から変更されました。
pre_get_posts
フックを使うことができます(条件文は利用可能です):
function wpse47875_change_posts_per_page( $query ) {
//Only alter main query. This only works for 3.3+
if( ! $query->is_main_query() )
return;
if ( is_category('9') ){
//Display 4 posts for category 1
$query->set( 'posts_per_page', 4);
}
}
add_action('pre_get_posts', 'wpse47875_change_posts_per_page', 1);
おそらく 'main query'を変更したいだけなので、最初のチェックが重要です。 WP <3.3を使用している場合は、代わりに確認できます。
if( $wp_the_query === $query ){
//$query is the main query
}else{
//$query is *not* the main query
}
これがうまくいくかどうかは確かではありません。それは、この時点では条件文がうまくいっていない可能性があります。
// inside functions.php
function wpse47861_intercept_main_query( $wp )
{
// default
$nr_posts = 10;
if ( is_category( 'CAT NAME' ) )
$nr_posts = 4;
if ( is_category( array( 9 /*Ex. Cat-ID*/, 'CAT NAME A', 'CAT NAME B' ) ) )
$nr_posts = 6;
// Modify the main query object
$wp->query_vars['showposts'] = $nr_posts;
return $wp;
}
add_filter( 'parse_request', 'wpse47861_intercept_main_query' );
多分条件式がすでにそこで利用可能であるので、これは他の機会になるでしょう。
function wpse47861_intercept_query_limit( $limit )
{
// default
$nr_posts = 10;
if ( is_category( 'CAT NAME' ) )
$nr_posts = 4;
if ( is_category( array( 9 /*Ex. Cat-ID*/, 'CAT NAME A', 'CAT NAME B' ) ) )
$nr_posts = 6;
return "LIMIT 0, {$nr_posts}";
}
add_filter( 'posts_limit', 'wpse47861_intercept_query_limit', 9999 );
注:両方の機能はテストされていません。プラス:1つの または もう一方を使用します。両方ともfunctions.phpファイルに配置する必要があります。
私はそれぞれの/任意のwoprdpressサイトページのために任意のper_page値を設定することが可能である柔軟な方法を持っています:
現在のwpテーマのfunctions.phpを開く
次のようにsmthを使ってください。
*
add_filter('pre_option_posts_per_page', function($num)
{
if ($_SERVER['SCRIPT_URL'] == '/category/faq/')
{
return 999;
}
return $num;
});
Query_postsでは、ページテンプレートでquery_posts()を使用し、 'paged'クエリ変数を適切に設定しない限り、ページ付けは正しく機能しません。 http://codex.wordpress.org/Template_Tags/query_posts
しかし、カスタム投稿制限と呼ばれるプラグインを使用し、あなたのカテゴリページループを同じままにするほうが簡単かもしれません。カテゴリごとに異なる先頭ページとページ制限を設定できます。 WordPress›カスタム投稿制限"WordPressプラグイン を参照してください。