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