Woocommerce - schimbarea statusului comenzii din on-hold în pending payment
Încerc să automatizez schimbarea statusului comenzii din "on-hold" în "pending payment" odată ce un vânzător a marcat comanda ca fiind completată. În prezent, statusul implicit este "on-hold" când o comandă este creată, iar plata trebuie solicitată doar după ce produsul este livrat. Este posibil să actualizez statusul în "pending" după ce o anumită acțiune a fost efectuată?

Dacă ai nevoie să schimbi starea comenzii din PHP, iată cum poți face acest lucru.
$order = new WC_Order($order_id);
if (!empty($order)) {
$order->update_status( 'completed' );
}
Valori posibile: processing, on-hold, cancelled, completed
Această informație provine din woocommerce/includes/abstracts/abstract-wc-order.php

un pic întârziat, dar totuși greu de găsit...
Valori posibile
Bazat pe https://www.bozzmedia.com/posts/get-know-woocommerce-status-definitions/
"processing (în procesare), on-hold (în așteptare), cancelled (anulat), completed (finalizat), pending (în așteptare), failed (eșuat), refunded (rambursat)"
și acestea sunt susținute în clasa WooCommerce Order..
/woocommerce/includes/class-wc-order.php - În jurul liniei 108 sau pe acolo.
Presupunând că nu folosești un plugin capabil să adauge mai multe.

Aceasta va funcționa:
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
return 'pending';
}, 10, 2 );
DAR dacă o folosiți, schimbarea stării poate determina ca email-urile să nu fie trimise după ce o comandă este primită, deoarece trece prea repede din 'on hold' în 'pending', iar WooCommerce nu trimite email-uri în starea 'pending'. Am testat acest lucru și după câteva zile email-urile nu mai erau trimise, deși inițial a funcționat.

Da, pur și simplu adaugi acest cod atunci când vrei să schimbi starea și adaugi în interiorul acestei funcții.
add_action('woocommerce_order_status_changed','status_changed_processsing');
function status_changed_processsing( $order_id, $checkout = null ) {
global $woocommerce;
$order = new WC_Order( $order_id );
if(condiția ta aici){
//atribuie starea comenzii
$order->status = 'pending';
}
}

Bună sonalip3, mulțumesc pentru răspuns! Am adăugat condițiile mele, dar codul încă nu funcționează... add_action('woocommerce_order_status_changed','status_changed_processsing');
function status_changed_processsing( $order_id, $checkout = null ) {
global $woocommerce;
$order = new WC_Order( $order_id );
if( $order->status == 'on-hold' && $order->fulfillment_status == 'fulfilled' ){
//atribuie statusul comenzii
$order->status = 'pending';
}
}

Am testat folosind doar condiția de status 'on-hold' și funcționează dacă schimb atribuirea statusului comenzii cu: $order->update_status('pending'). Pot să te întreb, am nevoie să obțin fulfillment_status din tabela woocommerce_order_itemmeta, știi cum pot face asta folosind același order_id?

Nu știu ce plugin folosești pentru 'fulfillment_status', așa că încearcă să afișezi $order și verifică obiectul comenzii. Cel mai probabil, $order conține acel fulfillment_status. Adaugă asta înainte de condiție: echo '<pre>';print_r($order);exit; . Încearcă și vei vedea obiectul comenzii.

Pluginul este Woocommerce product vendor plugin, de unde provine fulfillment_status. Cum pot vedea unde sunt rezultatele afișării pentru a obține obiectul comenzii?

Este un plugin plătit, nu? Nu îl am. Așa că adaugă această linie: echo '<pre>';print_r($order);exit; după această linie: $order = new WC_Order( $order_id ); și verifică prin actualizarea statusului. Acesta este obiectul unde ar trebui să fie adăugat 'fulfillment_status'.

Da, este un plugin plătit. Am adăugat acest cod, dar nu văd nimic când îl rulez. Cum sau unde pot vedea rezultatele print_r echo?
