Php woocommerce产品保存后,wordpress/woocommerce挂钩会发生什么样的火灾
我想在用户创建并保存一个后,通过soap客户端将woocommerce产品数据发送到邮政公司的web服务。所以我需要一个在用户创建产品后触发的钩子。我搜索了很多,找到了一些wordpress和woodcommerce钩子,但没有一个做我的工作。发送日期之后,web服务返回一个应设置为产品sku的id。hear是我的函数代码:(参数来自save\u post\u产品挂钩) 我使用Php woocommerce产品保存后,wordpress/woocommerce挂钩会发生什么样的火灾,php,wordpress,woocommerce,hook-woocommerce,Php,Wordpress,Woocommerce,Hook Woocommerce,我想在用户创建并保存一个后,通过soap客户端将woocommerce产品数据发送到邮政公司的web服务。所以我需要一个在用户创建产品后触发的钩子。我搜索了很多,找到了一些wordpress和woodcommerce钩子,但没有一个做我的工作。发送日期之后,web服务返回一个应设置为产品sku的id。hear是我的函数代码:(参数来自save\u post\u产品挂钩) 我使用save\u post\u product操作。它似乎是在用户在输入名称和价格等之前单击“新产品”后触发的,因为默认产品
save\u post\u product
操作。它似乎是在用户在输入名称和价格等之前单击“新产品”后触发的,因为默认产品数据在我输入任何数据之前发送到web服务并生成和保存sku。
我使用transition\u post\u status
并将此代码添加到我的函数中:
if($old_status != 'publish' && $new_status == 'publish' &&
!empty($post->ID) && in_array( $post->post_type, array( 'product') )){
code...}
结果与save\u post\u product
相同。
我使用了publish\u产品
操作,结果没有改变。
我使用draft\u发布hook。它似乎在我输入产品名称和描述后启动。名称已发送到web服务,但价格和重量未发送。sku未保存到数据库(为什么??)。
我知道还有另一个问题,即声明save\u post
在post发布并保存到DB后激发。但我认为商业是不同的。在输入名称和描述之后,在输入价格等之前,似乎保存了post。
有什么建议吗?您希望采取的行动如下:
add_action('woocommerce_update_product', 'productPublished');
add_action('woocommerce_new_product', 'productPublished');
function productPublished($product_id){
//...
}
您可以在这里的Woo源代码中找到它们两个(触发它们的位置):
我实际上是通过首先查找保存产品的源代码,然后在这些方法中查找钩子(创建/更新)来向后查找它们的
您还必须更改此行:
function productPublished ($ID , $post , $update){
$product = wc_get_product( $post->ID);
}
到
我认为其他参数(缺少的)与代码无关。例如,如果它是一个更新或一个新产品,我也没有看到使用$post
,除了获取我们已经拥有的产品ID
更新(确定回调参数)
如果您不确定回调的参数,您可以查看源代码(正如我上面所做的),或者如果您可以在文档中找到它,或者作为最后的手段,您可以简单地输出它们。输出它们的最佳方法是以下3种方法之一
func\u get\u args()
-“返回包含函数参数列表的数组”
debug\u print\u backtrace()
Exception::getTraceAsString()
尝试/catch并抛出异常以输出堆栈跟踪
下面是我用一个模仿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);
实际的回调是这样调用的(没有“action”和其他4个参数):
函数参数这稍微向前推进了一点,但它没有给您原始调用,因此您不知道参数的最大数量(您可以从stacktrace中的do_操作调用中获得)。但是,如果您只想快速查看传入的数据,那么它是完美的。我还应该提到,这一个使用了所有5个参数,您可以在第二个输出的数组中清楚地看到。[4]=>
为false,这通常是打印\u r
显示false(仅为空)的方式
Debug Backtrace不幸的是,Debug\u print\u Backtrace
在沙箱中被禁用(出于安全原因),并且异常stacktrace也被严重编辑(通常它有文件名和行,函数从其中调用并位于其中)也是出于安全原因。这两种方法都可以从诸如连接到数据库之类的内容返回参数,例如,数据库将包含纯文本形式的DB密码。无论如何,debug\u print\u backtrace
与异常堆栈跟踪非常接近
夏季
但在任何情况下,这都应该让您了解数据的外观。我们可以使用这样的函数(和反射)在运行时询问应用程序。我相信还有其他/更多的方法可以做类似的事情
不用说,但我还是要说,上面这些方法适用于任何PHP函数,非常有用。同样如上所述,您不应该在实时生产机器上显示堆栈跟踪
无论如何,祝你好运。在输入名称和描述之后,在输入价格等之前保存帖子
这些字段可能保存在posteta
中,因此你需要一个在保存帖子元数据之后触发的钩子(这可能很难,因为插件经常使用帖子元数据)。例如,在PHPmyAdmin中查看posts
表,您将找不到名为price
或weight
的列。因此,为了能够存储这些数据,用户可以使用元表(这就是它的用途)。元表类似于key=>value
storage,而不是“普通”表。感谢您提及如何找到挂钩。它非常有用。我找到了另一种使用woocommerce\u process\u product\u meta的方法。优先级必须高于20。如何找到可以使用的参数列表?请查看源代码,或者在回调函数中使用func\u get\u args
我将展示一个示例
function productPublished ($ID , $post , $update){
$product = wc_get_product( $post->ID);
}
function productPublished($product_id){
$product = wc_get_product( $product_id);
//....
}
//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] =>
)
do_action('someaction', 1234, 'foo', Array, Object(stdClass), false)
callback2(1234, 'foo', Array, Object(stdClass))