根据 WooCommerce 中的特定订单备注完成订单
Complete order based on specific order note in WooCommerce
我想创建一个代码片段来根据特定的订单备注(“Budbee 订单状态:已交付”)完成 Woocommerce 订单。我正在使用一个钩子来做这件事,我有一些代码,但它不起作用。谁能帮帮我吗? PHP 不是我的“母语”,所以我不确定我是否犯了错误以及在哪里犯了错误。
两个主要问题是:
- 我用的是右钩拳吗
woocommerce_new_customer_note
?
- 我的 PHP 代码正确吗?
代码如下:
add_action( 'woocommerce_new_customer_note', 'auto_complete_budbee_delivered' );
function auto_complete_budbee_delivered( $order_id, $customer_note ) {
if ($customer_note == "Budbee order status: Delivered") {
$order = wc_get_order( $order_id );
$order->update_status( 'completed' );
}
}
万分感谢!!
更新
我想我选错了钩子(客户备注,而不是订单备注)。它可能应该是:
/**
* Action hook fired after an order note is added.
*
* @param int $order_note_id Order note ID.
* @param WC_Order $order Order data.
*
* @since 4.4.0
*/
do_action( 'woocommerce_order_note_added', $comment_id, $this );
return $comment_id;
这里的问题是您只能返回 comment_id,而不是消息或 order_id。任何 edea 如何获得笔记的 order_id 和内容?这是来自@LuicTheAztec 共享的同一文档。 $this
是包含所有订单信息的对象吗?
已更新 (从 $args['customer_note']
中的数组键中删除了错误的 $
).
您没有以正确的方式为 woocommerce_new_customer_note
设置函数参数(参见 in the hook source code),因此请尝试以下操作:
add_action( 'woocommerce_new_customer_note', 'auto_complete_budbee_delivered' );
function auto_complete_budbee_delivered( $args ) {
if ( $args['customer_note'] == "Budbee order status: Delivered") {
$order = wc_get_order( $args['order_id'] );
$order->update_status( 'completed' );
}
}
现在应该可以更好地工作了。
编辑 (与您的问题编辑相关).
或者您最好使用 woocommerce_order_note_added
挂钩方式:
add_action( 'woocommerce_order_note_added', 'auto_complete_budbee_delivered', 10, 2 );
function auto_complete_budbee_delivered( $comment_id, $order ) {
$comment_obj = get_comment( $comment_id );
$customer_note = $comment_obj->comment_content;
if ( $customer_note == "Budbee order status: Delivered") {
$order->update_status( 'completed' );
}
}
如果备注内容正好是 "Budbee 订单状态:已送达"。
包含单词
//订单完整备注包含字符串
add_action( 'woocommerce_order_note_added', 'auto_complete_budbee_delivered', 10, 2 );
function auto_complete_budbee_delivered( $comment_id, $order ) {
$comment_obj = get_comment( $comment_id );
$customer_note = $comment_obj->comment_content;
$word = "Order complete";
$mystring = $customer_note;
if (strpos($mystring, $word) !== false) {
$order->update_status( 'completed' );
}
}
我想创建一个代码片段来根据特定的订单备注(“Budbee 订单状态:已交付”)完成 Woocommerce 订单。我正在使用一个钩子来做这件事,我有一些代码,但它不起作用。谁能帮帮我吗? PHP 不是我的“母语”,所以我不确定我是否犯了错误以及在哪里犯了错误。
两个主要问题是:
- 我用的是右钩拳吗
woocommerce_new_customer_note
? - 我的 PHP 代码正确吗?
代码如下:
add_action( 'woocommerce_new_customer_note', 'auto_complete_budbee_delivered' );
function auto_complete_budbee_delivered( $order_id, $customer_note ) {
if ($customer_note == "Budbee order status: Delivered") {
$order = wc_get_order( $order_id );
$order->update_status( 'completed' );
}
}
万分感谢!!
更新
我想我选错了钩子(客户备注,而不是订单备注)。它可能应该是:
/**
* Action hook fired after an order note is added.
*
* @param int $order_note_id Order note ID.
* @param WC_Order $order Order data.
*
* @since 4.4.0
*/
do_action( 'woocommerce_order_note_added', $comment_id, $this );
return $comment_id;
这里的问题是您只能返回 comment_id,而不是消息或 order_id。任何 edea 如何获得笔记的 order_id 和内容?这是来自@LuicTheAztec 共享的同一文档。 $this
是包含所有订单信息的对象吗?
已更新 (从 $args['customer_note']
中的数组键中删除了错误的 $
).
您没有以正确的方式为 woocommerce_new_customer_note
设置函数参数(参见 in the hook source code),因此请尝试以下操作:
add_action( 'woocommerce_new_customer_note', 'auto_complete_budbee_delivered' );
function auto_complete_budbee_delivered( $args ) {
if ( $args['customer_note'] == "Budbee order status: Delivered") {
$order = wc_get_order( $args['order_id'] );
$order->update_status( 'completed' );
}
}
现在应该可以更好地工作了。
编辑 (与您的问题编辑相关).
或者您最好使用 woocommerce_order_note_added
挂钩方式:
add_action( 'woocommerce_order_note_added', 'auto_complete_budbee_delivered', 10, 2 );
function auto_complete_budbee_delivered( $comment_id, $order ) {
$comment_obj = get_comment( $comment_id );
$customer_note = $comment_obj->comment_content;
if ( $customer_note == "Budbee order status: Delivered") {
$order->update_status( 'completed' );
}
}
如果备注内容正好是 "Budbee 订单状态:已送达"。
包含单词
//订单完整备注包含字符串
add_action( 'woocommerce_order_note_added', 'auto_complete_budbee_delivered', 10, 2 );
function auto_complete_budbee_delivered( $comment_id, $order ) {
$comment_obj = get_comment( $comment_id );
$customer_note = $comment_obj->comment_content;
$word = "Order complete";
$mystring = $customer_note;
if (strpos($mystring, $word) !== false) {
$order->update_status( 'completed' );
}
}