WooCommerce - Глобальная переменная $product возвращает null
Мой код:
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.
Помогите, пожалуйста.

Проблема в том, что объект $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 );

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

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

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