Fehlende Schaltfläche „In den Warenkorb“ bei benutzerdefiniertem Produkt

Lesezeit: 6 Minuten

Code:

<?php

// --- Product Type: re_subscription -- Custom Fields: type (mls / nomls), duration in days ---

// --- Actions & Filters ---

add_filter('product_type_selector', 're_add_subscription_product_type');
add_filter('woocommerce_product_data_tabs', 're_remove_shipping_menu', 10, 1);
add_filter('woocommerce_product_class', 're_subscription_product_class', 10, 2);

add_action('plugins_loaded', 're_create_subscription_product_type');
add_action('admin_footer', 're_subscription_admin_custom_js');
add_action('woocommerce_product_options_general_product_data', 're_add_custom_settings');
add_action('woocommerce_process_product_meta', 're_save_custom_settings');


// --- Create Product Type ---

function re_add_subscription_product_type($types){
    $types['re_subscription'] = __('RealEstate Subscription');
    return $types;
}

function re_create_subscription_product_type(){
     // declare the product class
     class WC_Product_Re_Subscription extends WC_Product{
        public function __construct($product) {
           $this->product_type="re_subscription";
           parent::__construct($product);
           // add additional functions here
        }

        /**
         * Get internal type.
         * Needed for WooCommerce 3.0 Compatibility
         * @return string
         */

        public function get_type() {
            return 're_subscription';
        }
    }
}

function re_subscription_product_class($classname, $product_type) {
    if ($product_type == 're_subscription')
        $classname="WC_Product_Re_Subscription";

    return $classname;
}


// --- Remove Shipping Menu ---

function re_remove_shipping_menu($tabs){
    /*
        The available tab array keys are:
        general, inventory, shipping, linked_product, attribute, variations, advanced
     */
    unset($tabs['shipping']);
    return $tabs;
}

// --- Show General Tab ---

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

    ?>
    <script type="text/javascript">
        jQuery(document).ready(function () {
            // For Price tab
            jQuery('.product_data_tabs .general_tab').show();
            jQuery('#general_product_data .pricing').addClass('show_if_re_subscription').show();

           });
    </script>
    <?php
}

// --- Add Fields ---

function re_add_custom_settings() {
    global $woocommerce, $post;
    $post_id = $post->ID;
    $re_is_mls = get_post_meta($post_id, 're_is_mls', true);
    if($re_is_mls == '')
        $re_is_mls="no";

    echo '<div class="options_group show_if_re_subscription">';
    // Duration
    woocommerce_wp_text_input(
      array(
       'id'                => 're_duration_field',
       'label'             => __('Duration in days', 'woocommerce' ),
       'placeholder'       => '30',
       'desc_tip'    => 'true',
       'description'       => __('Duration of the subscription in days', 'woocommerce'),
       'type'              => 'number',
       ));

    // Type
    woocommerce_wp_checkbox(
       array(
       'id'            => 're_is_mls',
       'label'         => __('Is this MLS?', 'woocommerce'),
       'value' => $re_is_mls,
    ));

    echo '</div>';
}

function re_save_custom_settings($post_id){
    // Save Duration field
    $re_duration_fielld = $_POST['re_duration_field'];
    if(!empty($re_duration_fielld))
        update_post_meta($post_id, 're_duration_field', esc_attr($re_duration_fielld));

    // Save MLS option
    $re_is_mls = isset($_POST['re_is_mls']) ? 'yes' : 'no';
    update_post_meta($post_id, 're_is_mls', $re_is_mls);
}

Bildschirmfoto: http://prntscr.com/hq4zzo

Bei einfachen Produkten wird die Schaltfläche zum Hinzufügen von Produkten zum Warenkorb angezeigt und funktioniert ohne Probleme, aber bei meinen benutzerdefinierten Produkten fehlt die Schaltfläche Zum Warenkorb hinzufügen. Der Preis wird immer noch gut angezeigt.

Ich habe auf /r/woocommerce gepostet und keine Antworten bekommen :/ in der Hoffnung auf etwas hier :3

Weiß jemand wo man suchen muss? Vielen Dank 🙂

Ähnlich wie die Antwort von Howdy_McGee, aber Aufruf do_action Anstatt von wc_get_template:

add_action( "woocommerce_{$my_product_type}_add_to_cart", function() {
    do_action( 'woocommerce_simple_add_to_cart' );
});

  • Dies funktioniert hervorragend auf der Produktseite, aber nicht auf der Loop-Seite. Irgendwelche Ideen, wie man “In den Warenkorb” auf der Loop-Seite für einen benutzerdefinierten Produkttyp aktivieren kann?

    – Bruno Kreuzer

    20. April 2020 um 1:37 Uhr

WooCommerce bekommt seine In den Warenkorb-Vorlage von Produktart. Im Vorlagenordner des WooCommerce-Plugins sehen wir:

plugins\woocommerce\templates\single-product\add-to-cart

Hier haben wir eine Vorlage, die HTML basierend auf dem Produkttyp enthält. Sie könnten einfach eine Funktion, einen Aufruf und eine Aktion mit Ihrem Typ erstellen, der die einfache Produktvorlage zurückgibt.

/**
 * Gives custom product type a template
 *
 * @return void
 */
function se47910821_answer() {
    wc_get_template( 'single-product/add-to-cart/simple.php' );
}
add_action( 'woocommerce_re_subscription_add_to_cart', 'se47910821_answer' );

Der Haken ist:

add_action( "woocommerce_{$product_type}_add_to_cart", 'callback_function' );

  • Danke, genau das, wonach ich gesucht habe 🙂 +1

    – Rens Tillmann

    8. April 2021 um 23:51 Uhr

Ich habe eine Weile damit gekämpft und was es schließlich behoben hat, war das Hinzufügen einer “add_to_cart_url()”-Methode in meiner “WC_Product_Custom”-Klasse, wie diese:

public function add_to_cart_url() {
    $url = $this->is_purchasable() && $this->is_in_stock() ? remove_query_arg( 'added-to-cart', add_query_arg( 'add-to-cart', $this->id ) ) : get_permalink( $this->id );

    return apply_filters( 'woocommerce_product_add_to_cart_url', $url, $this );
}

und dann manuell einen Link mit $product->add_to_cart_url() als href in der Aktion “woocommerce_single_product_summary” hinzufügen, wie folgt:

add_action( 'woocommerce_single_product_summary', 'custom_product_add_to_cart', 60 );
function custom_product_add_to_cart () {
    global $product;

    // Make sure it's our custom product type
    if ( 'my_custom_product' == $product->get_type() ) {
        do_action( 'woocommerce_before_add_to_cart_button' ); ?>

        <p class="cart">
            <a href="https://stackoverflow.com/questions/47910821/<?php echo esc_url( $product->add_to_cart_url() ); ?>" rel="nofollow" class="single_add_to_cart_button button alt">
                <?php echo "Add to cart"; ?>
            </a>
        </p>

        <?php do_action( 'woocommerce_after_add_to_cart_button' );
    }
}

Benutzer-Avatar
CRavon

Eine Ergänzung, da frühere Antworten nicht in der Schleife funktionieren (z. B. Shop- und Archiv-Produktseiten), wie Bruno Crosier betont. Außerdem habe ich die Unterstützung von Ajax zum Einkaufswagen-Button hinzugefügt. Sie müssen diese Funktionen, die Sie aus class-wc-product-simple.php kopiert haben, zu Ihrer benutzerdefinierten Produktklasse hinzufügen (und Sie können sie natürlich anpassen):

public function __construct($product) {
    $this->product_type = your_product_name;
    $this->supports[]   = 'ajax_add_to_cart';
    parent::__construct( $product );
}
public function add_to_cart_url() {
            $url = $this->is_purchasable() && $this->is_in_stock() ? remove_query_arg(
                'added-to-cart',
                add_query_arg(
                    array(
                        'add-to-cart' => $this->get_id(),
                    ),
                    ( function_exists( 'is_feed' ) && is_feed() ) || ( function_exists( 'is_404' ) && is_404() ) ? $this->get_permalink() : ''
                )
            ) : $this->get_permalink();
            return apply_filters( 'woocommerce_product_add_to_cart_url', $url, $this );
        }

        /**
         * Get the add to cart button text.
         *
         * @return string
         */
        public function add_to_cart_text() {
            $text = $this->is_purchasable() && $this->is_in_stock() ? __( 'Add to cart', 'woocommerce' ) : __( 'Read more', 'woocommerce' );

            return apply_filters( 'woocommerce_product_add_to_cart_text', $text, $this );
        }

        public function add_to_cart_description() {
        /* translators: %s: Product title */
        $text = $this->is_purchasable() && $this->is_in_stock() ? __( 'Add &ldquo;%s&rdquo; to your cart', 'woocommerce' ) : __( 'Read more about &ldquo;%s&rdquo;', 'woocommerce' );

        return apply_filters( 'woocommerce_product_add_to_cart_description', sprintf( $text, $this->get_name() ), $this );
        }

1175430cookie-checkFehlende Schaltfläche „In den Warenkorb“ bei benutzerdefiniertem Produkt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy