Обновить цену продукта с помощью крючка в Woocommerce

Я пытаюсь обновить обычную цену продукта, используя мета-ключ _regular_price с целым числом или строкой, когда продукт обновляется в wp-admin.

Мой желаемый пользовательский поток:

  1. Откройте страницу редактирования товара
  2. Нажмите кнопку обновления
  3. Обратите внимание, что для _regular_price установлено значение 20 после перезагрузки страницы.

add_action( 'woocommerce_process_product_meta', 'update_test' );
function update_test( $post_id ) {
    update_post_meta( $post_id, '_regular_price', 20 );
}

Пожалуйста, помогите мне найти, что я делаю неправильно в вышеуказанной функции, и дайте мне знать о любых других способах сделать это.


person Justin Waulters    schedule 14.11.2017    source источник


Ответы (2)


Обновлено (август 2018 г.)

Ваш код правильный, но ловушка сделана для настраиваемых полей Metaboxes.

Вместо этого вам следует использовать save_post_{$post->post_type} Wordpress hook < сильный> таргетинг только на тип сообщения о продукте.

Также вам может потребоваться обновить активную цену и обновить временный кеш продукта с помощью функции _ 2_.

Итак, ваш код будет:

add_action( 'save_post', 'update_the_product_price', 10, 3 );
function update_the_product_price( $post_id, $post, $update ) {

    if ( $post->post_type != 'product') return; // Only products
    
    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // Check the user's permissions.
    if ( ! current_user_can( 'edit_product', $post_id ) )
        return $post_id;

    $price = 50; // <===  <===  <===  <===  <===  <=== Set your price

    $product = wc_get_product( $post_id ); // The WC_Product object

    // if product is not on sale
    if( ! $product->is_on_sale() ){
        update_post_meta( $post_id, '_price', $price ); // Update active price
    }
    update_post_meta( $post_id, '_regular_price', $price ); // Update regular price
    wc_delete_product_transients( $post_id ); // Update product cache
}

Код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Проверено и работает…

person LoicTheAztec    schedule 14.11.2017
comment
Это потрясающе! - person Justin Waulters; 15.11.2017

Чтобы обработать woocommerce_process_product_meta, я думаю, вам не хватает параметров. Я надеюсь, что приведенный ниже код может удовлетворить ваши потребности.

add_action( 'woocommerce_process_product_meta',  $wc_meta_box_product_data_save,  $int,  $int ); 

Параметры (3)

  • $ wc_meta_box_product_data_save (string) => 'WC_Meta_Box_Product_Data :: save' Сохранение данных продукта метабокса wc.
  • $ int (int) => 10 Тип int.
  • $ int (int) => 2 Тип int.

Подробности можно найти по этой ссылке.

person mukesh    schedule 14.11.2017
comment
Я добавил 10, 2 как целые числа, и это не дало желаемого результата. Другие вещи, такие как _stock и все мои настраиваемые мета, отлично обновляются с помощью моей вышеупомянутой функции. Только _regular_price вызывает проблему. - person Justin Waulters; 14.11.2017