我想编写一个自定义插件,在woocommerce订单完成后执行某些操作,但我无法使用此挂钩。我可以多次看到这个问题。
此处: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);
这些例子都不起作用。 :(
答案 0 :(得分:9)
在你拥有钩子之前检查以下步骤。
检查您完成订单的时间是否收到任何有关订单完成电子邮件的电子邮件,您可以在管理信息中心的woocommerce设置中提供默认的woocommerce电子邮件。
在插件文件或主题functions.php
正确注册后,检查您的注册操作 woocommerce_order_status_completed 按照这种方式
add_action( 'woocommerce_order_status_completed', 'callback_function_name' );
global $wp_filter; // test is register action name with callback function
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文件中没有问题时工作。在整个插件或主题function.php中查找字符串,调用remove_action或remove_all_actions。
你也可以这样检查
add_action( 'woocommerce_order_status_completed', 'callback_function_name', 1);
将函数优先级10更改为1表示您的函数很快就会调用其他任何回调函数,并在此挂钩中注册。
抱歉英语不好。
答案 1 :(得分:4)
你可以使用这个钩子
add_action( 'woocommerce_order_status_changed', 'your_function', 99, 3 );
该功能看起来像
function your_function( $order_id, $old_status, $new_status ){
if( $new_status == "completed" ) {
//your code here
}
}
希望这会有所帮助。
答案 2 :(得分:1)
尝试使用动作挂钩woocommerce_order_status_changed
。它需要3个参数。 订单ID ,旧状态和新状态。进一步的代码参考HERE
这可能不完全适合您的要求,但似乎值得替代。希望这会有所帮助。
答案 3 :(得分:1)
我之前遇到过类似问题并将其解决为:
以下代码将订单状态更新为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 ...
}
希望它会起作用:)
答案 4 :(得分:1)
Error: Can't set headers after they are sent.
和woocommerce_order_status_changed
实际上适合我。经过2天的努力,我意识到你不能在管理面板中使用var_dump或var_export或print_r等任何东西,它就行不通。
因此,如果您是像我这样的新手,并认为这些行为不起作用,请尝试触发另一项操作,例如发送邮件。
此代码有效:
woocommerce_order_status_completed
答案 5 :(得分:0)
我想你可能会追问这个家伙。 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' );