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

如何在WooCommerce中按Partner ID条件自动填充Referral ID元数据

解决方案

以下是完整的实现代码,满足你提出的需求:产品发布前必填Partner ID和Referral ID,其中Partner ID为P1时需手动填写Referral ID,其他Partner ID则自动填充Referral ID:

// 在产品高级选项卡添加自定义字段
add_action( 'woocommerce_product_options_advanced', 'meta_data_custom' );
function meta_data_custom() {

    // 1. Partner ID
    woocommerce_wp_text_input( array(
        'id'            => '_idpartner',
        'label'         => __( 'Partner ID', 'woocommerce' ),
        'description'   => __( '填写你的合作伙伴ID。', 'woocommerce' ),
        'desc_tip'      => true,
        'placeholder'   => __( '例如:P1', 'woocommerce' ),
        'required'      => true // 在UI中标记为必填
    ) );

    // 2. Referral ID
    woocommerce_wp_text_input( array(
        'id'            => '_idreferral',
        'label'         => __( 'Referral ID', 'woocommerce' ),
        'description'   => __( '填写你的推荐ID(非P1合作伙伴会自动填充)。', 'woocommerce' ),
        'desc_tip'      => true,
        'placeholder'   => __( '例如:R1', 'woocommerce' ),
        'required'      => false // 非必填,因为大部分情况会自动填充
    ) );  
}

// 验证并保存自定义字段
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object_meta_data_custom', 10, 1 );
function action_woocommerce_admin_process_product_object_meta_data_custom( $product ) {
    $errors = array();

    // 获取提交的值
    $idpartner = isset( $_POST['_idpartner'] ) ? sanitize_text_field( $_POST['_idpartner'] ) : '';
    $idreferral = isset( $_POST['_idreferral'] ) ? sanitize_text_field( $_POST['_idreferral'] ) : '';

    // 验证Partner ID不能为空
    if ( empty( $idpartner ) ) {
        $errors[] = __( 'Partner ID为必填项。', 'woocommerce' );
    } else {
        // 更新Partner ID元数据
        $product->update_meta_data( '_idpartner', $idpartner );

        // 处理Referral ID逻辑
        if ( $idpartner === 'P1' ) {
            // 当Partner ID为P1时,必须手动填写Referral ID
            if ( empty( $idreferral ) ) {
                $errors[] = __( '当Partner ID为P1时,Referral ID为必填项。', 'woocommerce' );
            } else {
                $product->update_meta_data( '_idreferral', $idreferral );
            }
        } else {
            // 其他合作伙伴自动填充Referral ID(替换为你的动态逻辑)
            // 示例:从当前用户元数据获取(根据实际情况调整用户ID和元键)
            $current_user = wp_get_current_user();
            $auto_referral_id = get_user_meta( $current_user->ID, 'user_referral_key', true ); // 替换为你的实际元键
            
            // 如果动态值为空,使用 fallback
            if ( empty( $auto_referral_id ) ) {
                $auto_referral_id = 'R' . rand( 10, 99 ); // 示例fallback逻辑
            }

            $product->update_meta_data( '_idreferral', $auto_referral_id );
        }
    }

    // 如果有错误,保存到临时存储并阻止产品保存
    if ( ! empty( $errors ) ) {
        // 将错误存储到临时数据(10秒后过期)
        set_transient( 'wc_product_custom_errors', $errors, 10 );
        // 重定向回产品编辑页面(阻止保存)
        wp_safe_redirect( wp_get_referer() );
        exit;
    }
}

// 显示后台错误提示
add_action( 'admin_notices', 'wc_product_custom_error_notices' );
function wc_product_custom_error_notices() {
    $errors = get_transient( 'wc_product_custom_errors' );
    if ( $errors && is_array( $errors ) ) {
        echo '<div class="notice notice-error">';
        foreach ( $errors as $error ) {
            echo '<p>' . esc_html( $error ) . '</p>';
        }
        echo '</div>';
        // 显示后删除临时数据
        delete_transient( 'wc_product_custom_errors' );
    }
}

关键说明

  1. 字段UI优化:给Partner ID添加了required属性,在后台UI中标记为必填;Referral ID设为非必填,因为大部分场景会自动填充。
  2. 验证逻辑:确保Partner ID始终不为空;当Partner ID是P1时,强制检查Referral ID是否手动填写。
  3. 自动填充逻辑:对于非P1的Partner ID,从当前用户的元数据中获取动态Referral ID(你需要将user_referral_key替换为实际存储推荐ID的元键),如果动态值为空,提供了一个随机生成的fallback方案。
  4. 错误处理:使用WordPress临时存储(transient)保存验证错误,并重定向回编辑页面显示错误提示,阻止产品保存直到问题修复。
  5. 整合现有钩子:将验证和保存逻辑整合到已有的woocommerce_admin_process_product_object钩子中,避免额外的函数调用,提升效率。

需要调整的部分

  • 替换get_user_meta中的user_referral_key为你实际存储推荐ID的用户元键。
  • 如果不需要随机fallback,可以删除或修改相关代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:55:55