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

WooCommerce启用Gutenberg后ACF Blocks产品复制HTML字符转义异常求助

解决WooCommerce启用Gutenberg后复制产品时ACF字段HTML转义问题

问题根源

启用产品的Gutenberg支持后,产品复制流程(原生或第三方插件)中,ACF字段的HTML转义字符会被二次编码,导致原<b>这类实体字符被转换成u003cbu003e形式的Unicode转义序列,本质是复制过程中ACF数据的序列化/反序列化处理异常。

解决方案

方案1:通过WooCommerce复制钩子修正字段编码

在主题functions.php或自定义插件中添加以下代码,拦截产品复制动作,对目标ACF字段进行解码后重新保存:

add_action('woocommerce_product_duplicate', 'fix_acf_html_escaping_on_duplicate', 10, 2);
function fix_acf_html_escaping_on_duplicate($new_product, $original_product) {
    $acf_fields = get_fields($original_product->get_id());
    if (!$acf_fields) return;

    foreach ($acf_fields as $key => $value) {
        $field_type = get_field_object($key, $original_product->get_id())['type'];
        // 针对文本、文本域、WYSIWYG字段处理,可根据实际字段类型调整
        if (in_array($field_type, ['text', 'textarea', 'wysiwyg'])) {
            // 解码Unicode转义序列
            $decoded_value = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function($matches) {
                return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UCS-2BE');
            }, $value);
            // 重新保存修正后的值到新产品
            update_field($key, $decoded_value, $new_product->get_id());
        }
    }
}

方案2:调整ACF字段保存过滤逻辑

如果方案1无效,可修改ACF字段的保存行为,避免复制时触发额外转义:

add_filter('acf/update_value', 'prevent_acf_double_escaping', 10, 3);
function prevent_acf_double_escaping($value, $post_id, $field) {
    // 仅在复制产品动作中生效
    if (!isset($_POST['action']) || $_POST['action'] !== 'duplicate_post') {
        return $value;
    }

    if (in_array($field['type'], ['text', 'textarea', 'wysiwyg'])) {
        // 反转义HTML实体,避免二次编码
        $value = htmlspecialchars_decode($value, ENT_QUOTES);
    }
    return $value;
}

方案3:禁用Gutenberg对产品的自动转义(谨慎使用)

若前两种方案无效,可尝试关闭Gutenberg对产品内容的自动转义处理,但可能影响其他功能,需充分测试:

add_filter('block_editor_settings_all', 'disable_gutenberg_auto_escaping_for_products', 10, 2);
function disable_gutenberg_auto_escaping_for_products($settings, $context) {
    if ($context->post_type === 'product') {
        $settings['autop'] = false;
        $settings['remove_linebreaks'] = false;
    }
    return $settings;
}

注意事项

  • 操作前备份网站数据,避免数据损坏。
  • 根据实际使用的ACF字段类型,调整代码中的字段类型数组。
  • 若使用第三方复制插件,可替换为对应插件的复制完成钩子(比如Duplicate Post插件的dp_duplicate_post)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:43:31