Ich versuche eine Funktion zu erstellen, die Bestellungen im WooCommerce Store überprüfen soll. Wenn der Status einer Bestellung nicht innerhalb von 10 Tagen von "Bearbeitung" auf "Abgeschlossen" geändert wurde, sollte die Funktion die Bestellung stornieren.

Ich habe wpdb gefunden, wo ich glaube, es geschafft zu haben, nach Bestellungen zu suchen, die älter als 10 Tage sind. Könnte mich jemand in die richtige Richtung weisen, wie ich von hier aus vorgehen soll? Ich gehe davon aus, dass ich eine Funktion erstellen muss, die WC_Order :: update_status () enthält, um den Auftragsstatus zu aktualisieren. Ich weiß nur nicht, wie ich das alles miteinander verbinden soll.

Ich habe den Wordpress-Codex durchgesehen und wpdb gefunden, das eine Reihe von Funktionen enthält, die für die Interaktion mit einer Datenbank verwendet werden. Ich gehe davon aus, dass ich wpdb in meiner Funktion verwenden muss, weiß aber nicht, wie ich von hier aus vorgehen soll.

Ich habe auch versucht, das native Wordpress-Cron durch ein echtes Cron zu ersetzen, das das Datum überprüft und den Status von Bestellungen aktualisiert. Nach einigen Recherchen hielt ich dies jedoch für einen zu komplizierten Weg, um mein Problem zu lösen.

function get_processing_expiry() {        
            global $wpdb;

            $processing_expiry = $wpdb->get_col( $wpdb->prepare( "
                    SELECT posts.ID
                    FROM {$wpdb->posts} AS posts
                    WHERE posts.post_status = 'wc-processing'
                    AND posts.post_date < %s
            ", date( 'Y-m-d H:i:s', strtotime('-10 days') ) ) );

            return $processing_expiry;
    }

Ich erwarte, dass sich der Bestellstatus von Bearbeitung zu Stornierung ändert, wenn die Bestellung länger als zehn Tage bearbeitet wurde.

0
TobiasM 25 Juni 2019 im 23:37

3 Antworten

Beste Antwort

Diese Funktion wird es handhaben:

function expire_after_x_days(){
        global $wpdb;
    // Get current time
        $today = date("mdy");

    // set time to expire
        $time_to_expire = "-10 days";
        $expiration_date = date("mdy", strtotime( $today . $time_to_expire));

    // Get orders with processing status
        $result = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_type = 'shop_order' AND post_status = 'wc-processing'");

        if( !empty($result)) foreach ($result as $order){
            // Get order's time
            $order_time = get_the_time('mdy', $order->ID );

    // Compare order's time with current time -10 days
        if ( $order_time < $expiration_date ){

    // Update order status    
                $orders = array();
                $orders['ID'] = $order->ID;
                $orders['post_status'] = 'wc-cancelled';
                wp_update_post( $orders );
            }
        }
} 

    // Use the best HOOK for your case 
    add_action( 'admin_footer', 'expire_after_x_days' );

    // OR simply call the function if you are pasting this in your functions.php 
0
João Teixeira 27 Juni 2019 im 07:04

In MySQL haben Sie viele Datums- und Zeitfunktionen, um zu überprüfen, ob ein Datensatz beispielsweise älter als 10 Tage ist. Hierfür können Sie INTERVAL wie folgt verwenden:

SELECT posts.ID
FROM {$wpdb->posts} AS posts
WHERE posts.post_status = 'wc-processing'
AND posts.post_date < NOW() - INTERVAL 10 DAY

Dann können Sie nur SQL verwenden, um es zu lösen.

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

0
René Höhle 25 Juni 2019 im 20:47

Sie können dies erreichen, ohne WP zu verwenden. Sie müssen mit geplanten MySQL-Ereignissen arbeiten. Dazu müssen Sie eine gespeicherte Prozedur Cancel_Orders () erstellen, die über eine Logik zum Löschen oder Stornieren von Bestellungen und zum Planen eines Ereignisses jeden Tag oder in einem bestimmten Intervall verfügt.

CREATE EVENT Cencel_Orders_Event
ON SCHEDULE EVERY 5 SECOND
DO
CALL Cancel_Orders();

Weitere Informationen finden Sie unter http://www.mysqltutorial.org/mysql-triggers / Working-MySQL-Scheduled-Event /

0
user2607417user2607417 27 Juni 2019 im 08:02