您想要的操作是:
add_action('woocommerce_update_product', 'productPublished');
add_action('woocommerce_new_product', 'productPublished');
function productPublished($product_id){
//...
}
您可以在此处的 Woo 源代码中找到它们(触发它们的位置):
https://docs.woocommerce.com/wc-apidocs/source-class-WC_Product_Data_Store_CPT.html#237
我实际上是通过首先找到用于保存产品的源代码的位置来向后查找它们,然后在这些方法中查找挂钩(创建/更新)。
//found on Line 134 method create
do_action( 'woocommerce_new_product', $id );
//found on Line 237 method update
do_action( 'woocommerce_update_product', $product->get_id() );
您还必须更改此行:
function productPublished ($ID , $post , $update){
$product = wc_get_product( $post->ID);
}
到
function productPublished($product_id){
$product = wc_get_product( $product_id);
//....
}
我认为其他参数(缺少的)与您的代码无关。比如更新或新产品,我也没有看到 $post 用于获取我们已经拥有的产品 ID。
更新(确定回调参数)
如果您不确定回调的参数,您可以查看源代码(就像我在上面所做的那样)或者如果您可以在文档中找到它或者作为最后的手段,您可以简单地输出它们。输出它们的最佳方式是这 3 个
这是一个示例,我使用以 WordPress 为模型的最小/简化的工作挂钩系统构建。出于测试原因,并且因为当您知道它是如何工作时,构建它真的不那么难:
//global storage (functions, not classes)
global $actions;
$actions = [];
//substitute wordpress add_action function (for testing only)
function add_action($action, $callback, $priorty=10, $num_args=1){
global $actions;
$actions[$action][] = [
'exec' => $callback,
'priorty'=>$priorty,
'num_args' => $num_args
];
}
//substitute wordpress do_action function (for testing only)
function do_action($action, ...$args){
// PHP5.6+ variadic (...$args) wraps all following arguments in an array inside $args (sort of the opposite of func_get_args)
global $actions;
if(empty($actions[$action])) return;
//sort by priory
usort($actions[$action], function($a,$b){
//PHP7+ "spaceship" comparison operator (<=>)
return $b['priorty']<=>$a['priorty'];
});
foreach($actions[$action] as $settings){
//reduce the argument list
call_user_func_array($settings['exec'], array_slice($args, 0, $settings['num_args']));
}
}
//test callback
function callback1(){
echo "\n\n".__FUNCTION__."\n";
print_r(func_get_args());
}
//test callback
function callback2(){
echo "\n\n".__FUNCTION__."\n";
try{
//throw an empty exception
throw new Exception;
}catch(\Exception $e){
//pre tags preserve whitespace (white-space : pre)
echo "<pre>";
//output the stacktrace of the callback
echo $e->getTraceAsString();
echo "\n\n</pre>";
}
}
//Register Hook callbacks, added in opposite order, sorted by priority
add_action('someaction', 'callback2', 5, 4);
add_action('someaction', 'callback1', 1, 5);
//execute hook
do_action('someaction', 1234, 'foo', ['one'=>1], new stdClass, false);
输出:
callback2
<pre>#0 [...][...](25): callback2(1234, 'foo', Array, Object(stdClass))
#1 [...][...](52): do_action('someaction', 1234, 'foo', Array, Object(stdClass), false)
#2 {main}
</pre>
callback1
Array
(
[0] => 1234
[1] => foo
[2] => Array
(
[one] => 1
)
[3] => stdClass Object
(
)
[4] =>
)
Sandbox
Stacktrace 正如您在第一个输出中看到的那样,我们有一个完整的应用程序堆栈跟踪(减去编辑信息),包括函数调用和用于这些调用的参数。另请注意,在此示例中,我第二次注册它,但优先级(在add_action 中设置)使其首先执行。最后,仅使用了 5 个参数中的 4 个(也与 add_action 的调用方式有关)。
所以do_action 是这样调用的(带有“动作”和其他 5 个参数):
do_action('someaction', 1234, 'foo', Array, Object(stdClass), false)
实际的回调是这样调用的(没有“action”,只有 4 个其他参数):
callback2(1234, 'foo', Array, Object(stdClass))
Function Arguments 这有点困难,但它不会给你原始调用,所以你不会知道 args 的最大数量(你可以从调用堆栈跟踪中的 do_action )。但是,如果您只是想快速查看传入的数据,那么它是完美的。另外我应该提到这个使用所有 5 个参数,您可以在数组中清楚地看到第二个输出。 [4] => 是假的,这通常是print_r 显示假的方式(因为只是空的)。
调试回溯不幸的是,debug_print_backtrace 在沙箱中被禁用(出于安全原因),并且异常堆栈跟踪被大量编辑(通常它具有文件名和函数被调用的行并位于) 也是出于安全原因。这两个都可以从连接到数据库之类的东西返回参数,例如,它将包含纯文本的数据库密码。不管怎样,debug_print_backtrace 非常接近异常堆栈跟踪的样子。
夏天
但无论如何,这应该让您了解数据的样子。我们可以使用这样的函数(和反射)在运行时询问应用程序。我相信还有其他/更多方法可以做类似的事情。
PS。不言而喻,但无论如何我都会说,上面的这些方法适用于任何 PHP 函数,并且非常有用。同样如上所述,您永远不应该在实时生产机器上显示堆栈跟踪。
无论如何,祝你好运。