it-swarm.com.de

* Nur * klebrige Beiträge abfragen

Ich habe die folgende Abfrage verwendet, um only Posts auszugeben, die als Stickies markiert sind:

<?php
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 2,
        'post__in' => get_option('sticky_posts')
    );
?>

<?php query_posts($args); ?>
<?php if(have_posts()) : ?>

    <?php get_template_part('loop', 'feed-top-stories' ); ?>

<?php endif; ?>
<?php wp_reset_query(); ?>

Ich habe derzeit keine Beiträge als Stickies auf der Website festgelegt. Was mir sagt, dass nichts in der Schleife auftauchen sollte. Ich stellte jedoch fest, dass es sowieso 2 Posts gab (obwohl sie keine Stickies waren)

Also habe ich zu einem WP_Query-Objekt gewechselt (wie mir in der Vergangenheit geraten wurde, query_posts() zu vermeiden)

<?php

    $args = array(
            'post_type' => 'post',
            'post__in' => get_option( 'sticky_posts' ),
            'posts_per_page' => 2
    );

    $the_query = new WP_Query($args);

    if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();

        get_template_part('loop', 'feed-top-stories' );

    endwhile; endif;

    wp_reset_postdata();

?>

Aber jetzt scheint es überhaupt nicht zu funktionieren, die Schleife scheint 2 Posts auszugeben, aber beide sind die Seite, die gerade angezeigt wird, obwohl ich den Parameter post_type gesetzt habe

2
pealo86

Ich habe derzeit keine Beiträge als Stickies auf der Website festgelegt. Was mir sagt, dass nichts in der Schleife auftauchen sollte.

Genau dort, wo Sie sich irren, wenn Sie ein leeres Array an post__in übergeben. WordPress hat ein paar dumme Fehler, die nicht richtig umgangen werden können und die höchstwahrscheinlich noch sehr lange aktiv bleiben werden. Das ist einer von ihnen.

Wenn wir ein gültiges Array von Beitrags-IDs an post__in übergeben, erhalten wir die folgende resultierende SQL-Klausel WHERE ( HINWEIS: Alle Tests werden auf einer Seite durchgeführt )

AND wp_posts.ID IN (59,45) 
AND wp_posts.post_type = \'post\' 
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')

Wenn wir keine Stickies haben und daher ein leeres Array an post__in übergeben, wird die folgende SQL falsch generiert, da der Parameter post__in als nicht festgelegt angesehen wird.

AND wp_posts.ID IN (59) 
AND wp_posts.post_type = \'post\' 
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\')

Dies ist ein epischer Fehler mit unerwarteter Ausgabe. Abhängig von den übergebenen Parametern erhalten Sie völlig unabhängige oder gar keine Beiträge.

Aus diesem Grund sollten Sie immer überprüfen, was Sie an post__in übergeben, wenn die übergebenen Werte ein dynamisches Array sind, um diesen epischen Fehler zu vermeiden.

Nur ein weiterer Hinweis, der möglicherweise überhaupt keinen Sinn ergibt. Wenn Sie nur klebrige Beiträge abfragen müssen, setzen Sie ignore_sticky_posts immer auf 1 ( true ). Der Grund dafür ist, sollten Sie nicht alle Sticky-Posts oder nur Stickies aus einer bestimmten Kategorie abfragen müssen, erhalten Sie nur die, die Sie benötigen. Wenn Sie Stickies nicht ignorieren, werden alle Stickies zurückgegeben, unabhängig davon, was Sie abgefragt haben ( meiner Meinung nach noch ein alberner Fehler ).

Sie können Ihren Code wie folgt umschreiben

$stickies = get_option( 'sticky_posts' );
// Make sure we have stickies to avoid unexpected output
if ( $stickies ) {
    $args = [
        'post_type'           => 'post',
        'post__in'            => $stickies,
        'posts_per_page'      => 2,
        'ignore_sticky_posts' => 1
    ];
    $the_query = new WP_Query($args);

    if ( $the_query->have_posts() ) { 
        while ( $the_query->have_posts() ) { 
            $the_query->the_post();

            get_template_part('loop', 'feed-top-stories' );

        }    
        wp_reset_postdata();    
    }
}
6
Pieter Goosen