WooCommerce 根据用户角色更改 BACS 订单状态
WooCommerce change BACS order status based on user roles
我收到几个客户选择“直接银行转账”的订单,然后他们改变了主意,想用信用卡付款。这很烦人,因为我必须手动将订单从“暂停”更改为“待付款”,以便他们可以通过“订单”下“我的帐户”中的“订单支付”端点用卡支付。
我一直在使用 自动将订单状态从“待定”更改为“待付款”。
// WooCommerce Change Order Status BACS Pending
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );
function bacs_order_payment_pending_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = new WC_Order( $order_id );
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status ) ) {
$order->update_status('pending');
} else {
return;
}
}
但由于我有多个用户资料(我也销售 B2B),这对我的商店来说并不实用。我正在尝试扩展此代码段以同时检查用户角色。我在我的其他片段中使用了以下内容。是否可以将以下逻辑添加到上面的代码段中?
$user = wp_get_current_user();
$roles = (array) $user->roles;
$roles_to_check = array('administrator', 'customer', 'shop_manager');
$compare = array_diff($roles, $roles_to_check);
if (empty($compare)){
这是我的尝试。
// WooCommerce Change Order Status BACS Pending
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );
function bacs_order_payment_pending_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = new WC_Order( $order_id );
$user = wp_get_current_user();
$roles = (array) $user->roles;
$roles_to_check = array('administrator', 'customer', 'shop_manager');
$compare = array_diff($roles, $roles_to_check);
if (empty($compare)){
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status ) ) {
$order->update_status('pending');
} else {
return;
}
}
你可以这样使用,在代码中添加注释注释
function bacs_order_payment_pending_order_status( $order_id ) {
// Get $order object
$order = wc_get_order( $order_id );
// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get user
$user = $order->get_user();
// Roles
$roles = (array) $user->roles;
// Roles to check
$roles_to_check = array( 'administrator', 'customer', 'shop_manager' );
// Compare
$compare = array_diff( $roles, $roles_to_check );
// Result is empty
if ( empty ( $compare ) ) {
if ( $order->get_payment_method() == 'bacs' && $order->has_status( 'on-hold' ) ) {
$order->update_status( 'pending' );
}
}
}
}
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );
可能会派上用场:WooCommerce: Get Order Info (total, items, etc) From $order Object
Woocommerce 3.4.0 版引入了一个更好的挂钩,允许更改设置为“on-hold”的 BACS 支付网关的默认状态。
使用这个钩子将:
- 简化代码,
- 避免在下 BACS 订单时向客户发出“on-hold”通知。
代码如下:
add_filter( 'woocommerce_bacs_process_payment_order_status','filter_process_payment_order_status_callback', 10, 2 );
function filter_process_payment_order_status_callback( $status, $order ) {
// Here set the user roles to check
$roles_to_check = array( 'administrator', 'customer', 'shop_manager' );
$user = $order->get_user(); // Get the WP_User Object
$compare = array_diff( $user->roles, $roles_to_check ); // compare
if ( empty ( $compare ) ) {
return 'pending';
}
return $status;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
Since WooCommerce 5+:
为 BACS 付款启用新订单电子邮件通知(发送给管理员):
由于挂单不发送电子邮件通知,您可以通过以下方式启用它
add_action( 'woocommerce_checkout_order_processed', 'pending_new_order_notification', 20, 1 );
function pending_new_order_notification( $order_id ) {
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Only for "pending" order status and BACS payments
if( $order->has_status( 'pending' ) && $order->get_payment_method() === 'bacs' )
{
// Send "New Email" notification (to admin)
WC()->mailer()->get_emails()['WC_Email_New_Order']->trigger( $order_id );
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
相关:Send an Email notification to the admin for pending order status in WooCommerce
有用:
相关:
最新更新的回答主题:
我收到几个客户选择“直接银行转账”的订单,然后他们改变了主意,想用信用卡付款。这很烦人,因为我必须手动将订单从“暂停”更改为“待付款”,以便他们可以通过“订单”下“我的帐户”中的“订单支付”端点用卡支付。
我一直在使用
// WooCommerce Change Order Status BACS Pending
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );
function bacs_order_payment_pending_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = new WC_Order( $order_id );
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status ) ) {
$order->update_status('pending');
} else {
return;
}
}
但由于我有多个用户资料(我也销售 B2B),这对我的商店来说并不实用。我正在尝试扩展此代码段以同时检查用户角色。我在我的其他片段中使用了以下内容。是否可以将以下逻辑添加到上面的代码段中?
$user = wp_get_current_user();
$roles = (array) $user->roles;
$roles_to_check = array('administrator', 'customer', 'shop_manager');
$compare = array_diff($roles, $roles_to_check);
if (empty($compare)){
这是我的尝试。
// WooCommerce Change Order Status BACS Pending
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );
function bacs_order_payment_pending_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
// Get an instance of the WC_Order object
$order = new WC_Order( $order_id );
$user = wp_get_current_user();
$roles = (array) $user->roles;
$roles_to_check = array('administrator', 'customer', 'shop_manager');
$compare = array_diff($roles, $roles_to_check);
if (empty($compare)){
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status ) ) {
$order->update_status('pending');
} else {
return;
}
}
你可以这样使用,在代码中添加注释注释
function bacs_order_payment_pending_order_status( $order_id ) {
// Get $order object
$order = wc_get_order( $order_id );
// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get user
$user = $order->get_user();
// Roles
$roles = (array) $user->roles;
// Roles to check
$roles_to_check = array( 'administrator', 'customer', 'shop_manager' );
// Compare
$compare = array_diff( $roles, $roles_to_check );
// Result is empty
if ( empty ( $compare ) ) {
if ( $order->get_payment_method() == 'bacs' && $order->has_status( 'on-hold' ) ) {
$order->update_status( 'pending' );
}
}
}
}
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );
可能会派上用场:WooCommerce: Get Order Info (total, items, etc) From $order Object
Woocommerce 3.4.0 版引入了一个更好的挂钩,允许更改设置为“on-hold”的 BACS 支付网关的默认状态。
使用这个钩子将:
- 简化代码,
- 避免在下 BACS 订单时向客户发出“on-hold”通知。
代码如下:
add_filter( 'woocommerce_bacs_process_payment_order_status','filter_process_payment_order_status_callback', 10, 2 );
function filter_process_payment_order_status_callback( $status, $order ) {
// Here set the user roles to check
$roles_to_check = array( 'administrator', 'customer', 'shop_manager' );
$user = $order->get_user(); // Get the WP_User Object
$compare = array_diff( $user->roles, $roles_to_check ); // compare
if ( empty ( $compare ) ) {
return 'pending';
}
return $status;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
Since WooCommerce 5+:
为 BACS 付款启用新订单电子邮件通知(发送给管理员):
由于挂单不发送电子邮件通知,您可以通过以下方式启用它
add_action( 'woocommerce_checkout_order_processed', 'pending_new_order_notification', 20, 1 );
function pending_new_order_notification( $order_id ) {
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Only for "pending" order status and BACS payments
if( $order->has_status( 'pending' ) && $order->get_payment_method() === 'bacs' )
{
// Send "New Email" notification (to admin)
WC()->mailer()->get_emails()['WC_Email_New_Order']->trigger( $order_id );
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
相关:Send an Email notification to the admin for pending order status in WooCommerce
有用:
相关:
最新更新的回答主题: