web-dev-qa-db-ja.com

最初のスティッキのwp_query、そして最初のスティッキを除く残りの投稿を表示

私はこれを @nacin で読んでいて、かつて使用していたquery_postsよりもwp_queryに慣れてきました。

私が欲しいのは:

  1. これをテンプレートファイルに入れる

  2. このカテゴリのすべての投稿、この場合は '3'を照会します。

  3. 利用可能であれば、ページの最初の結果に最新のスティッキーポストを表示する

  4. 最初のスティッキの後、設定されている場合は、スティッキが設定されていればそれ以外の投稿を表示します

私が見た問題は次のとおりです。 - stickyループでposts_per_page = 1を実行すると、残りのポストループでposts_per_page = -1を実行できません。これを回避するために、私はちょうど999に数を設定しました。

私が今持っているコードはworksと言うべきです。しかし、これは非常にトラフィックの多いサイトのためのものであり、これがそれを実行する最良の方法であることを確認したいのですが、元のクエリと基本的に同じなので付箋の有無にかかわらず別のもの。

global $wp_query;
$wp_query = new WP_Query(array(
    'post_type' => 'post',
    'posts_per_page' => 1,
    'category__in' => 3,
    'post__in'  => get_option( 'sticky_posts' )
));
while ($wp_query->have_posts()) : $wp_query->the_post();
    $exclude_featured = $post->ID;
    echo the_title();
    echo '<br />';
endwhile; 

echo '<br />';
echo '<br />';

global $wp_query;
$args = array_merge(
    $wp_query->query_vars,
    array(
        'post__in' => null,
        'posts_per_page' => 999,
        'ignore_sticky_posts' => 1,
        'post__not_in' => array($exclude_featured)
    )
);
query_posts( $args );
while ($wp_query->have_posts()) : $wp_query->the_post(); 
    if ( $exclude_featured == get_the_ID() )
        continue;
        echo the_title();
        echo '<br />';
endwhile; 

助けてくれてありがとう。

1
davebowker

wp_list_pluck();を使うことができます

if ( $exclude_featured )
    $args['post__not_in'] = wp_list_pluck( $exclude_featured->posts, 'ID' );
    $args['posts_per_page'] = 999;
    query_posts( $args );
endif;
while ( have_posts() ) : the_post();
...
1
mirage

これがそれをするための本当に簡単な方法です。

$args = array(
          'posts_per_page' => -1,
          'category__in' => 3,
          'ignore_sticky_posts' => 0
       );

$my_custom_query = new WP_Query( $args );

while ( $my_custom_query->have_posts() ) :$my_custom_query->the_post();

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
//Your Stuff

endwhile;

// Reset Post Data
wp_reset_postdata();
  • global $wp_query;、特に2倍を使う必要はありません。
  • brタグをエコーする必要はありません。<?php post_class();を使用している場合はCSSを使用してください。そうすれば、.stickyというクラスが自動的に取得されます。
  • クエリにはより良い名前を使用してください。

これは多少安全なので、逃した詳細に対処するために2つのクエリを使った更新があります。

// **Loop 1** get the first sticky only 

$sticky = get_option( 'sticky_posts' );

$the_query = new WP_Query( 'p=' . $sticky[0]);

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

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

// your content

<?php endwhile; wp_reset_postdata(); ?>

//////////////
//**Loop 2** exclude the sticky from the Loop 1

$args = array(
        'posts_per_page' => -1,
        'ignore_sticky_posts' => 1,
        'post__not_in' => array($sticky[0])

);

$super_query = new WP_Query($args);

while ( $super_query->have_posts() ) : $super_query->the_post(); ?>

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

// your content

<?php endwhile; wp_reset_postdata(); ?>
2
Wyck

2つの大きな問題があります。 a)グローバル変数を直接変更しないでください。b)query_postsを使用しないでください。これは作り直された例です

functions.php

add_action('pre_get_posts', 'customize_query');
function customize_query($query) {
    if(!$query->is_main_query() || !is_page_template('template-file-name.php'))
        return;

    $wp_query = new WP_Query(array(
        'post_type' => 'post',
        'posts_per_page' => 1,
        'category__in' => 3,
        'post__in'  => get_option( 'sticky_posts' )
    ));

    $query->set('posts_per_page', -1);
    $query->set('ignore_sticky_posts', 1);
    if(!empty($wp_query->posts))
        $query->set('post__not_in', array($wp_query->posts[0]->ID));

}

テンプレートファイル内

$query = new WP_Query(array(
    'post_type' => 'post',
    'posts_per_page' => 1,
    'category__in' => 3,
    'post__in'  => get_option( 'sticky_posts' )
));
while ($query->have_posts()) : $query->the_post();
    echo the_title();
    echo '<br />';
endwhile; 

echo '<br />';
echo '<br />';

while (have_posts()) : the_post(); 
        echo the_title();
        echo '<br />';
endwhile;
1
Mridul Aggarwal