You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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()仅在变体开启「管理库存」选项时返回具体数值,否则会返回null
  • is_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:08:01