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 等,记得给这两段加动态片段或排除缓存,防止置顶/最新状态延迟。