Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php woocommerce产品保存后,wordpress/woocommerce挂钩会发生什么样的火灾_Php_Wordpress_Woocommerce_Hook Woocommerce - Fatal编程技术网

Php woocommerce产品保存后,wordpress/woocommerce挂钩会发生什么样的火灾

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操作。它似乎是在用户在输入名称和价格等之前单击“新产品”后触发的,因为默认产品

我想在用户创建并保存一个后,通过soap客户端将woocommerce产品数据发送到邮政公司的web服务。所以我需要一个在用户创建产品后触发的钩子。我搜索了很多,找到了一些wordpress和woodcommerce钩子,但没有一个做我的工作。发送日期之后,web服务返回一个应设置为产品sku的id。hear是我的函数代码:(参数来自save\u post\u产品挂钩)

我使用
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))