忽略已在循环中使用的wordpress中的帖子

Ignoring posts in wordpress already used in a loop

目前正在使用 ACF Repeater for WP 来显示某个类别中的一些 post,但是如果我添加相同的转发器,我希望它能够记录已使用的 post id,因此它可以将它们排除在新循环之外。

唯一的问题是我当前的代码在第一个循环和第二个循环中工作正常,但添加超过两个只是重置回第一组 posts。转储数组看起来不是添加到数组只是覆盖它。

第一个数组如下所示

 array(3) { [0]=> int(28890) [1]=> int(28790) [2]=> int(28785) }

第二个数组

 array(3) { [0]=> int(28749) [1]=> int(1) [2]=> int(28484) }

第三个

 array(3) { [0]=> int(28890) [1]=> int(28790) [2]=> int(28785) }

这是我的代码

<?php
$cat = get_sub_field('category_name');
$args = array(
    'posts_per_page' => 3,
    'category_name' => $cat,
    'post__not_in' => $ids
);
query_posts( $args );
$ids = array();
?>
<div class="hub-cont">
<?php while (have_posts()) : the_post(); ?>
<?php array_push($ids,get_the_ID()); /*$ids[] = get_the_ID();*/?>
    <div class="blockitem2 small-12 medium-4 large-4">
        <?php
        // Fetch all posts relating to a certain tag then display 4 of them
        //Get the Thumbnail URL
        $src = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), array( 720,405 ), false, '' );
        ?>

        <div id="promolink"></div><div class="blockimage" style="background-image: url('<?php echo $src[0]; ?>'); background-repeat: no-repeat; background-size: cover;">

            <div class="cats"><?php echo the_category(' '); ?></div>
        </div>
        <div class="meta">
            <a class="gdbnewslink dark" href="<?php echo get_permalink();?>" ><?php the_title();?> </a>
        </div>
        <div class="clear"></div>
        <div id="newsintro"><?php $text = $post->post_content; $trimmed = wp_trim_words( $text, 50, null ); echo $trimmed; ?></div>
    </div>

<?php endwhile; ?>
    <?php wp_reset_query(); ?>
    <?php var_dump($ids); ?>
</div>

数组对我来说还是很新,所以非常感谢您的指导!

这是使用来自此 link 的信息的解决方案。 https://www.binarymoon.co.uk/2010/03/5-wordpress-queryposts-tips/

将此添加到您的函数文件中。

$bmIgnorePosts = array();

/**
 * add a post id to the ignore list for future query_posts
 */
function bm_ignorePost ($id) {
    if (!is_page()) {
        global $bmIgnorePosts;
        $bmIgnorePosts[] = $id;
    }
}

/**
 * reset the ignore list
 */
function bm_ignorePostReset () {
    global $bmIgnorePosts;
    $bmIgnorePosts = array();
}

/**
 * remove the posts from query_posts
 */
function bm_postStrip ($where) {
    global $bmIgnorePosts, $wpdb;
    if (count($bmIgnorePosts) > 0) {
        $where .= ' AND ' . $wpdb->posts . '.ID NOT IN(' . implode (',', $bmIgnorePosts) . ') ';
    }
    return $where;
}

add_filter ('posts_where', 'bm_postStrip');

然后要使用它,您将像往常一样执行循环,并为每个要忽略的 post 调用“bm_ignorePost($post->ID);”。以下示例两次使用相同的查询,但会在每次输出中显示完全不同的 posts。

<?php
// set the query
$query = 'posts_per_page=10';

// loop 1 - display most recent 10 posts
$queryObject = new WP_Query($query);
if ($queryObject->have_posts()) {
    while ($queryObject->have_posts()) {
        bm_ignorePost($queryPost->post->ID);
        $queryObject->the_post();
        the_title();
        the_content();
    }
}

// loop 2 - same query, get the next 10 posts
$queryObject = new WP_Query($query);
if ($queryObject->have_posts()) {
    while ($queryObject->have_posts()) {
        bm_ignorePost($queryPost->post->ID);
        $queryObject->the_post();
        the_title();
        the_content();
    }
}
?>