标签: 指定ID分类

  • wordpress调用指定ID分类下的置顶内容和最新内容的方法

    wordpress外贸产品展示时首页调用主打产品和最新产品的实现思路,主打产品对应产品分类下的置顶产品,最新产品就是在产品分类下发的最新的产品。下面给出具体的实现方式:

    1、wordpress调用6个指定ID分类下的置顶产品

    <?php
    $cat_ids   = [23, 31, 45, 67, 89, 104];          // 要取的分类
    $sticky_id = get_option('sticky_posts');         // 全站置顶的 ID 数组
    if (!empty($sticky_id)) {
        $args = [
            'post_type'      => 'product',             // WooCommerce 产品
            'post_status'    => 'publish',
            'post__in'       => $sticky_id,            // 只查置顶
            'category__in'   => $cat_ids,              // 同时属于这 6 个分类之一
            'posts_per_page' => 6,                     // 最多 6 篇
            'orderby'        => 'post__in',            // 保持置顶顺序
            'ignore_sticky_posts' => 1,                // 防止再被置顶机制打乱
        ];
        $qs = new WP_Query($args);
        if ($qs->have_posts()) :
            echo '<div class="featured-products">';
            while ($qs->have_posts()) : $qs->the_post();
                wc_get_template_part('content', 'product'); // Woo 默认结构
            endwhile;
            echo '</div>';
            wp_reset_postdata();
        endif;
    }
    ?>

    说明

    只有同时满足“属于指定分类”且“被置顶”的产品才会被列出。

    如果某个分类下没有置顶产品,则该类不出现,总数可能 < 6。

    2、wordpress调用6个指定ID分类下的最新产品

    <?php
    $cat_ids = [23, 31, 45, 67, 89, 104];
    $latest  = [];
    
    // 逐个分类取最新 1 篇
    foreach ($cat_ids as $cid) {
        $q = new WP_Query([
            'post_type'      => 'product',
            'post_status'    => 'publish',
            'posts_per_page' => 1,
            'orderby'        => 'date',
            'order'          => 'DESC',
            'cat'            => $cid,   // 如果用 product_cat 改成 tax_query
            'fields'         => 'ids',  // 只要 ID,省内存
            'no_found_rows'  => true,
        ]);
        if (!empty($q->posts)) {
            $latest[] = $q->posts[0];
        }
    }
    
    // 统一输出
    if (!empty($latest)) {
        $final_q = new WP_Query([
            'post_type'      => 'product',
            'post__in'       => $latest,
            'orderby'        => 'post__in',
            'posts_per_page' => 6,
        ]);
        if ($final_q->have_posts()) :
            echo '<div class="latest-products">';
            while ($final_q->have_posts()) : $final_q->the_post();
                wc_get_template_part('content', 'product');
            endwhile;
            echo '</div>';
            wp_reset_postdata();
        endif;
    }
    ?>

    说明

    先分别查每个分类的最新 1 篇,再合到一次查询里输出,可避免 SQL 重复排序。

    如要一次查完而不循环,可用 GROUP BY 原生 SQL,但上面写法在 6 个分类的场景下性能已足够。

    重要提示

    主题已支持 WooCommerce 区块(如 WP 6.5+),可把上面代码封装成自定义区块或短码,方便在 Gutenberg 里插入。

    若首页缓存用 WP Rocket/FastCGI 等,记得给这两段加动态片段或排除缓存,防止置顶/最新状态延迟。