WooCommerce: Автоматическое заполнение оплаченных заказов (в зависимости от способов оплаты)
Обычно WooCommerce должна автоматически заполнять заказы на виртуальные продукты. Но это не так, и это настоящая проблема, даже такая ошибка, как.
Итак, на этом этапе вы можете найти несколько полезных вещей (но не очень удобных):
1) Фрагмент кода (который вы можете найти в документах WooCommerce):
/** * Auto Complete all WooCommerce orders. */ add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order'); function custom_woocommerce_auto_complete_order( $order_id ) { if ( ! $order_id ) { return; } $order = wc_get_order( $order_id ); $order->update_status( 'completed' ); }
Но этот фрагмент не работает для BACS*, Оплата при доставке и Чек способы оплаты. Это нормально для Paypal и кредитной карты способы оплаты через шлюзы.
*BACS - это способ оплаты прямым банковским переводом
И...
2) Плагин: Заказы на автозаполнение WooCommerce
Этот плагин работает для всех способов оплаты, но не для других Способов оплаты через шлюзы кредитных карт.
Мой вопрос:
Используя (в качестве основы) фрагмент WooCommerce в пункте 1:
Как я могу реализовать условный код на основе woocommerce способы оплаты?
Я имею в виду что-то вроде: если способы оплаты не являются "BACS", "Оплата при доставке" и "Чек", затем примените фрагмент кода (обновите статус до "завершено" для оплаченных заказов, касающихся виртуальных продуктов).
Я не являюсь мега-экспертом-программистом WooCommerce, поэтому я еще не нашел, как настроить способы оплаты в заказах woocommerce.
Некоторая помощь будет очень кстати.
Спасибо.
1 answers
Я нашел решение этой проблемы (Работает с WC 3+):
/**
* AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
*/
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
if ( ! $order_id )
return;
$order = wc_get_order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
return;
}
// "completed" updated status for paid Orders with all others payment methods
else {
$order->update_status( 'completed' );
}
}
Код входит в function.php файл активной дочерней темы (или активной темы).
С помощью этого поста: Как проверить способ оплаты заказа WooCommerce по идентификатору?
С этим: get_post_meta( $order_id, '_payment_method', true );
из хельгатевикинг
Способы оплаты банковским переводом, наложенным платежом и чеком игнорируются и сохраняют первоначальный заказ статус.
Обновлен код для совместимости с WC 3.0+ (2017-06-10)
Улучшенная версия для WooCommerce 3+ (2018)
add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1 );
function wc_auto_complete_paid_order( $order_id ) {
if ( ! $order_id )
return;
// Get an instance of the WC_Product object
$order = wc_get_order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
return;
// Updated status to "completed" for paid Orders with all others payment methods
} else {
$order->update_status( 'completed' );
}
}
Код входит в function.php файл активной дочерней темы (или активной темы).