我将自定义字段添加到产品变体(following this guide. 它工作得很好,但它将自定义字段添加到所有产品. 我只想添加自定义字段到特定的产品及其变体. 例如:如果产品ID等于‘1234’,则WP会将自定义字段添加到其变体中.

我try 在unction.php中处理此问题:

global $post;      
$product_id = $post->ID; 
$product_array = array( 1234, 9999 );
if ( in_array( $product_id, $product_array )) {
    // add custom field
}

...但它只适用于产品,而不适用于其变体.

有可能吗? 非常感谢!

推荐答案

要针对特定的变量产品(及其所有变体),您可以使用post_parent字段从第$variations个第三个函数参数(the WP_Post object of the current variation)中直接获得父变量产品ID.

因此,您将改用:

$targeted_ids = array( 1234, 9999 ); // Targeted variable products IDs

if ( in_array( $variation->post_parent, $targeted_ids )) {
    // add a custom setting field
}

下面是一个带有输入文本字段的完整代码示例:

// Add custom field(s) to product variations from specific variable products
add_action( 'woocommerce_product_after_variable_attributes', 'add_variation_setting_fields', 10, 3 );
function add_variation_setting_fields( $loop, $variation_data, $variation ) {
    $targeted_ids = array( 1234, 9999 ); // Targeted variable product Ids

    if ( ! in_array( $variation->post_parent, $targeted_ids ) ) return;

    $field_key1 = 'my_custom_field';
    
    woocommerce_wp_text_input( array(
        'id'            => $field_key1.'['.$loop.']',
        'label'         => __('Text field Name', 'woocommerce'),
        'wrapper_class' => 'form-row',
        'placeholder'   => __('Text field placeholder', 'woocommerce'),
        'description'   => __('Text field description', 'woocommerce'),
        'desc_tip'      => true,
        'value'         => get_post_meta($variation->ID, $field_key1, true)
    ) );
}

// Save the custom field from product variations
add_action('woocommerce_admin_process_variation_object', 'save_variation_setting_fields', 10, 2 );
function save_variation_setting_fields($variation, $i) {
    $field_key1 = 'my_custom_field';

    if ( isset($_POST[$field_key1][$i]) ) {
        $variation->update_meta_data($field_key1, sanitize_text_field($_POST[$field_key1][$i]));
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.


对于多个输入文本字段:

您可以使用以下优化代码版本(where the fields settings are in a reusable custom function):

// Fields settings
function custom_fields_settings() {
    return array(
        'my_custom_field1' => array(
            'label'       => __('Text field Name 1', 'woocommerce'),
            'placeholder' => __('Text field placeholder 1', 'woocommerce'),
            'description' => __('Text field description 1', 'woocommerce'),
        ),
        'my_custom_field2' => array(
            'label'       => __('Text field Name 2', 'woocommerce'),
            'placeholder' => __('Text field placeholder 2', 'woocommerce'),
            'description' => __('Text field description 2', 'woocommerce'),
        ),
        'my_custom_field3' => array(
            'label'       => __('Text field Name 3', 'woocommerce'),
            'placeholder' => __('Text field placeholder 3', 'woocommerce'),
            'description' => __('Text field description 3', 'woocommerce'),
        ),
    );
}


// Add custom field(s) to product variations from specific variable products
add_action( 'woocommerce_product_after_variable_attributes', 'add_variation_setting_fields', 10, 3 );
function add_variation_setting_fields( $loop, $variation_data, $variation ) {
    $targeted_ids = array( 1234, 9999 ); // Targeted variable product Ids

    if ( ! in_array( $variation->post_parent, $targeted_ids ) ) return;

    foreach(  custom_fields_settings() as $field_key => $values ) {
        $args = array(
            'id'            => $field_key.'['.$loop.']',
            'wrapper_class' => 'form-row',
            'desc_tip'      => true,
            'value'         => get_post_meta($variation->ID, $field_key, true)
        );
        woocommerce_wp_text_input( array_merge( $args, $values) );
    }
}

// Save the custom field from product variations
add_action('woocommerce_admin_process_variation_object', 'save_variation_setting_fields', 10, 2 );
function save_variation_setting_fields($variation, $i) {
    foreach(  custom_fields_settings() as $field_key => $values ) {
        if ( isset($_POST[$field_key][$i]) ) {
            $variation->update_meta_data($field_key, sanitize_text_field($_POST[$field_key][$i]));
        }
    }
}

Php相关问答推荐

从WooCommerce邮箱通知中的订单详细信息中删除产品列表

使用WooCommerce本机产品短码时不考虑价格筛选(_SHORT CODE)

在特定订单状态更改时自定义WooCommerce订单发货项目

从WooCommerce订单状态更改更新用户自定义元数据

将部分产品排除在WooCommerce的计算附加费之外

只收取WooCommerce中最高的运费

针对给定产品类别的WooCommerce计数审核

从字符串转换日期和/或时间时,Laravel转换失败

允许在WooCommerce管理订单列表中使用计费邮箱进行搜索

WooCommerce 按产品运输插件:仅收取较高的运输费用

如何显示所有数组数据而不仅仅是最后的结果

在WooCommerce购物车和 checkout 页面中更改总计文本

如何通过工厂为点列制作一个假坐标?

是否有适用于 Windows 的真正 64 位版本的 PHP 5.6?

如何在 WooCommerce 中显示每个自定义选项卡的内容

自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

WooCommerce 按 ID 限制产品

如何从 PHP 中的字符串位置排除图像扩展名

fopen 功能不断向我发送我重新加载网页时已发布的重复版本的表单

复杂的mysql查询问题