web-dev-qa-db-fra.com

WordPress Nombre de messages non modifiés avec posts_per_page

J'ai des milliers de messages que je montre sur ma page d'accueil. Je veux contrôler le nombre de messages, donc j'utilise posts_per_page pour cela, mais cela ne fonctionne pas pour moi. Tous les autres arguments fonctionnent mais posts_per_page ne fonctionne pas. J'ai la pagination sur cette page et posts_per_page fonctionne pour toutes les autres pages de pagination mais pas pour la première page (principale). Donc, à des fins de test, je crée un modèle vierge qui n’a qu’une boucle WordPress simple et qui n’a pas de pagination ni quoi que ce soit qui affiche simplement le titre de l’article et dans ce modèle, j’ai à nouveau une limite sur le nombre de messages, mais posts_per_page ne fonctionne pas, même sur cette page. J'ai essayé de désactiver tous les plugins mais il n'y avait aucun effet, je pense donc que ce problème concerne le thème qui définit la valeur posts_per_page de manière dynamique. Je réinitialise également la requête avant cette boucle en utilisant wp_reset_query(); et ai également essayé ce code dans functions.php.

add_action( 'pre_get_posts',  'set_posts_per_page'  );
function set_posts_per_page( $query ) {
    global $wp_the_query;
    $query->set( 'posts_per_page', 12 );
    return $query;
}

Mais rien ne fonctionne pour moi. J'ai essayé d'afficher le contenu de la requête à l'aide de var_dump($query->request)et dans la limite de requête était de 12, mais sur la page, je vois toujours plus de 100 publications. Sur la page des paramètres WordPress, sur la page des paramètres de thème, la limite de messages est de 12, mais elle ne fonctionne pas au début. Voici le résultat de cette requête.

string(489) "SELECT SQL_CALC_FOUND_ROWS wp_mdw75t47kk_posts.ID FROM wp_mdw75t47kk_posts INNER JOIN wp_mdw75t47kk_postmeta ON ( wp_mdw75t47kk_posts.ID = wp_mdw75t47kk_postmeta.post_id ) WHERE 1=1 AND ( wp_mdw75t47kk_postmeta.meta_key = '_imwb_zonpress_post_ctr' ) AND wp_mdw75t47kk_posts.post_type = 'post' AND (wp_mdw75t47kk_posts.post_status = 'publish' OR wp_mdw75t47kk_posts.post_status = 'private') GROUP BY wp_mdw75t47kk_posts.ID ORDER BY wp_mdw75t47kk_postmeta.meta_value+0 DESC LIMIT 0, 12" 

Je partage également l'URL de cette page de test si quelqu'un veut le voir. Lien vers la page de test Vous pourrez également voir ce problème sur la page principale. Pour moi, c’est une question très étrange, car j’ai tout essayé à partir de Google mais rien ne fonctionne pour moi.
J'utilise un thème de constructeur de magasins discrets. Toute suggestion sera très appréciée. Je vous remercie!

Voici le code complet pour cette boucle.

wp_reset_query(); 
$args = Array(
        'posts_per_page' => 12
);

$query = new WP_Query( $args );

<?php while ( $query->have_posts() ) : $query->the_post(); ?> 

Ensuite, il y a du code pour afficher l'image, le titre et l'extrait et je pense que cela ne devrait pas affecter le nombre de posts. Après cela, ces lignes sont données

<?php 
endwhile; ?>

Mais comme je le mentionne, j'ai essayé ce code dans un modèle vierge sans pagination mais posts_per_page ne fonctionnait toujours pas. Donc, je pense qu'un crochet externe définissant cette valeur. J'ai essayé de trouver cela dans les fichiers de thème mais cela n'a pas abouti. Je sais que c'est juste à cause de ce thème.

3
Awan

Avez-vous essayé celui-ci?

<?php 
    $blogpost  =  new WP_Query(array(         
       'post_type'      => 'post',
       'posts_per_page' => 6
        ));
?>
<?php while($blogpost->have_posts()) : $blogpost->the_post(); ?>
// Writhe your Blog article Here.
<?php endwhile; ?>
1
Asrsagar

Avez-vous essayé d'ajouter ce qui suit avant les arguments principaux et la boucle?

<!-- Modify pagination function for front page -->
<?php
global $paged, $wp_query, $wp;
$args = wp_parse_args($wp->matched_query);
if ( !empty ( $args['paged'] ) && 0 == $paged ) {
$wp_query->set('paged', $args['paged']);
$paged = $args['paged']; } ?>

Puis ajoutez la pagination comme ceci:

<?php
$args = array(
'posts_per_page' => 12,
'paged' => $paged ); ?>

$query = new WP_Query($args);

<?php if ($query->have_posts()) : $i = 1; ?>

<?php while ( $query->have_posts() ) : $query->the_post(); ?>

// Content Here

<?php $i++; endwhile; ?>
<?php else : ?>
<h2>Content not found!</h2>
<?php endif; ?>

//pagination code

Dans mon cas, j'utilise WP pagenavi. J'utilise donc:

<?php wp_pagenavi( array( 'query' => $query )); ?>
<?php wp_reset_query(); ?>
0
Rocketlaunch

Avez-vous essayé celui-ci?

function posts_on_homepage( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', 10 );
    }
}
add_action( 'pre_get_posts', 'posts_on_homepage' );
0
mad2kx

Essayez d'ajouter celui-ci avant l'argument de requête.

    if (get_query_var('paged')) {
        $paged = get_query_var('paged');
    } elseif (get_query_var('page')) {
        $paged = get_query_var('page');
    } else {
        $paged = 1;
    }

À l'argument, fabriquez 'paged' => $paged

0
Dunder

Je soupçonne que votre thème est lié à un filtre qui réinitialise également la requête dans votre boucle, ce qui provoque une récursion sans fin. Si tel est le cas, vous avez trois options:

Vous pouvez abandonner le thème et en utiliser un autre. C'est probablement une mauvaise réponse si vous y investissez beaucoup.

Vous pouvez pirater le thème, ce qui est également une mauvaise réponse, car vous devrez le refaire lors de la mise à jour, ou vous devrez remplacer une partie de son code principal dans un thème enfant qui peut devenir très compliqué.

Ou bien, vous pouvez le faire de la manière rapide et sale, qui consiste simplement à utiliser une bonne vieille boucle for au lieu de while.

wp_reset_query();
$GLOBALS['my_counter'] = 12;
$args = Array(
    'posts_per_page' => $GLOBALS['my_counter'];
);

$query = new WP_Query( $args );

<?php
for ( $i = 0; $i < $GLOBALS['my_counter'], $i++ )
{
    if (!$query->the_post())
    {
        break;
    }
}
unset($GLOBALS['my_counter']);
?>

C'est moche, mais ça devrait faire ce que tu veux. La boucle for ne sera exécutée que 12 fois, que la requête soit réinitialisée ou non. Si vous voyez des publications en double, vous pouvez également définir un point d'arrêt dans la boucle et utiliser debug_backtrace(1) pour détecter où cela se produit, ce qui n'est pas vraiment réalisable dans une boucle while, à moins que vous n'aimiez l'idée d'environ 8 pages de code de débogage et éventuellement planter votre serveur.


Si cela vous convient, envisagez de trouver une solution plus élégante pour plusieurs raisons:

A) Les globes sont mauvais.

B) Faire les choses de la mauvaise façon conduit généralement à faire plus de choses de la mauvaise façon. Je ne peux pas dire quelle est la bonne manière pour votre thème spécifique, mais si elle fournit un moyen de faire ce que vous voulez sur votre page d'accueil, vous devriez le faire. S'il ne fournit aucune sorte d'IPA, faites ce que vous devez faire.

0
mopsyd