web-dev-qa-db-ja.com

各カテゴリの投稿数が異なります

カテゴリ駆動のサイトがあります。カテゴリごとに異なるテンプレートがあります。投稿の数を変えたい - カテゴリーごとに違う 。さらに、各カテゴリに適切な前と次のリンクを追加したいと思います。

例えばこれで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()は機能しません。

5
sydbeat

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

例はコーデックスの例から変更されました。

5
kaiser

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
 }
4
Stephen Harris

解析要求アクション

これがうまくいくかどうかは確かではありません。それは、この時点では条件文がうまくいっていない可能性があります。

// 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ファイルに配置する必要があります。

1
kaiser

私はそれぞれの/任意の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;
});
0
realmag777

Query_postsでは、ページテンプレートでquery_posts()を使用し、 'paged'クエリ変数を適切に設定しない限り、ページ付けは正しく機能しません。 http://codex.wordpress.org/Template_Tags/query_posts

しかし、カスタム投稿制限と呼ばれるプラグインを使用し、あなたのカテゴリページループを同じままにするほうが簡単かもしれません。カテゴリごとに異なる先頭ページとページ制限を設定できます。 WordPress›カスタム投稿制限"WordPressプラグイン を参照してください。

0
markratledge