php woocommerce_order_status_completed未触发

ddhy6vgd  于 9个月前  发布在  PHP
关注(0)|答案(6)|浏览(91)

我想写一个自定义插件,在woocommerce订单完成后做一些动作,但我不能让这个钩子工作。我可以看到这个问题问了很多次。
例如:https://wordpress.stackexchange.com/questions/134463/woocommerce-order-status-completed-action-hook-not-working
这里:https://wordpress.org/support/topic/woocommerce_order_status_completed-is-not-working
标签:https://wordpress.org/support/topic/woocommerce_order_status_completed-action-hook-not-working
但我不能帮助自己的答案,这些家伙收到。
我试着用几种不同的方式添加动作:

add_action( 'woocommerce_order_status_completed', 'ikwoocommerceorderstatuscompleted_func');

add_action( 'woocommerce_order_status_completed', array($this,'ikwoocommerceorderstatuscompleted_func'), 10, 1);

add_action( 'woocommerce_order_status_completed', array(&$this,'ikwoocommerceorderstatuscompleted_func'), 10, 1);

字符串
也尝试了一个类:

class IKHooks {
    function __construct() {
        add_action( 'woocommerce_order_status_completed', array($this,'ikwoocommerceorderstatuscompleted_func'), 10, 1);
    }

    public function ikwoocommerceorderstatuscompleted_func( $order_id ) {

    }
}


我甚至试图把这个动作放在课堂之外:

add_action( 'woocommerce_order_status_completed', array(IKHooks,'ikwoocommerceorderstatuscompleted_func'), 10, 1);


这些例子都不起作用。:(

vptzau2j

vptzau2j1#

在调用你的钩子之前检查以下步骤。
1.检查订单完成电子邮件是否已发送。
1.钩子在插件文件或主题functions.php中正确注册

add_action( 'woocommerce_order_status_completed','callback_function_name' );

function callback_function_name(){
  global $wp_filter;
  print_r($wp_filter);
  exit;
}

字符串
检查回调函数的名称是否在钩子数组中:

[woocommerce_order_status_completed] => Array
    (
        [10] => Array
            (
                [wc_paying_customer] => Array
                    (
                        [function] => wc_paying_customer
                        [accepted_args] => 1
                    )

                [wc_downloadable_product_permissions] => Array
                    (
                        [function] => wc_downloadable_product_permissions
                        [accepted_args] => 1
                    )

                [callback_function_name] => Array
                    (
                        [function] => callback_function_name
                        [accepted_args] => 3
                    )

            )

    )


如果你找到了它,那么一切正常,这意味着你的主题或functions.php文件可能有问题。检查文件中的钩子或回调函数,然后查找remove_actionremove_all_actions,这可能是阻止钩子被调用的原因。
也可以这样办理入住

add_action( 'woocommerce_order_status_completed', 'callback_function_name', 1);


将钩子的优先级从10更改为1,使其比任何其他操作或钩子都先被调用。

8yparm6h

8yparm6h2#

你可以用这个钩子

add_action( 'woocommerce_order_status_changed', 'your_function', 99, 4 );

字符串
这个函数看起来像

function your_function( $order_id, $old_status, $new_status, $order ){
    if( $new_status == "completed" ) {
        //your code here
    }
}

ifsvaxew

ifsvaxew3#

woocommerce_order_status_changedwoocommerce_order_status_completed实际上为我工作。经过2天的挣扎,我意识到,你只是不能var_dump或var_export或print_r或任何在管理面板,它只是不会工作。
所以,如果你是一个像我一样的新手,认为这些动作不起作用,只是尝试触发另一个动作,如发送邮件。
这段代码的工作原理:

function your_function( $order_id ){
   $order = new WC_Order( $order_id );
    $to_email = '[email protected]';
    $payment = $order->get_payment_method_title();
    $headers = 'From: Your Name <[email protected]>' . "\r\n";
    wp_mail($to_email, 'subject', $payment, $headers );
}

add_action( 'woocommerce_order_status_completed', 'your_function');

字符串

lf3rwulv

lf3rwulv4#

我以前遇到过类似的问题,并解决了它:
以下代码将订单状态更新为completed

add_action( 'woocommerce_thankyou', 'your_wc_autocomplete_order' );

function your_wc_autocomplete_order( $order_id ) {

 if ( ! $order_id ) {
   return;
 }

 $order = wc_get_order( $order_id );

 $order->update_status( 'completed' );

}

字符串
一旦订单完成,如果你想做一些事情,请参阅以下代码:

add_action('woocommerce_order_status_completed','payment_complete');

function payment_complete($order_id)
{
   //global $items;
   //$order = new WC_Order($order_id);
   // do something ...
}

62lalag4

62lalag45#

尝试使用action hook woocommerce_order_status_changed
它需要4个参数。order idold status*new statusorder。更多代码参考在这里
这可能不完全适合你的要求,但似乎是值得的替代品。

nr7wwzry

nr7wwzry6#

我想你可能在追这个人woocommerce_payment_complete

function mysite_woocommerce_payment_complete( $order_id ) {
    error_log( "Payment has been received for order $order_id", 0 );
}
add_action( 'woocommerce_payment_complete', 'mysite_woocommerce_payment_complete' );

字符串

相关问题