web-dev-qa-db-ja.com

query_postsに特定の投稿を含め、返されたリストに既にある場合は削除します

私と一緒に。まず、おすすめのスライダーに関する記事のスクリプト全体を次に示します。

<div id="featured" class="<?php if ( $responsive ) echo 'flexslider' . $featured_auto_class; else echo 'et_cycle'; ?>">
<a id="left-arrow" href="#"><?php esc_html_e('Previous','Aggregate'); ?></a>
<a id="right-arrow" href="#"><?php esc_html_e('Next','Aggregate'); ?></a>

<?php if ( $responsive ) { ?>
    <ul class="slides">
<?php } else { ?>
    <div id="slides">
<?php } ?>
<?php global $ids;
$ids = array();
$arr = array();
$i=0;

$featured_cat = get_option('aggregate_feat_cat');
$featured_num = (int) get_option('aggregate_featured_num');

if (get_option('aggregate_use_pages') == 'false') query_posts("showposts=$featured_num&top=billboard"); // set which slug in custom taxonomy TOP it should filter
else {
    global $pages_number;

    if (get_option('aggregate_feat_pages') <> '') $featured_num = count(get_option('aggregate_feat_pages'));
    else $featured_num = $pages_number;

    query_posts(array
    ('post_type' => 'page',
        'orderby' => 'menu_order',
        'order' => 'ASC',
        'post__in' => (array) get_option('aggregate_feat_pages'),
        'showposts' => (int) $featured_num
    ));
} ?>
<?php if (have_posts()) : while (have_posts()) :
    global $post;
    if (!$first_time) // START custom first post
    {
        $post_id = 105; // This is the ID of the first post to be displayed on slider
        $post = get_post($post_id);
        $first_time = 1;
    }
    else the_post(); // END custom first post
    ?>
    <?php if ( $responsive ) { ?>
            <li class="slide">
        <?php } else { ?>
            <div class="slide">
        <?php } ?>
    <?php
    $width = $responsive ? 960 : 958;
    $height = 340;
    $small_width = 95;
    $small_height = 54;
    $titletext = get_the_title();

    $thumbnail = get_thumbnail($width,$height,'',$titletext,$titletext,false,'Featured');

    $arr[$i]['thumbnail'] = get_thumbnail($small_width,$small_height,'',$titletext,$titletext,false,'Small');
    $arr[$i]['titletext'] = $titletext;

    $thumb = $thumbnail["thumb"];
    print_thumbnail($thumb, $thumbnail["use_timthumb"], $titletext, $width, $height, ''); ?>
    <div class="featured-top-shadow"></div>
    <div class="featured-bottom-shadow feat<?php $category = get_the_category(); echo $category[0]->category_nicename; ?>"></div>
    <div class="featured-description">
        <div class="feat_desc">
            <h2 class="featured-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <p><?php $excerpt = get_the_excerpt(); echo string_limit_words($excerpt,20); ?></p>
        </div>
    </div> <!-- end .description -->
    <?php if ( $responsive ) { ?>
            </li> <!-- end .slide -->
    <?php } else { ?>
            </div> <!-- end .slide -->
    <?php } ?>
    <?php $ids[] = $post->ID; $i++; endwhile; endif; wp_reset_query(); ?>
<?php if ( $responsive ) { ?>
    </ul> <!-- end .slides -->
<?php } else { ?>
</div> <!-- end #slides -->
<?php } ?>
</div> <!-- end #featured -->

query_postsカスタム分類からの一定量の投稿top=billboard。コードの次の部分:

<?php if (have_posts()) : while (have_posts()) :
    global $post;
    if (!$first_time) // START custom first post
    {
        $post_id = 105; // This is the ID of the first post to be displayed on slider
        $post = get_post($post_id);
        $first_time = 1;
    }
    else the_post(); // END custom first post
    ?>

返されたリストの最初の投稿に投稿ID 105を追加します。これにより、どの投稿を最初に表示するかを制御できます。 問題は:投稿ID 105がカスタム分類top=billboardに既に含まれている場合、リストに2回表示されます...上記のcustom first postスクリプト、およびカスタム分類top=billboardに追加されたため。

投稿ID 105がカスタム分類top=billboardに存在する場合、コードを調整して、notを2回表示する必要があります(最初の投稿としてのみ)。

2

さてそれで私はあなたのコードを読もうとしました、そして失敗して、それが現在読めないのでそれを再フォーマットしました、そしてどんなエラーもこの読めないことによってあいまいにされます。私はあなたの人生を無限に楽にするために正しくインデントして標準化されたフォーマットに従うことの重要性を強調することはできません。

<?php
$featured_class = 'et_cycle';
$tag = 'ul';
$attr = 'class';
if($responsive){
    $featured_class = 'flexslider' . $featured_auto_class;
    $tag = 'div';
    $attr = 'id';
}

?>
<div id="featured" class="<?php echo $featured_class; ?>">
    <a id="left-arrow" href="#"><?php esc_html_e( 'Previous', 'Aggregate' ); ?></a>
    <a id="right-arrow" href="#"><?php esc_html_e( 'Next', 'Aggregate' ); ?></a>
    <?php


    echo '<'.$tag.' '.$attr.'="slides">';

    global $ids;
    $ids = array();
    $arr = array();
    $i=0;

    $featured_cat = get_option( 'aggregate_feat_cat' );
    $featured_num = (int) get_option( 'aggregate_featured_num' );

    $query_args = array();
    if ( get_option( 'aggregate_use_pages' ) == 'false' ){
        // set which slug in custom taxonomy TOP it should filter
        $query_args = array(
            'showposts' => $featured_num,
            'top' => 'billboard'
        );
    }else {
        global $pages_number;

        if ( get_option( 'aggregate_feat_pages' ) <> '' ){
            $featured_num = count( get_option( 'aggregate_feat_pages' ) );
        } else{
            $featured_num = $pages_number;
        }
        query_args = array(
                'post_type' => 'page',
                'orderby' => 'menu_order',
                'order' => 'ASC',
                'post__in' => (array) get_option( 'aggregate_feat_pages' ),
                'showposts' => (int) $featured_num
        );
    }

    // needs to die, use WP_Query instead
    query_posts($query_args);


    if ( have_posts() ) {
        while ( have_posts() ) {
            global $post;
            // START custom first post
            if ( !$first_time ) {
                $post_id = 105; // This is the ID of the first post to be displayed on slider
                $post = get_post( $post_id );
                $first_time = 1;
            }else{
                the_post(); // END custom first post
            }
            if ( $responsive ) {
                echo '<li';
            }else {
                echo '<div';
            }
            echo ' class="slide">';
            $width = $responsive ? 960 : 958;
            $height = 340;
            $small_width = 95;
            $small_height = 54;
            $titletext = get_the_title();

            $thumbnail = get_thumbnail( $width, $height, '', $titletext, $titletext, false, 'Featured' );

            $arr[$i]['thumbnail'] = get_thumbnail( $small_width, $small_height, '', $titletext, $titletext, false, 'Small' );
            $arr[$i]['titletext'] = $titletext;

            $thumb = $thumbnail["thumb"];
            print_thumbnail( $thumb, $thumbnail["use_timthumb"], $titletext, $width, $height, '' );
            ?>
            <div class="featured-top-shadow"></div>
            <div class="featured-bottom-shadow feat<?php $category = get_the_category(); echo $category[0]->category_nicename; ?>"></div>
            <div class="featured-description">
                <div class="feat_desc">
                    <h2 class="featured-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                    <p><?php $excerpt = get_the_excerpt(); echo string_limit_words( $excerpt, 20 ); ?></p>
                </div>
            </div> <!-- end .description -->
                <?php if ( $responsive ) { ?>
                        </li> <!-- end .slide -->
                <?php } else { ?>
                        </div> <!-- end .slide -->
                <?php } ?>
                <?php $ids[] = $post->ID; $i++;
        }
    }

    wp_reset_query();
    echo '</'.$tag.'>';
    ?>
</div> <!-- end #featured -->

私はいくつかの単純化を行い、ifステートメントを入れ替えたので、それらはすべて、速記と標準の混乱ではなく{}を使用します。

ここにはたくさんの問題があります、最後の問題はwp_reset_queryです、そして最も大きな鐘はquery_postsの使用です。

Query_postsを使用せず、代わりにWP_Queryまたはget_postsを使用することを強くお勧めします。

ここでの原因はあなたのループです:

        while ( have_posts() ) {
            global $post;
            // START custom first post
            if ( !$first_time ) {
                $post_id = 105; // This is the ID of the first post to be displayed on slider
                $post = get_post( $post_id );
                $first_time = 1;
            }else{
                the_post(); // END custom first post
            }

ここで私たちはあなたの投稿ループの始まりを見ます、それは追加の投稿があるかどうかチェックし、そして次に進むためにthe_postを呼び出します。

ただし、最初の投稿が行われたときは、the_postを呼び出さないため、ループは進みません。これはループの動作方法ではなく、常に常にthe_postを呼び出してください。

代わりに、105の投稿を含まないようにクエリに指定することをお勧めします(投稿IDのハードコーディングを避けることもできますが、必ずしも105になるとは限りません)。

そのため、まずはじめに、クエリにpost__not_inパラメータを使用します。

$query_args['post__not_in'] = array(105);
1
Tom J Nowell

私はpre_get_postsを使います。例:

add_action('pre_get_posts','search_filterr');function search_filterr($query) {
    if ( !is_admin() && $query->is_main_query() )   {
        if ( $query->is_search ) { //$query->is_category or etc...except is_page()
            $arrs[]='post';
            $arrs[]='page';
            $arrs[]='my_carss';
            $query->set('post_type',  $arrs );
        }
    }
}
0
T.Todua