WooCommerce - La variable global $product devuelve valor nulo
Mi código es:
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);
Quiero pasar el precio del producto, SKU, descripción y nombre a una API de terceros.
Por favor ayúdenme.
El problema es que el objeto $product no existe donde estás intentando acceder a él (cuando haces clic en "publicar" en el editor).
Como mencionó Jacob Peattie en los comentarios, probablemente podrías obtener todo del objeto $post. Pero también puedes obtener el objeto $product desde $post->ID y luego usar los métodos "get_" disponibles en el objeto para obtener los valores que necesitas.
Aquí está tu código revisado para obtener estos valores a través de $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' ) )
) {
// Obtener el objeto producto para este ID:
$product = wc_get_product( $post->ID );
// Usar métodos "get_" para los valores:
$product_sku = $product->get_sku();
$product_name = $product->get_name();
$product_price = $product->get_price();
$product_desc = $product->get_description();
// Hacer lo que necesites para el servicio de terceros aquí...
}
}
add_action( 'transition_post_status', 'sync_on_product_save', 10, 3 );
No hay razón para usar global $post o $product en este código. De hecho, podría hacer que $post sea incorrecto. Simplemente usa el objeto post pasado como parámetro.
Jacob Peattie
Estoy de acuerdo - realmente no había revisado eso ya que estaba enfocado en la otra parte de su código. Pero eso debería eliminarse (editando ahora).
butlerblog
Mi problema está resuelto. Utilizo el hook woocommerce_process_product_meta en lugar de transition_post_status. Gracias por su respuesta.
Rashmi Ghatole