在这里问这个问题之前,我已经浏览过很多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_status
为auto-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实例。
答案 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
作为产品参考传递,以便您可以从那里获取产品数据,并且如果您尝试仅将脚本添加到屏幕,则方法应该有所不同。
我希望这会有所帮助。