Wordpress post 分两类。如何在家展示一次?

Wordpress post in two categories. How to show once in home?

我有一个循环,按类别显示来自 Wordpress 的 posts,但有些 posts 属于两个类别,所以在主页上所有 posts 都是显示,这些 post 出现了两次。

示例:

有谁知道如何 "hide" 这个重复的 post 吗?

这是循环:

<?php 

    $loop = new WP_Query( array( 'post_type' => 'products', 'posts_per_page' => -1 ) );

    if ( $loop->have_posts() ) :
        while ( $loop->have_posts() ) : $loop->the_post(); ?>


        <?php 
          $my_post_child_cats = array();
            foreach((get_the_category()) as $childcat) { 
                if (cat_is_ancestor_of(3, $childcat)) { ?>


                <div class="item"  data-groups='["all", "<?php echo $childcat->cat_name; ?>"]'>
                    <div class="pindex">
                        <?php if ( has_post_thumbnail() ) { ?>
                            <a href="<?php the_permalink(); ?>">
                            <div class="pimage">
                                <?php the_post_thumbnail(); ?>
                                <div class="pro-title">
                                    <h4><?php echo get_the_title(); ?></h4>
                                    <p>Read more</p></a>
                                </div>
                            </div>
                        <?php } ?>

                    </div>
                </div>

        <?php } } ?>

        <?php endwhile; ?>

    <?php endif;
    wp_reset_postdata();
    ?>

此代码将获取所有 post 并在该片段中添加类别名称:<?php echo $childcat->cat_name; ?>

然后在主页上我创建了一个按类别筛选的过滤器,它会根据 $childcat->cat_name; 使用 post,但是当您单击 "All posts" 时,它会得到 posts 两次,因为它有两个类别

您可以将每个 post 名称存储在一个数组中,然后仅在尚未显示时才输出它。像这样:

<?php 
$array[];
$loop = new WP_Query( array( 'post_type' => 'products', 'posts_per_page' => -1 ) );

if ( $loop->have_posts() ) :
    while ( $loop->have_posts() ) : $loop->the_post(); ?>


    <?php 
      $my_post_child_cats = array();
        foreach((get_the_category()) as $childcat) { 
            if (cat_is_ancestor_of(3, $childcat)) { ?>


            <div class="item"  data-groups='["all", "<?php echo $childcat->cat_name; ?>"]'>
                <div class="pindex">

                    <?php if ( has_post_thumbnail() && !in_array(get_the_title(), $array) ) { ?>
                        <a href="<?php the_permalink(); ?>">
                        <div class="pimage">
                            <?php the_post_thumbnail(); ?>
                            <div class="pro-title">
                                <h4><?php echo get_the_title();
                                 $array[] = get_the_title();
                                 ?></h4>
                                <p>Read more</p></a>
                            </div>
                        </div>
                    <?php } ?>

                </div>
            </div>

    <?php } } ?>

    <?php endwhile; ?>

<?php endif;
wp_reset_postdata();
?>

您可能需要调整代码以满足您的需要,但这段代码的作用实际上是获取 post 的 name/title 并将其存储在数组中:

$array[] = get_the_title();

然后在后续循环中检查当前循环的标题 post 是否在数组中:

if ( has_post_thumbnail() && !in_array(get_the_title(), $array) )

如果是,则不应输出任何内容。如果不是那么我们输出相关内容并将 post 的标题存储到数组中。

如果有人还在寻找如何删除重复的 post 的答案。首先你需要创建空数组,然后在第一个循环中添加 post 的所有 id。在第二个循环中,检查 post id 是否在数组中,并且它的真实性比从数组中删除当前 post id。有代码

<?php 
 $do_not_duplicate = array(); //CREATE EMPTY ARRAY
$loop = new WP_Query( array( 'post_type' => 'products', 'posts_per_page' => -1 ) );

if ( $loop->have_posts() ) :
    while ( $loop->have_posts() ) : $loop->the_post(); ?>

<?php $do_not_duplicate[] = $post->ID; //FILL ARRAY?>
    <?php 
      $my_post_child_cats = array();
        foreach((get_the_category()) as $childcat) { 
            if (cat_is_ancestor_of(3, $childcat)) { ?>

            <?php if ( in_array( $post->ID, $do_not_duplicate ) ) {
             do_not_duplicate = array_diff($do_not_duplicate, array($post->ID)); // CHECK ARRAY AND REMOVE ID
            ?>
            <div class="item"  data-groups='["all", "<?php echo $childcat->cat_name; ?>"]'>
                <div class="pindex">
                    <?php if ( has_post_thumbnail() ) { ?>
                        <a href="<?php the_permalink(); ?>">
                        <div class="pimage">
                            <?php the_post_thumbnail(); ?>
                            <div class="pro-title">
                                <h4><?php echo get_the_title(); ?></h4>
                                <p>Read more</p></a>
                            </div>
                        </div>
                    <?php } ?>

                </div>
            </div>

    <?php } } } ?>

    <?php endwhile; ?>

<?php endif;
wp_reset_postdata();
?>