2017-12-13 3 views
0

Guten Tag,WooCommerce Haken woocommerce_cancelled_order

Dies ist mein erstes Mal mit Stackoverflow, schön, Sie alle zu treffen.

Anywho, Ich schreibe ein Plugin für WooCommerce und ich erstatte automatisch eine Bestellung zurück, wenn es abgebrochen wird. Mein Code funktioniert gut, wenn ich ihn manuell in einer separaten Datei ohne den Haken ausführe, aber mit meinem Haken scheint er nicht ausgeführt zu werden. Ich mache folgendes:

add_action('woocommerce_cancelled_order','change_status_to_refund', 10, 1); 
function change_status_to_refund($order_id) { 
wp_redirect(home_url()); 
    $order = new WC_Order($order_id); 

if('refunded' == $order->get_status()) { 
    return false; 
} 


if(!($order->is_paid())) { 
    return false; 
} 


$noRefundLimit = 24 * 60; //in minutes until booking 
$customer_orders = get_posts(array(
'numberposts' => 1, 
'post_parent' => $order_id, 
'post_type' => 'wc_booking', // WC orders post type 
'post_status' => 'paid, complete' // Only paid, completed bookings 
)); 
$bookingId = current($customer_orders)->ID; 

$bookingStart = current(get_post_meta($bookingId, "_booking_start")); 
$time = (new DateTime($bookingStart, new 
DateTimeZone("America/Los_Angeles")))->getTimestamp(); 
$nowTime = (new DateTime())->getTimestamp(); 
$difference = round(($time - $nowTime)/60);//in minutes 

if($difference >= $noRefundLimit) { 
    $refundPercentage = 1; //how much will we give back? fraction of 1. 
    // Get Items 
    $order_items = $order->get_items(); 

    // Refund Amount 
     $refund_amount = 0; 
    // Prepare line items which we are refunding 
    $line_items = array(); 

    if ($order_items) { 
     foreach($order_items as $item_id => $item) { 
     $refund_amount += $item->get_total(); 
     } 
    } 
    $refund_amount = ($refund_amount * $refundPercentage); 
    $refund_reason = "Order Cancelled"; 
    $refund = wc_create_refund(array(
     'amount'   => $refund_amount, 
     'reason'   => $refund_reason, 
     'order_id'  => $order_id, 
     'line_items'  => $line_items, 
     'refund_payment' => true 
     )); 

     var_dump($refund); 

     $order->update_status('wc-refunded', 'Order Cancelled And Completely 
Refunded'); 
     $order->save(); 
} 

Ich habe die erste Umleitung Linie für den alleinigen Zweck der Prüfung hinzugefügt, wenn es leitet, die es nicht! Irgendeine Idee, warum dieser Haken nicht feuert?

Antwort

0

Vielen Dank für Ihren Kommentar. Es sieht so aus, als ob der Haken "woocommerce_order_status_cancelled" gut ist, aber der Parameter ist $ order_id. Nach einer enormen Menge an Debugging habe ich folgendes:

add_action('woocommerce_order_status_cancelled', 'change_status_to_refund', 
21, 1); 
function change_status_to_refund($order_id) { 

$order = new WC_Order($order_id);  

$noRefundLimit = 24 * 60; //in minutes until booking 

global $wpdb; 
$querystr = " 
SELECT $wpdb->posts.* 
FROM $wpdb->posts 
WHERE $wpdb->posts.post_parent = $order_id 
"; 

$pageposts = $wpdb->get_results($querystr, OBJECT); 

$bookingId = current($pageposts)->ID; 

$bookingStart = current(get_post_meta($bookingId, "_booking_start")); 
$time = (new DateTime($bookingStart, new 
DateTimeZone("America/Los_Angeles")))->getTimestamp(); 
$nowTime = (new DateTime())->getTimestamp(); 
$difference = round(($time - $nowTime)/60);//in minutes 

if($difference >= $noRefundLimit) { 
    $refundPercentage = 1; //how much will we give back? fraction of 1. 
    // Get Items 
    $order_items = $order->get_items(); 

    // Refund Amount 
     $refund_amount = 0; 
    // Prepare line items which we are refunding 
    $line_items = array(); 

    if ($order_items) { 
     foreach($order_items as $item_id => $item) { 
     $refund_amount += $item->get_total(); 
     } 
    } 
    $refund_amount = ($refund_amount * $refundPercentage); 
    $refund_reason = "Order Cancelled"; 
    $refund = wc_create_refund(array(
     'amount'   => $refund_amount, 
     'reason'   => $refund_reason, 
     'order_id'  => $order_id, 
     'line_items'  => $line_items, 
     'refund_payment' => true 
     )); 

     $order->update_status('wc-refunded', 'Order Cancelled And Completely 
     Refunded'); 
    } 
} 

Ich hatte ein paar Probleme. $ order-> is_paid() gibt false zurück, obwohl die Bestellung bezahlt wurde (ich denke, das liegt daran, dass sich der Status von bezahlt zu storniert/erstattet geändert hat), so dass mein Code nicht einmal so weit gekommen ist. Dann funktionierte get_posts nicht wie erwartet. Ich wurde gezwungen, $ wpdb zu verwenden. Danach hat mein Code funktioniert.

Verwandte Themen