Wordpress / WooCommerce挂钩无法触发?

时间:2019-06-21 05:19:13

标签: php wordpress woocommerce

在这里问这个问题之前,我已经浏览过很多SO博客和帖子。

我正在使用WooCommerce插件,并试图通过操作挂钩获取产品数据,并将其传递给第三方API。

我尝试了各种代码块,但是都没有提供产品信息。

因此,我正在尝试在WooCommerce上添加/更新/删除产品,并将以下挂钩放置在子主题的functions.php文件中。

挂钩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中创建webhooks,以将有效负载传递到我们可以指定的URL。最后,我想这样做。

我们非常感谢您的帮助。预先感谢。

注意::我正在启用https的wamp上在localhost上运行我的Wordpress实例。

2 个答案:

答案 0 :(得分:2)

在更新产品时,您的钩子一直在触发。转储产品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]]。这将删除您添加的脚本,这就是为什么您看不到脚本的原因。

谢谢

答案 1 :(得分:0)

这里的问题是您正在尝试在WP新增/编辑屏幕过渡时回显脚本。

正如@SushilAdhikari所述,您的钩子正确触发了,但是脚本已打印在 post.php 上,然后在执行发布/更新操作后将其重定向到编辑屏幕。

要验证触发挂钩时要接收的数据,您需要登录到其他文件并检查操作完成后。我正在分享有关如何记录数据的一小部分样本。

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作为产品参考传递,以便您可以从那里获取产品数据,并且如果您尝试仅将脚本添加到屏幕,则方法应该有所不同。

我希望这会有所帮助。