Dans wordpress, j'ai ajouté une fonction qui définit le décalage comme suit:
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {
if ( ! $query->is_home() ) {
return;
}
$offset = 1;
$ppp = 3;
if ( $query->is_paged ) {
$page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('offset', $page_offset );
}
else {
$query->set('offset',$offset);
}
}
Qu'est-ce que cette fonction fait est d'ajouter un décalage de 1 afin que le premier message ne soit pas affiché. Ce qui fonctionne très bien parfait.
Mais bien sûr, avec '! Query-> is_home', il supprime littéralement chaque premier message de chaque requête sur mon site Web.
Ce que je dois faire, c'est appliquer cette fonction à une seule requête.
Ma question est donc la suivante: comment sélectionner une requête spécifique, est-il possible, voire possible, ai-je besoin de le faire d'une autre manière?
______________________Solution qui a fonctionné pour moi__________________________
J'ai pu définir le paramètre 'offset' sur la boucle de ma page de modèle 'page-blog.php' comme ceci sans rompre la pagination (dans functions.php):
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {
if ( !is_page_template( 'page-blog.php' ) ) {
return ;
}
$offset = 1;
$ppp = 3;
if ( $query->is_paged() ) {
$page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('offset', $page_offset );
}
else {
$query->set('offset',$offset);
}
}
Alors maintenant, il applique le paramètre offset à toutes les boucles de cette page qui sont paginées. Pour que cela ne s'applique qu'aux requêtes paginées, j'ai dû ajouter le paramètre 'posts_per_page' => -1 'à la requête qui n'est pas paginée et qui n'a pas besoin d'un décalage. Donc dans mon cas c'était:
$featured_item = array(
'post_type'=> 'post',
'status' => 'publish',
'posts_per_page'=> -1
);
get_posts($featured_item);
Cette solution permettait d'afficher séparément le dernier message et, bien sûr, l'ensemble du message avec une pagination et un décalage. Peut-être que quelqu'un l'utilisera.
Merci beaucoup à s_h_dum, je suis toujours reconnaissant de votre aide!
Si vous souhaitez uniquement effectuer celle-ci, une seule requête peut alors passer l'argument offset
à travers le tableau d'arguments.
$offset = 1;
$ppp = 3;
if ( $query->is_paged ) {
$page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
}
blog_items = array(
'post_type'=> 'post',
'paged' => $paged,
'posts_per_page'=> $ppp,
'status' => 'publish',
'offset' => $offset
);
$blogposts = get_posts($blog_items);
Mais puisque vous essayez de paginer, vous pouvez toujours avoir des problèmes avec ça. Il peut être préférable de transmettre tous les arguments à travers pre_get_posts
et pas seulement certains d’entre eux:
// in functions.php
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {
if (is_main_query() || is_page_template( 'page-blog.php' ) ) {
$offset = 1;
$ppp = 3;
if ( $query->is_paged ) {
$page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('offset', $page_offset );
}
else {
$query->set('offset',$offset);
}
$query->set('post_type','post');
$query->set('paged',$paged);
$query->set('posts_per_page',3);
$query->set('status','publish');
}
}
Ensuite, une boucle normale dans le modèle de page devrait fonctionner:
if(have_posts()) {
while(have_posts()) {
the_post();
}
}
Utilisez remove_action('pre_get_posts', 'myprefix_query_offset', 1 );
pour supprimer l'action.