WooCommerce - Глобальная переменная $product возвращает null

26 нояб. 2018 г., 12:21:40
Просмотры: 14.2K
Голосов: 2

Мой код:

function sync_on_product_save($new_status, $old_status, $post) {
     global $post;
     global $product;

 if( 
        $old_status != 'publish' 
        && $new_status == 'publish' 
        && !empty($post->ID) 
        && in_array( $post->post_type, 
            array( 'product') 
            )
        ) {         

        print_R($product);
}
}

add_action('transition_post_status', 'sync_on_product_save', 10, 3);

Мне нужно передать цену товара, артикул, описание и название во внешнее API.

Помогите, пожалуйста.

2
Комментарии

Для чего вам это нужно? Третий аргумент вашей функции содержит данные записи.

Jacob Peattie Jacob Peattie
26 нояб. 2018 г. 12:23:09

Как упомянул Jacob, объект $post передается через действие, и через него у вас есть доступ к тому, что вам нужно. Однако, чтобы ответить на вопрос об объекте $product конкретно, вам нужно передать ему ID товара (который является ID записи), чтобы он содержал данные, к которым вы пытаетесь получить доступ. Смотрите мой ответ ниже, который предоставляет решение с использованием объекта товара.

butlerblog butlerblog
26 нояб. 2018 г. 15:33:39
Все ответы на вопрос 1
4

Проблема в том, что объект $product не существует в том месте, где вы пытаетесь к нему обратиться (при нажатии на кнопку "Опубликовать" в редакторе).

Как упомянул Jacob Peattie в комментариях, вероятно, вы можете получить все необходимые данные из объекта $post. Однако, вы также можете получить объект $product из $post->ID и затем использовать доступные методы "get_" для получения нужных значений.

Вот переработанный код для получения этих значений через $product:

function sync_on_product_save( $new_status, $old_status, $post ) {

    if ( 
        $old_status != 'publish' 
        && $new_status == 'publish' 
        && ! empty( $post->ID ) 
        && in_array( $post->post_type, array( 'product' ) )
    ) {         

        // Получаем объект товара по ID:
        $product = wc_get_product( $post->ID );

        // Используем методы "get_" для получения значений:
        $product_sku   = $product->get_sku();
        $product_name  = $product->get_name();
        $product_price = $product->get_price();
        $product_desc  = $product->get_description();

        // Здесь выполняем необходимые действия для стороннего сервиса...
    }
}

add_action( 'transition_post_status', 'sync_on_product_save', 10, 3 );
26 нояб. 2018 г. 15:00:29
Комментарии

Нет причин использовать global $post или $product в этом коде. Это может привести к тому, что $post будет некорректным. Просто используйте объект записи, переданный в качестве параметра.

Jacob Peattie Jacob Peattie
26 нояб. 2018 г. 15:58:39

Согласен - я не особо задумывался об этом, так как был сосредоточен на другой части его кода. Но это действительно стоит убрать (редактирую сейчас).

butlerblog butlerblog
26 нояб. 2018 г. 17:56:46

Моя проблема решена. Я использую хук woocommerce_process_product_meta вместо transition_post_status. Спасибо за ваши ответы.

Rashmi Ghatole Rashmi Ghatole
27 нояб. 2018 г. 13:50:05

@butlerblog Отлично! Спасибо.

Ruvee Ruvee
9 апр. 2021 г. 22:05:40