1

Warum kann ich die Daten aus einem Woocommerce-Checkout-Feld nicht abrufen, um Abonnementdaten als Bestellprozesse zu aktualisieren?Erhalte einen benutzerdefinierten Wert in einer WooCommerce-Abonnementbestellung

Ich möchte das nächste Erneuerungsdatum basierend auf der Frequenzanforderung des Kunden beim Auschecken aktualisieren. Hier ist mein Code:

1), um die Kasse Feld ein:

add_action('woocommerce_after_order_notes', 'hgf_custom_checkout_field'); 

function hgf_custom_checkout_field($checkout) { 
global $woocommerce; 

    woocommerce_form_field('frequency', array(
     'type'   => 'select', 
     'required'   => true, 
     'class'   => array('form-row-wide'), 
     'label'   => __('Change this any time, just email.'), 
     'options'  => array(
      'blank'  => __('Select frequency preference', 'woocommerce'),    
      1 => __('Every Week', 'woocommerce'), 
      2 => __('Every Other Week' , 'woocommerce'), 
      3 => __('Once Per Month' , 'woocommerce') 
       ) 
      ), $checkout->get_value('frequency')); 
      echo '</div>'; 
} 

2) Aktualisieren Sie die Bestellung Meta. Dadurch entsteht zwei benutzerdefinierte Felder auf dem Kundenauftrag sowie das Intervall Abrechnung aktualisiert auf dem Abonnement:

add_action('woocommerce_checkout_update_order_meta', 'hgf_checkout_field_update_order_meta'); 
function hgf_checkout_field_update_order_meta($order_id) { 

    if (! empty($_POST['frequency'])) { 

     update_post_meta($order_id, 'frequency', $_POST['frequency']); 
     update_post_meta($order_id, 'billing_interval', $_POST['frequency']); 
    } 

} 

3) Aktualisieren Sie das Verlängerungsdatum
Für den letzten Teil, kann ich das Verlängerungsdatum mit einem Dummy aktualisieren Datum meiner Wahl (zum Beispiel: $renewal date = "2018-12-15", aber wenn ich versuche es das 'billing_interval' Feld zu lesen zu bekommen, kehrt es in die else Standard

add_action('woocommerce_checkout_create_subscription', 'hgf_next_renewal'); 
    function hgf_next_renewal($subscription, $timezone='site') { 

     $billing_interval = get_post_meta(get_the_ID(), 'billing_interval', true); 

    if($billing_interval == 2) { 
     $renewal_date = date('Y-m-d H:i:s', strtotime("2017-10-01")) /* date('Y-m-d H:i:s', strtotime("+2 weeks")) */ ; 
    } if($billing_interval == 4) { 
     $renewal_date = date('Y-m-d H:i:s', strtotime("2017-12-01")) /* date('Y-m-d H:i:s', strtotime("+4 weeks")) */ ; 
    } else { 
     $renewal_date = date('Y-m-d H:i:s')) /* date('Y-m-d H:i:s', strtotime($renewal_date)) */ ; 
    } 

     $subscription->update_dates(array(
      'next_payment' => $renewal_date, 
      )); 

     return $subscription; 
    } 

Dies all die verschiedenen Möglichkeiten, die ich versucht habe.

012.351.
1) $billing_interval = $subscription->get_billing_interval(); 
2) $billing_interval = get_post_meta($subscription->get_ID(), 'billing_interval', true); 
3) $billing_interval = get_post_meta($order_id, 'billing_interval', true); 
4) $subscriptions = wcs_get_users_subscriptions($user_id); 
    foreach ($subscriptions as $sub) { 
     $billing_interval = get_post_meta($sub->get_order_number(), '_billing_interval', true); 
     } 
5) $billing_interval = $checkout->get_value('frequency'); 

Weiß jemand, warum ich keinen Wert von meinem Checkout-Feld während der Aktion 'woocommerce_checkout_create_subscription' abrufen kann?

Antwort

1

Wie Sie Ihre in den Bestellformularen Metadaten 'billing_interval' benutzerdefinierte Feld speichern, können Sie nicht dieses Feld werden durch das Abonnement Objekt oder ID bekommen ... Sie müssen erste die Eltern Bestell-ID zu erhalten.

Um die übergeordnete Order ID vom Abonnement Objekt Sie die WC_Order method get_parent_id()

So war es, dass Sie ganz normal verwenden müssen, wo nur Ihre "else" bekommen $renewal_date ...

So stellen Sie es in Ihrer Funktion so ein:

add_action('woocommerce_checkout_create_subscription', 'hgf_next_renewal'); 
function hgf_next_renewal($subscription, $timezone='site') { 

    // MISSING!: The parent order ID to set below 
    $order_parent_id = $subscription->get_parent_id(); 

    $billing_interval = get_post_meta($order_parent_id, 'billing_interval', true); 

    if($billing_interval == 2) { 
     $renewal_date = date('Y-m-d H:i:s', strtotime("2017-10-01")) /* date('Y-m-d H:i:s', strtotime("+2 weeks")) */ ; 
    } elseif($billing_interval == 4) { 
     $renewal_date = date('Y-m-d H:i:s', strtotime("2017-12-01")) /* date('Y-m-d H:i:s', strtotime("+4 weeks")) */ ; 
    } else { 
     $renewal_date = date('Y-m-d H:i:s', strtotime("2017-09-01")) /* date('Y-m-d H:i:s') */ ; 
    } 

    $subscription->update_dates(array(
     'next_payment' => $renewal_date, 
    )); 

    return $subscription; 
} 

Code geht in function.php Datei Ihres aktiven untergeordneten Themas (oder Themas) oder auch in eine beliebige Plugin-Datei.

Ich habe Ihren Code nicht wirklich getestet, aber es wirft keinen Fehler und sollte dieses Mal für Sie arbeiten.

+0

DANKE !! Ich habe damit stundenlang nichts erreicht (Tage?), Und dein Vorschlag hat es gelöst. DANKE!!! – aleks1217

+0

Wenn ich Ihnen 50 Stimmen geben könnte, würde ich '. :-D – aleks1217

+0

@ aleks1217 Dieser ist einfach sehr gut ... Danke :) – LoicTheAztec

Verwandte Themen