WordPress/WooCommerce挂钩未触发?

6
我在询问此问题之前浏览了很多博客和SO上的帖子。
我正在使用WooCommerce插件,并尝试通过动作钩子获取产品数据以传递给第三方API。
我已经尝试了各种代码块,但没有一个能给我产品信息。
因此,我尝试在我的子主题的functions.php文件中添加/更新/删除WooCommerce上的产品,使用以下挂钩: 挂钩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 );

$new_statusauto-draft时,此函数仅会执行一次,然后当我将其保存为草稿或发布或移到回收站时,将不再执行。

钩子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);

这个钩子从未被触发。

钩子 3

产品更新钩子也是同样的情况,从未被触发。

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

通过我所做的所有阅读,看起来很明显,应该能正常工作。所以如果有人能指出我可能做错了什么或者我可能遗漏了什么,那就太好了。

另外,我知道我们可以在WooCommerce中创建Webhook,可以将有效载荷传递到我们可以指定的URL。我希望将其作为最后一种选择。

非常感谢任何帮助。提前致谢。

注意: 我正在以启用https的方式使用wamp本地主机运行我的WordPress实例。

2个回答

6

在更新产品时,您的钩子一直在触发。当您转储产品ID并终止PHP执行时,您可以看到产品ID。

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);

这个过程如下:您点击更新产品按钮,它将带您转到post.php页面,您的脚本将被添加,并很快重定向到原始的产品编辑URL[http://example.com/wp-admin/post.php?post=xx&action=edit]。这会删除您添加的脚本,这就是为什么您无法看到脚本的原因。
谢谢。

谢谢你的回答,伙计。我确信有类似的事情发生,但是无法弄清楚。此外,根据@FahamShaikh的答案,优点是我不必杀死进程,仍然可以获得日志。这样更适合调试。但由于你的答案解决了我的问题,所以我会接受它。 - CodeWarrior

4

问题在于您尝试在WordPress的添加/编辑页面处于转换状态时输出脚本。

正如@SushilAdhikari所提到的,你的挂钩(hooks)正在正确触发,但你的脚本是在post.php上打印的,然后在发布/更新操作后重定向到编辑页面。

要验证挂钩(hooks)触发时接收到的数据,您需要记录到另一个文件并在操作完成后进行检查。我分享了一个小样例可以用来记录数据:

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");
}

如果我没理解错的话,$id 是产品引用传递,因此您可以从那里获取产品数据。如果您只想将脚本添加到屏幕,则应采用不同的方法。希望这可以帮助您。

嘿,谢谢你的回答伙计。由于Sushil先回答并且解决了我的问题,我会接受他的答案,但是你的答案也是正确和有帮助的,因此我会点赞它。 - CodeWarrior
@CodeWarrior 感谢你的点赞,伙计。我很高兴你的问题得到了解决。这比被采纳的答案更重要。祝你一切顺利,伙计! - Faham Shaikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接