
本文详解如何使用 WooCommerce 原生函数 wc_get_products() 获取所有已发布商品标题,并将其渲染为 HTML 下拉菜单;同时提供可扩展结构,便于后续动态加载商品变量、价格、SKU 等元数据。
本文详解如何使用 woocommerce 原生函数 `wc_get_products()` 获取所有已发布商品标题,并将其渲染为 html 下拉菜单;同时提供可扩展结构,便于后续动态加载商品变量、价格、sku 等元数据。
在 WooCommerce 开发中,常需构建一个表单,让用户先从商品标题下拉列表中选择目标商品,再动态加载其详细信息(如 SKU、价格、库存状态、变体选项等)。关键第一步是正确、高效地获取并展示所有可售商品标题——但需注意:直接使用 WP_Query + 全局 $product 对象易出错(因 $product 在循环外未初始化或上下文不匹配),而 wc_get_products() 是 WooCommerce 推荐的标准化接口,返回的是 WC_Product 实例数组,更安全、语义清晰且兼容性更好。
以下为完整实现代码(含注释与最佳实践):
<?php // 获取所有已发布的简单商品和可变商品(不含草稿/私有商品)
$products = wc_get_products(array(
'limit' => -1, // 获取全部商品(生产环境建议加分页或缓存)
'status' => 'publish',
'type' => array('simple', 'variable'), // 可按需过滤类型
));
// 构建 title => slug 映射数组,用于下拉选项
$product_options = array();
if (!empty($products)) {
foreach ($products as $product) {
$product_options[$product->get_slug()] = $product->get_title();
}
} else {
echo '<p class="notice notice-info">' . esc_html__('暂无可用商品。') . '</p>';
}
?>
<div class="form-group">
<label for="product-select">商品标题</label>
<select id="product-select" name="selected_product" required><option value="">— 请选择商品 —</option>
<?php foreach ($product_options as $slug => $title): ?>
<option value="<?php echo esc_attr($slug); ?>"><?php echo esc_html($title); ?></option>
<?php endforeach; ?></select>
</div>
✅ 关键说明与注意事项:
-
安全性优先: 使用
esc_attr()和esc_html()分别转义value属性值和显示文本,防止 XSS 攻击; -
性能提示:
limit => -1在商品量大时会显著影响页面加载速度,建议配合 AJAX 异步加载或添加搜索筛选(如s参数模糊匹配); -
扩展性设计: 每个
$product对象支持完整方法链调用,例如:$price = $product->get_price_html(); // 格式化价格(含货币符号) $sku = $product->get_sku(); // 商品 SKU $stock = $product->get_stock_quantity(); // 库存数量 $is_variable = $product->is_type('variable'); // 判断是否为可变商品后续可通过 JS 监听下拉框
change事件,向后端发送product_slug,再用wc_get_product($slug)获取完整对象并返回 JSON 数据,实现无刷新动态填充。
? 总结: 避免依赖全局 $product 或手动 WP_Query,优先采用 wc_get_products() 获取结构化商品数据;结合 PHP 数组映射与安全输出,即可稳健构建商品选择入口——这是实现“选商品 → 查详情 → 加购/配置”交互流程的可靠起点。










