在第一个函数中,我仅为每个产品变体创建自定义字段:
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 (将其传递给函数)。
您的代码中缺少
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 文件中(或插件中)。已测试并有效。