当前位置: 首页 > 知识库问答 >
问题:

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

高运诚
2023-03-14

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

function productPublished ($ID , $post , $update){
$product = wc_get_product( $post->ID);
$user = get_option ('myUsername');
$pass = get_option ('myPassword');
$name = $product->get_name();
$price = $product->get_regular_price();
$weight = $product->get_weight() * 1000;
$count = $product->get_stock_quantity();
$description = $product->get_short_description();
$result = $client -> AddStuff ([
    'username' => $user,
    'password' => $pass,
    'name' => $name,
    'price' => $price,
    'weight' => $weight, 
    'count' => $count,
    'description' => $description,
    'percentDiscount' => 0
]);
$stuff_id=(int)$result->AddStuffResult;
update_post_meta($product->get_id(),'_sku',$stuff_id);
}

我使用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后激发。但我认为商业是不同的。似乎在输入名称和描述之后,在输入价格等之前保存帖子。有什么建议吗???


共有1个答案

上官思博
2023-03-14

您需要的行动如下:

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。

UPDATE(确定回调参数)

如果您不确定回调的参数,您可以查看源代码(如上所述),或者如果您可以在留档中找到它,或者作为最后手段,您可以简单地输出它们。输出它们的最佳方式是其中之一

  • func\u get\u args()-“返回包含函数参数列表的数组”http://php.net/manual/en/function.func-get-args.php

下面是一个我用一个模仿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] =>
)

沙盒

Stacktrace正如您在第一个输出中看到的,我们有一个完整的应用程序Stacktrace(减去编辑的信息),包括函数调用和用于这些调用的参数。还请注意,在本例中,我将其注册为第二个,但优先级(在add\u action中设置)使其首先执行。最后,只使用了5个参数中的4个(还涉及如何调用add_action)。

因此,do_action被这样调用(使用'action'和其他5个参数):

 do_action('someaction', 1234, 'foo', Array, Object(stdClass), false)

实际的回调是这样调用的(没有“action”和其他4个参数):

 callback2(1234, 'foo', Array, Object(stdClass))

函数参数这是一个更简单的问题,但是它没有给你原始的调用,所以你不知道参数的最大数量(你可以从stacktrace中的do_操作调用中得到)。但是,如果您只想快速查看传入的数据,那么它是完美的。我还应该提到,这一个使用了所有5个参数,您可以在第二个输出的数组中清楚地看到。[4]=

调试回溯不幸的是,debug_print_backtrace在沙盒中被禁用(出于安全原因),并且出于安全原因,异常堆栈跟踪被严重编辑(通常它具有从调用函数的文件名和行)。这两种方法都可以从连接到数据库之类的东西返回参数,例如,数据库将包含纯文本的数据库密码。无论如何,debug_print_backtrace非常接近异常堆栈跟踪的样子。

萨默里

但在任何情况下,这都应该让您了解数据的外观。我们可以使用这样的函数(和反射)在运行时询问应用程序。我相信还有其他/更多的方法可以做类似的事情。

不用说,但我还是要说,上面这些方法适用于任何PHP函数,非常有用。同样如上所述,您不应该在实时生产机器上显示堆栈跟踪。

不管怎样,祝你好运。

 类似资料:
  • 我试图通过WoodPress主题中的一个函数从WooCommerce获取产品类别 上面的代码返回一些产品,但是产品类别。 当我包括

  • 我想在“销售”和“常规”价格下显示每个产品的总储蓄,就像下面的图片一样:https://ibb.co/T8BxH9z.储蓄金额是计算出来的,它是可见的,但由于某种原因,我的货币不可见。所以,我想显示它像这个例子:"Ušteda: 2291,87 kn",现在,只有金额显示。网站链接:https://shop.mirakul.com.hr/. 这是我正在使用的代码。你知道为什么货币不见了吗? 提前感

  • 你在为它做什么?我在文件末尾(wp-content/plugins/woocommerce/woocommerce.php)写了这个字符串: 但当我从购物车中删除项目时,它就不起作用了! 但也不起作用

  • 我的购物车页面有问题。我遇到的问题是产品缩略图图像被裁剪,并且正在切断我的图像。 我转到产品显示设置并调整了缩略图大小,但缩略图图像仍然太小且被裁剪。 购物车页面图像 我想知道如何解决这个问题,有人能帮忙吗? 我还想了解如何将购物车页面上的产品图像更改为不同的图片,而不影响网站前端的产品图像。

  • 我正在使用一个自定义产品,客户可以在其中键入他们的自定义文本,这些文本将添加到购物车中。根据文本的大小,将设置一个不同的价格,逻辑完成了,我可以在product对象中看到新的价格。 看起来我可以用新的价格更改product对象,但是当我执行$Woocommerce->setup_product_data($PRODUCT_ID)时,我从admin-ajax.php返回状态500。 我已经找到了几个

  • 这就是我如何为产品变体添加管理自定义字段的方法: 保存产品变化的自定义字段保存: 将自定义字段值存储到变量数据中 该值保存并显示在单个产品页面中,但下面的函数不返回该值 尝试检索函数中自定义字段的值: 我需要得到的只是值(这是浮点数):