web-dev-qa-db-fra.com

Nombre différent de postes dans chaque catégorie

J'ai des sites de catégories. J'ai un modèle différent pour chaque catégorie. Je voudrais définir un nombre différent de messages - différents pour chaque catégorie . De plus, j'aimerais ajouter les liens précédents et suivants appropriés dans chaque catégorie.

par exemple, dans ce category-1.php, je veux 4 articles par page:

<?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; ?>

mais dans cet exemple, next_posts() et previous_posts() ne fonctionnent pas.

5
sydbeat

Comme indiqué par @StephenHarris , il existe également le filtre 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 );

Exemple modifié à partir de l'exemple du Codex.

5
kaiser

Vous pouvez utiliser le pre_get_posts hook (des conditions sont disponibles):

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

Vous voulez probablement seulement changer la "requête principale", la première vérification est donc importante. Si vous utilisez WP <3.3, vous pouvez plutôt vérifier:

 if( $wp_the_query === $query ){
    //$query is the main query
 }else{
    //$query is *not* the main query
 }
4
Stephen Harris

Action de demande d'analyse

Pas sûr si cela fonctionnera - il se peut que les conditionnels ne fonctionnent pas à ce stade ...

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

Posts Limite filter

Ce serait l’autre chance, car des conditionnels sont déjà disponibles là-bas.

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

Remarque: les deux fonctions ne sont pas testées. Plus: utilisez l'un ou l'autre. Les deux doivent être placés dans votre fichier functions.php.

1
kaiser

J'ai le moyen flexible où est possible de placer n'importe quelle valeur de per_page pour chaque page de site woprdpress /:

  • ouvrez functions.php du thème actuel de wp

  • utilisez smth comme next:

*

add_filter('pre_option_posts_per_page', function($num)
{
    if ($_SERVER['SCRIPT_URL'] == '/category/faq/')
    {
    return 999;
    }

    return $num;
});
0
realmag777

Avec query_posts, la pagination ne fonctionnera pas correctement, sauf si vous utilisez query_posts () dans un modèle de page et que vous définissez correctement la requête "paginée": http://codex.wordpress.org/Template_Tags/query_posts

Mais il peut être plus facile d’utiliser un plugin appelé Custom Post Limits et de laisser la même boucle à votre page de catégorie. Vous pouvez définir différentes limites de première page et de pagination pour chaque catégorie. See WordPress ›Custom Post Limits" Plugins WordPress

0
markratledge