मैंने एक PHP फ़ंक्शन बनाया है जो गणना करता है कि WordPress/WooCommerce ऑर्डर कितना पुराना है। यदि आदेश 90 दिनों से अधिक पुराना है तो इसे रद्द कर दिया जाना चाहिए। समारोह पूरी तरह से काम करता था। हालांकि, नए साल 2020 के बाद से इसने काम करना बंद कर दिया है। मैं यह मानूंगा क्योंकि समारोह वर्ष के बारे में भ्रमित हो जाता है क्योंकि आज से -90 दिन वर्ष 2019 है। मैं पिछले वर्षों/2019 के साथ गणना कैसे कर सकता हूं?

मैंने mdy के बजाय वर्डप्रेस कोडेक्स से अलग-अलग दिनांक स्वरूपों के साथ खेलने का प्रयास किया है। हालांकि, इससे कोई फर्क नहीं पड़ता।

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

    // set time to expire
    $time_to_expire = "-90 days";
    $expiration_date = date("m/d/y", 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('m/d/y', $order->ID );

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

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

add_action( 'admin_footer', 'expire_after_x_days' );
1
TurboTobias 1 फरवरी 2020, 13:20

3 जवाब

सबसे बढ़िया उत्तर

आप एक UPDATE क्वेरी को WHERE क्लॉज के साथ चलाकर इसे बहुत आसान बना सकते हैं, ताकि केवल 90 दिनों से अधिक पुराने ऑर्डर प्राप्त किए जा सकें। उन सभी को लाने और परिणामों पर लूप करने की आवश्यकता नहीं है।

आपको post_created को अपने कॉलम के वास्तविक नाम पर सेट करना होगा।

function expire_after_x_days() {
    global $wpdb;

    $result = $wpdb->query("UPDATE $wpdb->posts 
                            SET post_status = 'wc-cancelled'
                            WHERE post_type = 'shop_order' 
                              AND post_status = 'wc-processing'
                              AND post_created < DATE_SUB(NOW(), INTERVAL 90 DAY)");
} 
2
Qirel 1 फरवरी 2020, 13:57

आप उन चरों को डेटटाइम इंस्टेंस के रूप में मान रहे हैं, लेकिन वे तार हैं। यह $order_time < $expiration_date तार की तुलना वर्णानुक्रम में करता है, न कि उनके दिनांक अर्थ से। डेटटाइम क्लास का इस्तेमाल करें (https://www.php.net/manual/en/ इसके बजाय class.datetime.php)।

2
slepic 1 फरवरी 2020, 13:46

कृपया दिनांक प्रारूप को m/d/y से Y-m-d में बदलें। कृपया नीचे दिए गए कोड को देखें।

आप $order_time = '12/11/18' को संशोधित करके भी मैन्युअल रूप से जांच सकते हैं;

function expire_after_x_days(){
        global $wpdb;
        // Get current time
        $today = date("Y-m-d");

        // set time to expire
        $time_to_expire = "-90 days";
        $expiration_date = date("Y-m-d", 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('Y-m-d', $order->ID );
            // Compare order's time with current time
            //$order_time = '12/11/18';
                if ( $order_time < $expiration_date ){
                    //die("olde");
                        // Update order status    
                        $orders = array();
                        $orders['ID'] = $order->ID;
                        $orders['post_status'] = 'wc-cancelled';
                        wp_update_post( $orders );
                }else{
                    //echo 'not old date';die;
                }
            }
        }

} 
add_action( 'admin_footer', 'expire_after_x_days' );
1
dineshkashera 1 फरवरी 2020, 13:45