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

如何在WooCommerce中仅对下载属性为yes的产品更新pm_virtual.meta_value为'no'

在WooCommerce中将可下载产品的虚拟属性设为“否”

重要提醒

操作数据库前务必先备份,避免数据丢失或损坏。


方法一:直接使用SQL语句更新

先运行你提供的查询语句,确认需要更新的产品列表:

SELECT
  p.ID,
  p.post_title,
  pm_downloadable.meta_value AS downloadable_trait,
  pm_virtual.meta_value AS virtual_trait
FROM
  xhdps_posts AS p
  INNER JOIN xhdps_postmeta AS pm_downloadable ON p.ID = pm_downloadable.post_id
  LEFT JOIN xhdps_postmeta AS pm_virtual ON p.ID = pm_virtual.post_id
  AND pm_virtual.meta_key = '_virtual'
WHERE
  p.post_type = 'product'
  AND p.post_status = 'publish'
  AND pm_downloadable.meta_key = '_downloadable'
  AND pm_downloadable.meta_value = 'yes'
  AND pm_virtual.meta_value = 'no'

确认无误后,执行以下更新语句:

-- 更新已有_virtual元数据的产品
UPDATE xhdps_postmeta AS pm_virtual
INNER JOIN xhdps_postmeta AS pm_downloadable 
    ON pm_virtual.post_id = pm_downloadable.post_id
INNER JOIN xhdps_posts AS p 
    ON pm_virtual.post_id = p.ID
SET pm_virtual.meta_value = 'no'
WHERE
    p.post_type = 'product'
    AND p.post_status = 'publish'
    AND pm_downloadable.meta_key = '_downloadable'
    AND pm_downloadable.meta_value = 'yes'
    AND pm_virtual.meta_key = '_virtual';

如果部分可下载产品没有_virtual元数据,需要先补充该记录再更新:

-- 为缺失_virtual元数据的可下载产品添加记录并设为no
INSERT INTO xhdps_postmeta (post_id, meta_key, meta_value)
SELECT p.ID, '_virtual', 'no'
FROM xhdps_posts AS p
INNER JOIN xhdps_postmeta AS pm_downloadable ON p.ID = pm_downloadable.post_id
LEFT JOIN xhdps_postmeta AS pm_virtual ON p.ID = pm_virtual.post_id AND pm_virtual.meta_key = '_virtual'
WHERE
    p.post_type = 'product'
    AND p.post_status = 'publish'
    AND pm_downloadable.meta_key = '_downloadable'
    AND pm_downloadable.meta_value = 'yes'
    AND pm_virtual.post_id IS NULL;

-- 再更新已有记录
UPDATE xhdps_postmeta AS pm_virtual
INNER JOIN xhdps_postmeta AS pm_downloadable 
    ON pm_virtual.post_id = pm_downloadable.post_id
INNER JOIN xhdps_posts AS p 
    ON pm_virtual.post_id = p.ID
SET pm_virtual.meta_value = 'no'
WHERE
    p.post_type = 'product'
    AND p.post_status = 'publish'
    AND pm_downloadable.meta_key = '_downloadable'
    AND pm_downloadable.meta_value = 'yes'
    AND pm_virtual.meta_key = '_virtual';

方法二:使用WooCommerce内置函数(更安全)

这种方法依赖WooCommerce的API,避免直接操作数据库的风险,适合不熟悉SQL的用户。将以下代码添加到主题的functions.php文件或自定义插件中:

function update_downloadable_products_virtual_status() {
    // 查询所有发布状态的可下载产品
    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_downloadable',
                'value' => 'yes',
                'compare' => '='
            )
        )
    );

    $products = new WP_Query($args);

    if ($products->have_posts()) {
        while ($products->have_posts()) {
            $products->the_post();
            $product = wc_get_product(get_the_ID());
            if ($product) {
                // 设置虚拟属性为否
                $product->set_virtual(false);
                // 保存产品更改
                $product->save();
            }
        }
        wp_reset_postdata();
    }
}

// 执行一次后请注释此行,避免重复运行
add_action('init', 'update_downloadable_products_virtual_status');

添加后访问网站前台或后台一次,代码会自动执行更新。完成后记得注释掉add_action那一行,防止每次页面加载都重复执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:01:26