¿Los ganchos de WordPress/WooCommerce no se activan?

4 minutos de lectura

He revisado muchos blogs y publicaciones sobre SO antes de hacer esta pregunta aquí.

Estoy usando el complemento WooCommerce y estaba tratando de obtener datos del producto a través de ganchos de acción para pasarlos a una API de terceros.

He probado varios bloques de código pero ninguno me da información del producto.

Entonces, estoy tratando de agregar/actualizar/eliminar un producto en WooCommerce con los siguientes ganchos colocados en el tema de mi hijo functions.php expediente.

Gancho 1

function on_all_status_transitions( $new_status, $old_status, $post ) {
    echo '<script>console.log("old_status: ' . $old_status . '")</script>';
    echo '<script>console.log("new_status: ' . $new_status . '")</script>';
}
add_action('transition_post_status', 'on_all_status_transitions', 10, 3 );

Esto solo se imprime una vez cuando $new_status es auto-draft y luego, cuando lo guardo como borrador o lo publico o lo muevo a la papelera, no pasa nada.

Gancho 2

function sync_on_product_save($product_Id){
    $product = wc_get_product($product_Id);
    echo '<script>console.log("Product Id: ' . $product_Id . '")</script>';    
    // Do what you need for 3rd party here...
}
add_action('woocommerce_new_product', 'sync_on_product_save', 10, 1);

Este gancho nunca se activa.

Gancho 3

Lo mismo sucede con el enlace de actualización del producto, nunca activado.

add_action('woocommerce_update_product', 'sync_on_product_save', 10, 1);

Con toda la lectura que he hecho, parece que es muy obvio y debería funcionar. Entonces, si alguien puede señalar lo que podría estar haciendo mal o algo que podría estar perdiéndome, sería genial.

Además, soy consciente de que podemos crear webhooks en WooCommerce que pueden entregar la carga útil a una URL que podemos especificar. Me gustaría hacer esto como una última opción.

Cualquier ayuda es muy apreciada. Gracias por adelantado.

Nota: Estoy ejecutando mi instancia de WordPress en localhost sobre wamp con https habilitado.

avatar de usuario
sushil adhikari

Tus ganchos estaban disparando todo el tiempo, mientras actualizabas los productos. Podría ver la identificación del producto cuando descargue la identificación del producto y elimine la ejecución de PHP.

function sync_on_product_save($product_Id){
    var_dump( $product_Id ); exit;
    echo '<script>console.log("Product Id: ' . $product_Id . '")</script>';    
    // Do what you need for 3rd party here...
}
add_action('woocommerce_update_product', 'sync_on_product_save', 10, 1);

El proceso será así: presiona el botón de actualización del producto, lo llevará a post.php donde se agregarán sus scripts, pronto se redirigirá a la URL de edición de su producto original[http://example.com/wp-admin/post.php?post=xx&action=edit]. Esto eliminará las secuencias de comandos agregadas, razón por la cual no puede ver las secuencias de comandos.

Gracias

  • Gracias por la respuesta compañero. Estaba seguro de que algo de ese tipo estaba sucediendo, pero no pude descifrarlo. Además, con la respuesta de @FahamShaikh, la ventaja es que no tengo que eliminar el proceso y seguir obteniendo registros. De esa manera es mejor para la depuración. Pero como su respuesta resolvió mi problema, lo aceptaré.

    – CodeWarrior

    25 de junio de 2019 a las 0:00

El problema aquí es que está tratando de hacer eco del script mientras las pantallas de agregar nuevo/editar WP están en transición.

Como mencionó @SushilAdhikari, sus ganchos se disparan correctamente pero sus guiones están impresos en publicar.php y luego se redirige a la pantalla de edición después de la acción de publicación/actualización.

Para verificar qué datos está recibiendo cuando se activan los ganchos, debe iniciar sesión en un archivo diferente y verificar después de que se haya completado la acción. Estoy compartiendo una pequeña muestra de lo que se puede hacer para registrar los datos.

add_action('woocommerce_new_product', 'custom_new_product_cb');
function custom_new_product_cb($id) {
    error_log('Data ID: '.print_r($id, true).PHP_EOL, 3, $_SERVER['DOCUMENT_ROOT'] . "/product-data.log");
}
add_action('woocommerce_update_product', 'custom_update_product_cb');
function custom_update_product_cb($id) {
    error_log('Updated Product ID: '.print_r($id, true).PHP_EOL, 3, $_SERVER['DOCUMENT_ROOT'] . "/product-data.log");
}
add_action('woocommerce_trash_product', 'custom_trash_product_cb');
function custom_trash_product_cb($id) {
    error_log('Trashed Product ID: '.print_r($id, true).PHP_EOL, 3, $_SERVER['DOCUMENT_ROOT'] . "/product-data.log");
}

Si estoy en lo cierto, el $id se pasa como referencia del producto para que pueda obtener datos del producto desde allí y si está tratando de agregar solo un script a la pantalla, entonces el enfoque debería ser diferente.

Espero que esto ayude.

  • Oye, gracias por tu respuesta compañero. Dado que Sushil respondió primero y resolvió mi problema, aceptaré su respuesta, pero su respuesta también es correcta y útil, por lo tanto, la votaré a favor.

    – CodeWarrior

    24 de junio de 2019 a las 23:56

  • @CodeWarrior Gracias por el voto a favor, hombre. Me alegro de que se haya solucionado tu problema. Eso importa más que la respuesta aceptada. Que la pases bien compañero!!

    – Faham Shaikh

    25 de junio de 2019 a las 6:45

¿Ha sido útil esta solución?