2016-07-18 17 views
3

Ich habe einen benutzerdefinierten Produkttyp in woocommerce namens Booking erstellt. HierWooCommerce Benutzerdefinierter Produkttyp - Mehrere Artikel zum Warenkorb hinzufügen Problem

ist der Code, den ich habe:

class WC_Product_Booking extends WC_Product{ 
    /** 
    * __construct function. 
    * 
    * @access public 
    * @param mixed $product 
    */ 
    public function __construct($product) { 
     $this->product_type = 'booking'; 
     $this->supports[] = 'ajax_add_to_cart'; 
     parent::__construct($product); 
     add_action('woocommerce_booking_add_to_cart', array($this, 'add_to_cart'),30); 
    } 

    private function show_pricing_fields(){ 
     ?><script type='text/javascript'> 
     jQuery(document).ready(function() { 
      jQuery('.options_group.pricing').addClass('show_if_booking').show(); 
     }); 
     </script><?php 
    } 
    /** 
    * Display the add to cart button (same as for simple product) 
    */ 
    public function add_to_cart() { 
     wc_get_template('single-product/add-to-cart/simple.php'); 
    } 
} 

Im Moment ist das einzige Problem ist, dass der Abschnitt hinzufügen auf der Produktseite des Warenkorb 6-mal angezeigt andI kann nicht herausfinden, warum.

Wie kann ich dieses Problem lösen?

Dank


@Update ... Lösung(wie LoicTheAztec hat mich auf dem richtigen Weg):

Ich habe eine Lösung für dieses Problem, mit diesem Code

gefunden
if (! function_exists('woocommerce_booking_add_to_cart')) { 

    /** 
    * Output the simple product add to cart area. 
    * 
    * @subpackage Product 
    */ 

    function booking_add_to_cart() { 
    wc_get_template('single-product/add-to-cart/simple.php'); 
    } 

    add_action('woocommerce_booking_add_to_cart', 'booking_add_to_cart'); 
} 

Der entscheidende Teil ist diese Aktion add_action('woocommerce_booking_add_to_cart', 'booking_add_to_cart');

Welches ist die Taste einmal an der richtigen Stelle in der Warenkorb legt - es ist eine Aktion in Ihrem eigenen Produkt zu bedienen genannt woocommerce_YOURPRODUCTTYPE_add_to_cart

Antwort

7

Versuchte Ihren Code auf einem Testserver zu testen, aber Ihre Buchungsprodukt wurde nicht im Backend angezeigt.

Ihr Problem könnte von hier kommen: Ich denke, Sie verwenden mit public function add_to_cart() eine bestehende Name-Funktion, und Sie müssen umbenennen-es anders.

Dann habe ich Ihren Code, based on this thread, erneut besucht.

Es ist sein kann besser WC_Product_Simple Klasse statt WC_Product Klasse zu erweitern, da Ihr Produkt einfaches Produkt verwendet Add-to-cart button Vorlage:
single-product/add-to-cart/simple.php.

Mit diesem benutzerdefinierten Code sehe ich nicht wie Sie mehrere in den Warenkorb Abschnitte.

- @ Update1 -
Aber man kann immer noch halten WC_Product statt WC_Product_Simple erweitert. Auf diese Art und Weise, wie Sie im Kommentar angefordert haben, ist Ihr Produkttyp "simple_booking" wie in der 1. und 2. Funktionen angegeben. Das bedeutet nicht, dass Ihr Produkt einfach ist (es ist nur ein Slug, den Sie ändern können, um zur gleichen Zeit an beiden Orten zu ändern).

So habe ich den Code geändert und erneut getestet: Es funktioniert ...

Dies ist der Code, den ich verwenden (und ich habe getestet):

/** 
* Register the custom product type after init 
*/ 
function register_simple_booking_product_type() { 

    /** 
    * This should be in its own separate file. 
    */ 
    class WC_Product_Booking extends WC_Product{ // <= changed back to WC_product class 

     public function __construct($product) { 

      $this->product_type = 'simple_booking'; 
      $this->supports[] = 'ajax_add_to_cart'; 

      parent::__construct($product); 

      // As we extend simple product class, you may not need this anymore. 
      add_action('woocommerce_booking_add_to_cart', array($this, 'simple_booking_add_to_cart'),30); 

     } 

    } 

} 
add_action('init', 'register_simple_booking_product_type'); 

// Registering the slug name (YOU can CHANGE IT) 
function add_simple_booking_product($types){ 

    // Key should be exactly the same as in the class product_type parameter 
    $types[ 'simple_booking' ] = __('Simple booking'); 

    return $types; 

} 
add_filter('product_type_selector', 'add_simple_booking_product'); 

/** 
* Show pricing fields for simple_booking product. 
*/ 
function simple_booking_custom_js() { 

    if ('product' != get_post_type()) : 
     return; 
    endif; 

    ?><script type='text/javascript'> 
     jQuery(document).ready(function() { 
      jQuery('.options_group.pricing').addClass('show_if_simple_booking').show(); 
     }); 
    </script><?php 
} 
add_action('admin_footer', 'simple_booking_custom_js'); 

// Not sure you will need that (because of the change of the extended class) 
function simple_booking_add_to_cart() { 
    wc_get_template('single-product/add-to-cart/simple.php'); 
} 

diesen Code getestet auf function.php Datei im aktiven Kind Thema (oder Thema).

Referenz: Adding a custom WooCommerce product type


- @ Update2 - Die Lösung(vom Autor dieser Frage finden):

Um setzt die Add-to-cart button einmal an der richtigen Stelle (um es in Ihrem eigenen benutzerdefinierten Produkt zu verwenden, machen Sie eine Aktion namens woocommerce_YOURPRODUCTTYPE_add_to_cart), mit diesem Code:

if (! function_exists('woocommerce_booking_add_to_cart')) { 

    /** 
    * Output the simple product add to cart area. 
    * 
    * @subpackage Product 
    */ 

    function booking_add_to_cart() { 
    wc_get_template('single-product/add-to-cart/simple.php'); 
    } 

    add_action('woocommerce_booking_add_to_cart', 'booking_add_to_cart'); 
} 
+0

Diese Lösung das einzige Problem, funktioniert jetzt, dass ich habe, ist, dass das Produkt-Typ als ** einfach gespeichert ** nicht ** ** Buchung in der Datenbank. Was für mich entscheidend ist, da ich die Vorlage basierend auf dem Produkttyp anzeige. – adam

+0

@ user998757 Aktualisiert meinen Code auf Füße Ihre Kommentar Bedürfnisse ... Es funktioniert immer noch – LoicTheAztec

+0

Ich habe eine Lösung gefunden, Ihr Code hat mich auf dem richtigen Weg, ich habe meinen Code aktualisiert, um diese Arbeit zu machen. – adam

Verwandte Themen