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