it-swarm.com.de

Ignoriere klebrige Beiträge, wenn der Beitrag nicht in der Meta-Abfrage enthalten ist

Ich habe so eine wp-Abfrage Argumente:

$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'),
   )    
);

Jeder meiner Posts hat benutzerdefinierte Felder routeFrom und routeTo. Wenn in diesem Beispiel routeFrom gleich Rome und routeTo gleich Paris ist, werden diese Posts in einer Abfrage angezeigt.

Das Problem ist, dass klebrige Beiträge angezeigt werden, egal welche Meta-Abfrage ich verwende.

Ich möchte bestimmte Haftnotizen anzeigen, wenn sie nur mit einer Meta-Abfrage übereinstimmen.

Ein Beispiel aus dem wirklichen Leben wäre: Ich habe eine Routensuchseite, auf der ich einen Sticky Post über allen Posts anzeigen möchte, aber nur, wenn dieser AUCH die Meta-Abfrage erfüllt (in diesem Fall eine bestimmte Route).

Ich verwende das Plugin "Sticky Custom Post Types" für Haftnotizen, aber die Haftnotizen werden wie normale Haftnotizen im globalen Optionsfeld "sticky_posts" gespeichert.

Irgendeine Hilfe?

Aktualisierter Code:

$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

Benutzerdefinierte Abfragen und Sticky-Posts sind ein ziemlicher Hingucker. Ich weiß nicht, wie Ihr Setup aussieht und was genau Ihr Benutzerfall ist, aber Ihre beste Lösung wäre, hier zwei Abfragen auszuführen, die erste, um Ihre klebrigen Beiträge zu erhalten, und die andere, um normale Beiträge anzuzeigen

Die Argumente Ihrer ersten Abfrage sehen ungefähr so ​​aus

$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'),
   )    
);

Als zweites Abfrageargument müssen Sie diese Stickies ausschließen

$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'),
   )    
);

Stellen Sie einfach sicher, dass Sie beide Abfragen zurücksetzen.

Wie ich bereits sagte, kenne ich Ihr genaues Setup und Ihren Anwendungsfall nicht, aber wenn dies die Hauptabfrage sein soll, sollten Sie sich pre_get_posts ansehen, um die Hauptabfrage entsprechend zu ändern. Wenn ja, schauen Sie sich diesen Beitrag an , den ich kürzlich gemacht habe, um klebrige Beiträge außerhalb der Homepage einzuschließen.

BEARBEITEN

Ich habe völlig vergessen, ignore_sticky_posts zum ersten Satz von Abfrageargumenten hinzuzufügen. Es sollte jetzt funktionieren. Ich habe den Code entsprechend aktualisiert

Nur ein oder zwei Anmerkungen zu Ihrem Code

  • Sie sollten wp_reset_postdata() verwenden, um Ihre Abfragen zurückzusetzen, nicht wp_reset_query(). Letzteres wird mit query_posts verwendet, den Sie niemals verwenden sollten. Außerdem sollte wp_reset_postdata() zwischen endwhile und endif verwendet werden

  • Verwerfen Sie den Code einfach in einem if ( !is_paged() ) { YOUR STICKY POST CODE }-Zustand, um die Abfrage nach nicht veränderlichen Posts von Seiten auszuschließen

1
Pieter Goosen

Sie können klebrige Beiträge ignorieren, indem Sie sie hinzufügen

'ignore_sticky_posts' => true,

zu Ihrer Anfrage. Sie können ignore_sticky_posts auch auf 1 setzen.

Bitte beachten Sie, dass ein Beitrag noch zugestellt wird, wenn er klebrig ist, aber die anderen Kriterien erfüllt.

2
fischi