web-dev-qa-db-fra.com

Ignorer les post-it si la post n'est pas dans la méta-requête

J'ai une telle requête wp args:

$args = array(
  'post_type'=> 'myposttype',
  'posts_per_page' => 10,
  'meta_query' => array(
  'relation' => 'AND',
   array('key' => 'routeFrom','value' => 'rome','compare' => 'LIKE'),
   array('key' => 'routeTo','value' => 'paris','compare' => 'LIKE'),
   )    
);

Chaque mon post a un champ personnalisé routeFrom et routeTo. Dans cet exemple si routeFrom est égal à Rome et routeTo égal à Paris wp requête affichant ces publications.

Le problème est que les posts collants apparaissent peu importe la méta-requête que j'utilise.

Je souhaite afficher des posts collants particuliers s'ils correspondent uniquement à une méta-requête.

Voici des exemples concrets: J'ai une page de recherche d’itinéraire où je voudrais afficher un post-it collant en haut de tous les posts, mais seulement s’il répond AUSSI à une méta-requête (dans ce cas, un itinéraire en particulier).

J'utilise le plug-in "Post-types personnalisés", mais les articles sont stockés dans le champ d'option global "sticky_posts", tout comme les articles ordinaires.

De l'aide?

Code mis à jour:

$stickyargs = array(
  'post_type'=> 'trips',
  'posts_per_page' => -1,
  'post__in' => get_option( 'sticky_posts' ),
  'meta_query' => array(
  'relation' => 'AND',
   array('key' => 'routeFrom','value' => $_GET['from'],'compare' => 'LIKE'),
   array('key' => 'routeTo','value' => $_GET['to'],'compare' => 'LIKE'),
   )    
);

$args = array(
  'post_type'=> 'trips',
  'paged'    => $paged,
  'posts_per_page' => 10,
  'post__not_in' => get_option( 'sticky_posts' ),
  'meta_query' => array(
  'relation' => 'AND',
   array('key' => 'routeFrom','value' => $_GET['from'],'compare' => 'LIKE'),
   array('key' => 'routeTo','value' => $_GET['to'],'compare' => 'LIKE'),
   )    
);

$search = new WP_Query($args);
$searchsticky = new WP_Query($stickyargs);
?>

<?php if ( $searchsticky->have_posts() ) : ?>
    <?php while ( $searchsticky->have_posts() ) : $searchsticky->the_post(); ?>
        <div class="search_item">
            <?php the_content(); ?>>
        </div>
    <?php endwhile; ?>
    <?php else : ?>
        Not found
<?php endif; wp_reset_query(); ?>

<?php if ( $search->have_posts() ) : ?>
    <?php while ( $search->have_posts() ) : $search->the_post(); ?>
        <div class="search_item">
            <?php the_content(); ?>>
        </div>
    <?php endwhile; ?>
    <?php else : ?>
        Not found
<?php endif; wp_reset_query(); ?>
1
MIC

Les requêtes personnalisées et les posts collants sont un véritable jeu d'enfant. Je ne sais pas à quoi ressemble votre configuration ni quel est votre cas, mais la meilleure solution serait de lancer deux requêtes ici, la première pour obtenir vos posts collants et l’autre pour afficher les posts normaux.

Les arguments de votre première requête ressembleront à quelque chose comme

$args = array(
  'post_type' => 'myposttype',
  'posts_per_page' => -1,
  'post__in' => get_option( 'sticky_posts' ),
  'ignore_sticky_posts' => 1,
  'meta_query' => array(
  'relation' => 'AND',
   array('key' => 'routeFrom','value' => 'rome','compare' => 'LIKE'),
   array('key' => 'routeTo','value' => 'paris','compare' => 'LIKE'),
   )    
);

Vos deuxièmes arguments de requête dont vous aurez besoin pour exclure ces stickies

$args = array(
  'post_type'=> 'myposttype',
  'posts_per_page' => 10,
  'post__not_in' => get_option( 'sticky_posts' ),
  'meta_query' => array(
  'relation' => 'AND',
   array('key' => 'routeFrom','value' => 'rome','compare' => 'LIKE'),
   array('key' => 'routeTo','value' => 'paris','compare' => 'LIKE'),
   )    
);

Assurez-vous simplement de réinitialiser les deux requêtes.

Comme je l'ai dit précédemment, je ne connais pas votre configuration exacte ni votre cas particulier, mais si cette requête est supposée être la requête principale, vous devez consulter pre_get_posts pour modifier la requête principale en conséquence. Si tel est le cas, regardez ce message . Je l’ai récemment fait pour inclure les messages collants en dehors de la page d’accueil.

MODIFIER

J'ai totalement oublié d'ajouter ignore_sticky_posts à la première série d'arguments de requête. Cela devrait fonctionner maintenant. J'ai mis à jour le code en conséquence

Juste une ou deux notes sur votre code

  • Vous devez utiliser wp_reset_postdata() pour réinitialiser vos requêtes et non wp_reset_query(). Ce dernier est utilisé avec query_posts que vous ne devriez jamais utiliser. De plus, wp_reset_postdata() doit être utilisé entre endwhile et endif

  • Pour exclure la requête persistante des pages paginées, il suffit de déformer le code dans une condition if ( !is_paged() ) { YOUR STICKY POST CODE }

1
Pieter Goosen

Vous pouvez ignorer les posts collants en ajoutant

'ignore_sticky_posts' => true,

à votre requête. Vous pouvez également définir ignore_sticky_posts à 1.

Veuillez noter qu'un message est toujours livré s'il est collant, mais correspond aux autres critères.

2
fischi