WooCommerce: получение значения настраиваемого поля варианта продукта в подключенной функции

Вот как я добавляю настраиваемое поле администратора для вариантов продукта:

add_action( 'woocommerce_variation_options_pricing', 'add_custom_field_to_variations', 10, 3 );
     
function add_custom_field_to_variations( $loop, $variation_data, $variation ) {
    woocommerce_wp_text_input( array(
        'id' => 'custom_field[' . $loop . ']',
        'class' => 'short',
        'label' => __( 'Custom Field', 'woocommerce' ),
        'value' => get_post_meta( $variation->ID, 'custom_field', true )
    ) );
}

Сохранить настраиваемое поле в варианте продукта сохранить:

add_action( 'woocommerce_save_product_variation', 'save_custom_field_variations', 10, 2 );
function save_custom_field_variations( $variation_id, $i ) {
    $custom_field = $_POST['custom_field'][$i];
    if ( isset( $custom_field ) ) update_post_meta( $variation_id, 'custom_field', esc_attr( $custom_field ) );
}

Сохранение значения настраиваемого поля в данных варианта

add_filter( 'woocommerce_available_variation', 'add_custom_field_variation_data' );
function add_custom_field_variation_data( $variations ) {
    $variations ['custom_field'] = '<div class="woocommerce_custom_field">Custom Field: <span>' . get_post_meta( $variations[ 'variation_id' ], 'custom_field', true ) . '</span></div>';
    return $variations;
}

Значение сохраняется и отображается на странице одного продукта, но функция ниже не возвращает значение.

Попытка получить значение настраиваемого поля в функции:

add_filter('woocommerce_variation_prices_price', 'get_custom_variable_price' )
function get_custom_variable_price() {

    global $post;
    $custom_value = get_post_meta( $variations[ 'variation_id' ], 'custom_field', true );
    $custom_value = (float)$custom_value;
    return $custom_value;   
}

Мне нужно получить только значение (которое является числом с плавающей запятой):


person Bilal    schedule 13.03.2021    source источник
comment
Где вы используете свою последнюю функцию? ... пожалуйста, добавьте еще контекст, так как ваш вопрос на самом деле неясен ...   -  person LoicTheAztec    schedule 13.03.2021
comment
Я использую последнюю функцию для woocommerce_variation_prices_price. Цель состоит в том, чтобы умножить индивидуальное значение на цену варианта товара.   -  person Bilal    schedule 13.03.2021
comment
Я тогда отредактировал ваш вопрос и ответил. Будем признательны за некоторые отзывы о приведенном ниже ответе.   -  person LoicTheAztec    schedule 13.03.2021


Ответы (1)


В вашей последней функции (см. Ниже) есть некоторые ошибки и упущения.

Теперь есть два способа получить значение настраиваемого поля в этой подключенной функции:

1). Использование WC_Data get_meta() метода (начиная с WooCommerce 3):

add_filter('woocommerce_variation_prices_price', 'custom_variable_price', 100, 3 );
function custom_variable_price( $price, $variation, $product ) {
    $value = floatval( $variation->get_meta( 'custom_field' ) );
    if( $value > 0 ) {
        $price = $value; 
    }
    return $price;
}

2). Или с помощью функции WordPress get_post_meta() (старый способ):

add_filter('woocommerce_variation_prices_price', 'custom_variable_price', 100, 3 );
function custom_variable_price( $price, $variation, $product ) {
    $value = floatval( floatval( get_post_meta( $variation->get_id(), 'custom_field', true ) );
    if( $value > 0  ) {
        $price = $value; 
    }
    return $price;
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Проверено, работает на обоих.

Важное примечание: вы можете не увидеть результат во внешнем интерфейсе, так как переменный ценовой диапазон продукта кэшируется в WooCommerce для повышения производительности (для лучшего понимания см. ссылку ниже).

Связанная ветка: Изменить цены на товары с помощью крючка в WooCommerce 3+


Дополнение, связанное с вашими другими функциями

Начиная с WooCommerce 3, вы можете обновить вторую и третью функцию следующим образом:

add_action( 'woocommerce_admin_process_variation_object', 'save_custom_field_variation_value', 10, 2 );
function save_custom_field_variation_value( $variation, $i ) {
    if( isset($_POST['custom_field'][$i]) ) {
        $variation->update_meta_data( 'custom_field', floatval( sanitize_text_field($_POST['custom_field'][$i]) ) );
    }
}

и 3-я функция

add_filter( 'woocommerce_available_variation', 'add_variation_custom_field_value_to_variation_data', 10, 3 );
function add_variation_custom_field_value_to_variation_data( $variation_data, $product, $variation ) {
    if ( $value = $variation->get_meta( 'custom_field' ) ) {
        $variation_data['custom_field'] = '<div class="woocommerce_custom_field">' .__("Custom Field") . ': <span>' . $value . '</span></div>';
    }
    return $variation_data;
}
person LoicTheAztec    schedule 13.03.2021
comment
Привет @loicTheAztec Спасибо за ответ и усилия. Я пробую обе версии, но она не работает и показывает критическую ошибку на интерфейсе. Думаю, я не правильно спросил, позвольте мне попытаться объяснить еще раз; проверьте: stackoverflow.com/questions/45806249/ вы тоже ответили на это, мне нужно было умножить значение настраиваемого добавленного поля варианта. 2) Для версии темы: function get_price_multiplier() { return 2; // x2 for testing // I NEED TO LOAD CUSTOM FIELD VALUE HERE} - person Bilal; 13.03.2021
comment
@Bilal Извините, в обоих кодах была ошибка ... Попробуйте еще раз, теперь все должно работать. Если этот ответ отвечает на ваш вопрос, вы можете принять ответ, и, если хотите / хотите, вы также можете проголосуйте за и за ответ, спасибо. - person LoicTheAztec; 14.03.2021
comment
На самом деле он не получает идентификатор custom_field, и get_meta не работает, а также я пробовал с get_the_ID (), но все они возвращают null - person Bilal; 14.03.2021
comment
@Bilal Для меня это работает на моем тестовом сервере. - person LoicTheAztec; 14.03.2021
comment
Я объяснил это требование здесь; Пользовательское поле варианта продукта stackoverflow .com / questions / 66735034 /. - person Bilal; 21.03.2021