WooCommerce - La variable global $product devuelve valor nulo

26 nov 2018, 12:21:40
Vistas: 14.2K
Votos: 2

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.

2
Comentarios

¿Para qué lo necesitas? El tercer argumento de tu función contiene los datos del post.

Jacob Peattie Jacob Peattie
26 nov 2018 12:23:09

Como mencionó Jacob, el objeto $post se pasa a través de la acción y a través de él básicamente tienes acceso a lo que necesitas. Sin embargo, para responder específicamente a la pregunta sobre el objeto $product, necesitas darle un ID de producto (que es el ID del post) para que contenga algo donde intentas acceder a él. Mira mi respuesta a continuación que proporciona una solución utilizando el objeto de producto.

butlerblog butlerblog
26 nov 2018 15:33:39
Todas las respuestas a la pregunta 1
4

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 );
26 nov 2018 15:00:29
Comentarios

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 Jacob Peattie
26 nov 2018 15:58:39

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 butlerblog
26 nov 2018 17:56:46

Mi problema está resuelto. Utilizo el hook woocommerce_process_product_meta en lugar de transition_post_status. Gracias por su respuesta.

Rashmi Ghatole Rashmi Ghatole
27 nov 2018 13:50:05

@butlerblog ¡Perfecto! Gracias.

Ruvee Ruvee
9 abr 2021 22:05:40