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

WooCommerce简单产品选项卡自定义字段优先级设置问题

WooCommerce简单产品常规选项卡顶部添加自定义字段解决方案

优先级不生效的原因

woocommerce_product_options_general_product_data 钩子的默认挂载位置就在WooCommerce内置的常规字段(售价、促销价等)之后,无论设置多低的优先级(数字越小优先级越高),该钩子输出的内容都不会出现在内置字段之前,这是调整优先级无效的核心原因。

可行实现方案

方案1:JS动态调整字段位置(兼容性最优)

无需修改WooCommerce核心或模板文件,通过JS将自定义字段插入到常规选项卡最顶部,完整代码如下:

// 输出自定义字段 + 插入位置控制JS
function add_options_simple() {
    global $post;
    $product = wc_get_product( $post->ID );
    // 仅简单产品显示字段
    if ( ! $product || $product->get_type() !== 'simple' ) return;

    // 输出自定义字段容器,方便JS识别定位
    echo '<div class="custom-top-fields-wrapper">';
    woocommerce_wp_text_input(
        array(
            'id'          => '_brand',
            'label'       => 'Brand',
            'type'        => 'text',
            'desc_tip'    => true,
            'description' => '输入产品品牌',
        )
    );
    woocommerce_wp_text_input(
        array(
            'id'          => '_EAN',
            'label'       => 'EAN:',
            'type'        => 'text',
            'desc_tip'    => true,
            'description' => '输入产品EAN编码',
        )
    );
    echo '</div>';

    // JS逻辑:将自定义字段移到常规选项卡最顶部
    ?>
    <script>
    jQuery(document).ready(function($) {
        $('.custom-top-fields-wrapper').prependTo('#general_product_data .options_group:first');
    });
    </script>
    <?php
}
add_action( 'woocommerce_product_options_general_product_data', 'add_options_simple', 1 );

// 保存自定义字段值(原有代码缺少该部分逻辑,需补充)
function save_custom_simple_fields( $post_id ) {
    // 后台权限和安全校验
    if ( ! isset( $_POST['woocommerce_meta_nonce'] ) || ! wp_verify_nonce( $_POST['woocommerce_meta_nonce'], 'woocommerce_save_data' ) ) {
        return;
    }
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
    $product = wc_get_product( $post_id );
    if ( $product->get_type() !== 'simple' ) return;

    // 保存品牌字段
    $brand = isset( $_POST['_brand'] ) ? sanitize_text_field( $_POST['_brand'] ) : '';
    $product->update_meta_data( '_brand', $brand );
    // 保存EAN字段
    $ean = isset( $_POST['_EAN'] ) ? sanitize_text_field( $_POST['_EAN'] ) : '';
    $product->update_meta_data( '_EAN', $ean );

    $product->save();
}
add_action( 'woocommerce_process_product_meta_simple', 'save_custom_simple_fields' );

方案2:模板覆盖(无JS需求可选)

如果不想用JS实现,可以通过覆盖WooCommerce后台模板的方式操作:

  1. 复制WooCommerce插件目录下的includes/admin/meta-boxes/views/html-product-data-general.php文件
  2. 将文件粘贴到当前使用主题的woocommerce/admin/meta-boxes/views/目录下(没有对应目录可手动创建)
  3. 打开粘贴后的模板文件,在你想要展示的位置直接输出两个自定义字段的代码即可
    该方案的缺点是WooCommerce版本更新如果修改了对应模板,需要同步更新主题里的覆盖文件,避免兼容问题。

注意事项

  • 测试前清空浏览器缓存和WordPress后台缓存,避免JS逻辑不生效
  • 字段键名以下划线开头属于私有字段,默认不会在自定义字段面板展示,符合WooCommerce的字段命名规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:15:03