web-dev-qa-db-ja.com

*投稿*のみ*スティッキー投稿

私は次のクエリを使用して、付箋としてマークされている only の投稿を出力します。

<?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(); ?>

私は現在ウェブサイト上でスティッキとして投稿を設定していません。ループには何も表示されません。しかし、私はそれがとにかく2つの記事を引っ張っていることがわかりました(たとえ彼らが付箋ではなかったとしても)

それで、私はWP_Queryオブジェクトに切り替えました(以前はquery_posts()を避けるように忠告されたので)

<?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();

?>

しかし、今ではまったく機能していないようです。ループは2つの投稿を出力しているようですが、post_typeパラメータを設定しているにもかかわらず、両方とも表示されているページです。

2
pealo86

私は現在ウェブサイト上でスティッキとして投稿を設定していません。ループには何も表示されません。

空の配列をpost__inに渡すとき、あなたが間違っているところです。 WordPressには愚かなバグがいくつかありますが、これは適切な回避策がないため、おそらく長い間アクティブなバグのままになるでしょう。これはそのうちの一つです。

投稿IDの有効な配列をpost__inに渡すと、次のような結果のSQL WHERE句が得られます( 注: すべてのテストはページ上で行われます

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\')

ここでスティッキがない場合、つまり空の配列をpost__inに渡すと、post__inパラメータが設定されていないと見なされるため、次のSQLが誤って生成されます。

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

これは予期しない出力を伴う壮大な失敗です。渡したパラメータによっては、まったく関係のない投稿が表示されるか、まったく投稿が表示されません。

渡された値が動的配列である場合は、この壮大な失敗を回避するためにpost__inに渡すものを常に検証する必要があるのはそのためです。

スティッキーポストを照会するだけの場合は、まったく意味がないかもしれない別の注意事項として、必ずignore_sticky_posts1に設定します( true )。これの理由は、あなたがすべての付箋記事または単に特定のカテゴリーからの付箋を照会しないことを要求するべきであるならば、あなたはあなたが必要とするものだけを得る。スティッキを無視しないと、問い合わせたものに関係なくすべてのスティッキが返されます( 私の意見ではもう1つのばかげたバグ )。

次のようにコードを書き直すことができます

$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