web-dev-qa-db-fra.com

Comment sélectionner une requête spécifique lors de la définition du décalage?

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!

1
Noob17

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.

2
s_ha_dum