2016-05-10 4 views
3

Ich habe im Internet gesucht, lesen docs & Zeug, aber ich kann nicht herausfinden, Produkt in Checkout-Seite zu ersetzen.Woocommerce Ersetzen Sie Produkt im Warenkorb Nach Bestellung im Checkout Seite

Zu Ihrer Information, meine Hauptproduktseite befindet sich auf der Startseite und jedes Produkt, das ausgewählt wurde, wird zur Checkout-Seite weitergeleitet. Nun, hier ist ein Problem. Lassen Sie mich erklären ....

Sie sehen, ich habe einen Karussell-Schieberegler in Checkout-Seite, die Benutzer können ändern/ersetzen ihr Produkt (die bereits in ihren Warenkorb hinzugefügt), bevor sie zahlen.

form checkout.php

global $woocommerce; 
global $product; 
$items = $woocommerce->cart->get_cart(); 
foreach ($items as &$item){ 
    $id = $item['product_id']; 
} 
echo $id; 

<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" data-interval="false"> 
    <div class="carousel-inner" role="listbox"> 
    <?php 
      // Querying of product information retrieval 
      $args = array('post_type' => 'product', 'posts_per_page' => 4, 'orderby' =>'menu_order', 'order' =>'ASC'); 
      $loop = new WP_Query($args); 

      // Display each retrieved product 
       while ($loop->have_posts()) : 
       $loop->the_post(); 
       // WooCommerce global product variable. Refer: https://docs.woothemes.com/document/class-reference/ 
       global $product; 
       global $woocommerce; 
    ?> 
<div class="item <?php if ($product->id == $id) { ?> active <?php } ?>"> 
    <div class="p-big" id="p-custom-color"> 
      <strong><?php the_title(); ?></strong> 
    </div> 
    <div class="p-light-black">CANDIDATES</div> 
    <input type="hidden" id="product" name="productid" value="<?php echo $product->id; ?>"> 
</div> 
    <?php 
       endwhile; 
       wp_reset_query(); // After the loop ended, quit the custom loop and reset back the main loop 
    ?> 
    </div> 
</div> 


<!-- Upon form submission --> 
if (isset($_POST['woocommerce_checkout_place_order'])){ 

    global $woocommerce; 
    $woocommerce->cart->empty_cart(); // Empty the cart 

    $selectedproduct = $_POST['selectedproductid']; // Get the selected product 
    do_shortcode('[add_to_cart id="' . $selectedproduct . '"]'); // Insert the selected product in the the cart 
    return esc_url(wc_get_checkout_url()); // Redirect to Payment Gateway Page 
} 

<form name="checkout" method="post" class="checkout woocommerce-checkout" action="" enctype="multipart/form-data"> 

    <?php if (sizeof($checkout->checkout_fields) > 0) : ?> 

    <?php do_action('woocommerce_checkout_before_customer_details'); ?> 

    <?php do_action('woocommerce_checkout_billing'); ?> 

    <?php do_action('woocommerce_checkout_after_customer_details'); ?> 

    <?php endif; ?> 


      <h3 id="order_review_heading"><?php _e('Your order', 'woocommerce'); ?></h3> 

    <?php do_action('woocommerce_checkout_before_order_review'); ?> 

      <div id="order_review" class="woocommerce-checkout-review-order"> 
       <!-- Checkout Review --> 
       <input type="hidden" id="selectedproduct" name="selectedproductid" value=""> 
       <?php do_action('woocommerce_checkout_order_review'); ?> 
      </div> 

    <?php do_action('woocommerce_checkout_after_order_review'); ?> 

</form> 

Wie Sie im Karussell sehen können, ich <input type="hidden" id="product" name="productid" value="<?php echo $product->id; ?>"> enthalten sind, jedes Produkt-ID zu erhalten und mit meinen jQuery (ich nicht hier zeigen), I Nehmen Sie eine Produkt-ID, die das Produkt derzeit auf der aktiven Folie ist, und füllen Sie es im Formular <input type="hidden" id="selectedproduct" name="selectedproductid" value="">.

Damit kann ich das Produkt ersetzen, die auf den aktiven Schlitten mit diesem Code mit dem ausgewählten/gewählten Produkt in der Warenkorb gelegt wurden auf der Grundlage (über der Form entfernt): -

<!-- Upon form submission --> 
if (isset($_POST['woocommerce_checkout_place_order'])){ 

    global $woocommerce; 
    $woocommerce->cart->empty_cart(); // Empty the cart 

    $selectedproduct = $_POST['selectedproductid']; // Get the selected product 
    do_shortcode('[add_to_cart id="' . $selectedproduct . '"]'); // Insert the selected product in the the cart 
    return esc_url(wc_get_checkout_url()); // Redirect to Payment Gateway Page 
} 

Das Problem hier ist, es fehlgeschlagen, das alte Produkt mit dem aktuellen gewählten Produkt zu ersetzen und es nur umleiten, um die Zahlung Gateway-Seite mit dem alten Produkt.

Ich möchte es ersetzen Sie das Produkt mit den neuen ausgewählten bei Auftragserteilung. Ist es möglich? Ich hoffe es ist so, weil ich seit Wochen mit WooCommerce spiele und ich möchte nicht, dass meine Bemühungen nutzlos sind. Helfen Sie mir Jungs .....

Antwort

1

Nach wenigen Tagen der Bezifferung dieses heraus, mit 30 + Chrome-Tabs, 50 + bestellt Test & 10 Gallonen Kaffee, schließlich fand ich die Antwort ...

add_action('woocommerce_checkout_process', 'change_product_upon_submission'); 
function change_product_upon_submission() { 
    if (!empty($_POST['_wpnonce']) && !empty($_POST['selectedproductid'])) { 
    $selectedproduct = $_POST['selectedproductid']; // Get the selected product 
    WC()->cart->empty_cart(); //Empty the cart 
    WC()->cart->add_to_cart($selectedproduct); // Insert the selected product in the cart 
    } 
} 

Der zum Auslösen dieser Funktion erforderliche Haken befindet sich innerhalb der WC_Checkoutprocess_checkout() Klasse in enthält/class-wc-checkout.php. Diese woocommerce_checkout_process existiert nicht WooCommerce Template-Dateien, wir werden gründlich sein. Also, um benutzerdefinierte Sachen zu tun, bevor Sie Daten an das Zahlungsportal senden, wenn Sie die Bestellung aufgeben, müssen wir den woocommerce_checkout_process Hook manipulieren, da die process_checkout() Funktion die Kasse abarbeitet, nachdem die Bestätigungstaste gedrückt wurde.

Hoffe, dass dies jemandes Leben retten, da ich keine habe, weil ich nach einigen Tagen des brennenden Mitternachtsöls schlafen muss, um diese Abscheulichkeit herauszufinden.

Verwandte Themen