重新订购产品变体时自定义字段中的错误 Woocommerce

问题描述 投票:0回答:1

在第一个函数中,我仅为每个产品变体创建自定义字段:

add_action('woocommerce_admin_process_variation_object', 'save_custom_variation_fields', 10, 2);

function add_custom_variation_fields($loop, $variation_data, $variation)
{
    // Field names and labels
    $fields = array(
        'skyler_stock_digital',
        'skyler_stock_vitrine_mall',
        'skyler_stock_center_um',
        'skyler_stock_aldeota',
    );

    // Open a container div to hold the fields
    echo '<div class="custom-variation-fields-container">';

    foreach ($fields as $field_name) {
        // Get the saved value or use 0 if no value is saved

        // Output the label and input field in a div to display them side by side
        echo '<div class="custom-variation-field">';
        woocommerce_wp_text_input(
            array(
                'id'    => $field_name . '[' . $loop . ']',
                'name'  => $field_name . '[' . $loop . ']',
                'value' => get_post_meta($variation->ID, $field_name . '[' . $loop . ']', true), //ele pega pelo field id
                'label' => __($field_name . '[' . $loop . ']', 'woocommerce'),
            )
        );
        echo '</div>';
    }

    // Close the container div
    echo '</div>';
}

下面我将输入发送到服务器:

function save_custom_variation_fields($variation, $i)
{
    // Add your custom logic here;
    $lojas          = array('digital', 'vitrine_mall', 'center_um', 'aldeota');

    foreach ($lojas as $loja) {
        $custom_value = isset($_POST['skyler_stock_' . $loja][$i]) ? $_POST['skyler_stock_' . $loja][$i] : '';

        if (!empty($custom_value)) {
            $variation->update_meta_data('skyler_stock_' . $loja . '[' . $i . ']', esc_attr($custom_value));
        }
    }

    echo "<div> O valor salvo eh $custom_digital";
}

问题是当我在 woocommerce 产品变体中添加新变体或重新排序然后保存时,原始输入的数据会发生更改。如果我只是保存而不进行任何重新排序,则不会发生这种情况。

我尝试将 $i 和 $loop 切换到 $variation_id (将其传递给函数)。

php wordpress woocommerce custom-fields product-variations
1个回答
0
投票

您的代码中缺少

add_custom_variation_fields()
函数的挂钩。尝试以下替换代码:

// Utility function to handle custom field Key / Label pairs
function my_variation_custom_fields() {
    return array(
        'digital'       => __('Digital', 'woocommerce'), 
        'vitrine_mall'  => __('Vitrine mall', 'woocommerce'),  
        'center_um'     => __('Center um', 'woocommerce'),  
        'aldeota'       => __('Aldeota', 'woocommerce'), 
    );
}

// Add / display custom fields to Admin WooCommerce product variation settings
add_action( 'woocommerce_variation_options_pricing', 'add_admin_variation_custom_fields', 10, 3 );
function add_admin_variation_custom_fields( $loop, $variation_data, $variation ) {
    echo '<div class="custom-variation-fields-container">';

    $variation_object = wc_get_product($variation->ID);
    $custom_fields    = my_variation_custom_fields(); // Load custom fields keys / labels

    // Loop through custom fields key / Label pairs
    foreach ($custom_fields as $field_key => $field_label ) {
        echo '<div class="custom-variation-field">';

        woocommerce_wp_text_input( array(
            'id'            => "skyler_stock_{$field_key}_{$loop}",
            'label'         => $field_label,
            'value'         => $variation_object->get_meta("skyler_stock_{$field_key}"),
        ) );

        echo '</div>';
    }
    echo '</div>';
}

// Save custom fields data in Admin WooCommerce product variation settings
add_action( 'woocommerce_admin_process_variation_object', 'save_admin_variation_custom_fields', 10, 2 );
function save_admin_variation_custom_fields( $variation, $i ) {
    $custom_fields    = my_variation_custom_fields();

    foreach ($custom_fields as $field_key => $field_label ) {
        if ( isset($_POST["skyler_stock_{$field_key}_{$i}"]) ) {
            $variation->update_meta_data("skyler_stock_{$field_key}", sanitize_text_field($_POST["skyler_stock_{$field_key}_{$i}"]));
        }
    }
}

代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。

© www.soinside.com 2019 - 2024. All rights reserved.