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

WooCommerce实现下拉框加载产品标题并自动获取产品变量

WooCommerce 产品标题下拉选择框及动态加载产品信息实现

一、修正循环渲染产品到下拉选择框

你的原有代码存在两个核心问题:一是global $product在自定义循环中无法正确获取当前产品对象,二是没有将循环获取的产品标题填充到下拉选项中。以下是修正后的代码,直接生成包含所有产品标题的下拉框:

<div class="form-group">
    <label>Product Title</label>
    <select id="product-select">
        <option value="">请选择产品</option>
        <?php
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => -1
        );
        $loop = new WP_Query($args);
        if ($loop->have_posts()) {
            while ($loop->have_posts()) : $loop->the_post();
                // 初始化当前产品对象,替代不可靠的global $product
                $product = wc_get_product(get_the_ID());
                if ($product) {
                    $product_id = $product->get_id();
                    $product_title = esc_html($product->get_name());
                    echo "<option value='{$product_id}'>{$product_title}</option>";
                }
            endwhile;
        } else {
            echo "<option value=''>未找到产品</option>";
        }
        wp_reset_postdata();
        ?>
    </select>
</div>

<!-- 用于展示产品详情的容器 -->
<div id="product-details" style="margin-top:20px;display:none;"></div>

关键说明:

  • 使用wc_get_product(get_the_ID())可靠获取当前产品对象,避免全局变量的上下文问题
  • 用产品ID作为选项的value,便于后续通过ID获取完整产品数据
  • 用esc_html()转义产品标题,防止XSS安全问题

二、实现选中产品后动态加载变量/元数据

要实现选中产品后自动加载信息,需要结合AJAX完成前后端交互:

1. 后端AJAX处理(添加到主题functions.php或自定义插件)

// 注册AJAX动作(登录/未登录用户都可访问)
add_action('wp_ajax_get_product_details', 'get_product_details_callback');
add_action('wp_ajax_nopriv_get_product_details', 'get_product_details_callback');

function get_product_details_callback() {
    // 验证产品ID是否合法
    if (!isset($_POST['product_id']) || !is_numeric($_POST['product_id'])) {
        wp_send_json_error('无效的产品ID');
    }

    $product_id = intval($_POST['product_id']);
    $product = wc_get_product($product_id);

    if (!$product) {
        wp_send_json_error('产品不存在');
    }

    // 收集需要返回的产品数据(可根据需求扩展)
    $product_data = array(
        'title' => $product->get_name(),
        'price' => wc_price($product->get_price()),
        'description' => wpautop($product->get_description()),
        'variations' => array()
    );

    // 如果是可变产品,获取变量信息
    if ($product->is_type('variable')) {
        $variations = $product->get_available_variations();
        foreach ($variations as $variation) {
            $product_data['variations'][] = array(
                'id' => $variation['variation_id'],
                'attributes' => $variation['attributes'],
                'price' => wc_price($variation['display_price'])
            );
        }
    }

    wp_send_json_success($product_data);
}

2. 前端JS交互(添加到页面底部或主题JS文件)

jQuery(document).ready(function($) {
    $('#product-select').on('change', function() {
        var product_id = $(this).val();
        var $details_container = $('#product-details');

        if (!product_id) {
            $details_container.hide();
            return;
        }

        // 发送AJAX请求
        $.ajax({
            url: '<?php echo admin_url('admin-ajax.php'); ?>',
            type: 'POST',
            data: {
                action: 'get_product_details',
                product_id: product_id
            },
            beforeSend: function() {
                $details_container.html('<p>加载中...</p>').show();
            },
            success: function(response) {
                if (response.success) {
                    var data = response.data;
                    var html = '<h3>' + data.title + '</h3>';
                    html += '<p><strong>价格:</strong>' + data.price + '</p>';
                    html += '<div>' + data.description + '</div>';

                    // 如果有产品变量,渲染变量列表
                    if (data.variations.length > 0) {
                        html += '<h4>产品变量:</h4><ul>';
                        $.each(data.variations, function(index, variation) {
                            html += '<li>';
                            html += '<strong>属性:</strong>' + JSON.stringify(variation.attributes).replace(/"/g,'');
                            html += '<br><strong>价格:</strong>' + variation.price;
                            html += '</li>';
                        });
                        html += '</ul>';
                    }

                    $details_container.html(html);
                } else {
                    $details_container.html('<p>错误:' + response.data + '</p>');
                }
            },
            error: function() {
                $details_container.html('<p>加载产品信息失败,请重试</p>');
            }
        });
    });
});

关键说明:

  • 后端通过wp_send_json_success和wp_send_json_error返回标准JSON格式的AJAX响应
  • 前端监听下拉框的change事件,动态展示加载状态和返回的产品信息
  • 可根据需求扩展product_data中的字段,比如库存、SKU、自定义元数据等

内容的提问来源于stack exchange,提问作者nahid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:10:27