非WooCommerce页面获取产品变体库存数量方案咨询
当然可以!在自定义WordPress页面(非WooCommerce原生模板)里获取指定产品变体的库存数量,用PHP同步读取或者AJAX异步加载都能实现,下面给你两种实用的方案,适配你的自定义页面模板场景:
方案一:PHP同步直接获取
因为你已经有自定义页面模板,直接在模板代码里调用WooCommerce的内置函数即可,无需额外配置,适合页面加载时就需要展示库存的场景:
<?php // 自定义页面模板中的代码 // 先确保WooCommerce已启用,避免函数调用报错 if (class_exists('WooCommerce')) { // 替换成你的目标产品ID和变体ID $target_product_id = 123; $target_variation_id = 456; // 通过变体ID获取变体产品对象 $variation = wc_get_product_variation($target_variation_id); if ($variation && $variation->exists()) { // 验证变体是否属于指定父产品(可选,但更严谨) if ($variation->get_parent_id() === $target_product_id) { // 获取库存数量 $stock_qty = $variation->get_stock_quantity(); // 判断是否有库存 $in_stock = $variation->is_in_stock(); // 输出到页面(可根据你的页面结构调整HTML) echo "<div class='variation-stock-info'>"; echo "<p>当前变体库存:{$stock_qty}</p>"; echo "<p>库存状态:" . ($in_stock ? '<span style="color:green">有货</span>' : '<span style="color:red">缺货</span>') . "</p>"; echo "</div>"; } else { echo "<p>该变体不属于指定产品</p>"; } } else { echo "<p>未找到对应变体产品</p>"; } } else { echo "<p>WooCommerce未启用,无法获取库存信息</p>"; } ?>
说明:
wc_get_product_variation()是WooCommerce专门用于获取变体产品的函数,返回WC_Product_Variation对象get_stock_quantity()仅在变体开启「管理库存」选项时返回具体数值,否则会返回nullis_in_stock()可以直接判断变体是否可售,不受库存数值显示限制
方案二:AJAX异步获取
如果需要在用户交互(比如点击按钮、选择选项)后动态加载库存,AJAX会是更合适的选择,分为后端和前端两部分:
1. 后端代码(主题functions.php中添加)
注册AJAX动作,同时支持登录和未登录用户访问:
// 注册未登录用户可访问的AJAX动作 add_action('wp_ajax_nopriv_get_variation_stock', 'custom_get_variation_stock'); // 注册登录用户可访问的AJAX动作 add_action('wp_ajax_get_variation_stock', 'custom_get_variation_stock'); function custom_get_variation_stock() { // 验证请求合法性,防止CSRF攻击(必须) check_ajax_referer('variation_stock_nonce', 'security'); // 获取前端传递的参数 $product_id = isset($_POST['product_id']) ? intval($_POST['product_id']) : 0; $variation_id = isset($_POST['variation_id']) ? intval($_POST['variation_id']) : 0; $response = [ 'success' => false, 'message' => '', 'stock_qty' => null, 'in_stock' => false ]; if (class_exists('WooCommerce') && $product_id > 0 && $variation_id > 0) { $variation = wc_get_product_variation($variation_id); if ($variation && $variation->exists() && $variation->get_parent_id() === $product_id) { $response['success'] = true; $response['stock_qty'] = $variation->get_stock_quantity(); $response['in_stock'] = $variation->is_in_stock(); $response['message'] = '库存获取成功'; } else { $response['message'] = '变体不存在或不属于指定产品'; } } else { $response['message'] = '参数错误或WooCommerce未启用'; } // 返回JSON格式响应 wp_send_json($response); }
2. 前端代码(自定义页面模板中添加)
添加触发AJAX的交互元素和JavaScript代码:
<?php // 生成验证用的nonce $stock_nonce = wp_create_nonce('variation_stock_nonce'); ?> <!-- 页面交互元素 --> <button id="load-variation-stock">点击获取变体库存</button> <div id="stock-display-area" style="margin-top:15px;"></div> <script> document.addEventListener('DOMContentLoaded', function() { const loadBtn = document.getElementById('load-variation-stock'); const displayArea = document.getElementById('stock-display-area'); if (loadBtn && displayArea) { loadBtn.addEventListener('click', function() { // 替换成你的目标产品ID和变体ID const productId = 123; const variationId = 456; fetch('<?php echo admin_url('admin-ajax.php'); ?>', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'get_variation_stock', security: '<?php echo $stock_nonce; ?>', product_id: productId, variation_id: variationId }) }) .then(res => res.json()) .then(data => { if (data.success) { displayArea.innerHTML = ` <p>库存数量:${data.stock_qty}</p> <p>库存状态:${data.in_stock ? '<span style="color:green">有货</span>' : '<span style="color:red">缺货</span>'}</p> `; } else { displayArea.innerHTML = `<p style="color:red">${data.message}</p>`; } }) .catch(err => { console.error('请求出错:', err); displayArea.innerHTML = '<p style="color:red">获取库存失败,请稍后重试</p>'; }); }); } }); </script>
注意事项:
- 若你的变体未开启「管理库存」,
get_stock_quantity()会返回null,此时可以用is_in_stock()作为主要判断依据 - AJAX方案中的nonce验证不可省略,这是WordPress防止恶意请求的重要机制
- 两种方案都依赖WooCommerce的核心函数,确保WooCommerce插件已启用且版本兼容
内容的提问来源于stack exchange,提问作者Circle B
相关产品推荐
相关产品推荐

