Deaktivieren der Schaltfläche „In den Warenkorb“ für bestimmte WooCommerce-Produkte

Lesezeit: 4 Minuten

Deaktivieren Sie den Artikelnamen Link fur ein bestimmtes Produkt in der
Farrukh Karimov

Ich versuche, das Hinzufügen bestimmter Produkte zum Warenkorb zu deaktivieren, bei denen das Kontrollkästchen “Auf Bestellung anrufen” (siehe Code unten) im Produkteditor aktiviert ist.

add_action( 'woocommerce_product_options_general_product_data', 'custom_general_product_data_custom_fields' );
/**
 * Add `Call to Order` field in the Product data's General tab.
 */
function custom_general_product_data_custom_fields() {
    // Checkbox.
    woocommerce_wp_checkbox(
        array(
            'id'            => '_not_ready_to_sell',
            'wrapper_class' => 'show_if_simple',
            'label'         => __( 'Call to Order', 'woocommerce' ),
            'description'   => __( '', 'woocommerce' )
            )
    );
}

add_action( 'woocommerce_process_product_meta', 'custom_save_general_proddata_custom_fields' );
/**
 * Save the data values from the custom fields.
 * @param  int $post_id ID of the current product.
 */
function custom_save_general_proddata_custom_fields( $post_id ) {
    // Checkbox.
    $woocommerce_checkbox = isset( $_POST['_not_ready_to_sell'] ) ? 'yes' : 'no';
    update_post_meta( $post_id, '_not_ready_to_sell', $woocommerce_checkbox );
}

add_filter( 'woocommerce_is_purchasable', 'custom_woocommerce_set_purchasable', 10, 2);
/**
 * Mark "Not ready to sell" products as not purchasable.
 */
function custom_woocommerce_set_purchasable() {
    $not_ready_to_sell = get_post_meta( get_the_ID(), '_not_ready_to_sell' , true);

    return ( 'yes' == $not_ready_to_sell ? false : true );

}

add_filter( 'woocommerce_product_add_to_cart_text', 'custom_product_add_to_cart_text' );
/**
 * Change "Read More" button text for non-purchasable products.
 */
function custom_product_add_to_cart_text() {
    $not_ready_to_sell = get_post_meta( get_the_ID(), '_not_ready_to_sell', true );

    if ( 'yes' === $not_ready_to_sell ) {
        return __( 'Call to Order', 'woocommerce' );
    } else {
        return __( 'Add to Cart', 'woocommerce' );
    }
}

Die Produkte, bei denen das Kontrollkästchen aktiviert ist, sind tatsächlich nicht käuflich, was das gewünschte Ergebnis ist.

Das Problem, das ich habe, ist, wenn ich auf der Produktkatalogseite für käufliche Produkte (diejenigen, bei denen das Kontrollkästchen nicht aktiviert ist) auf „In den Warenkorb“ klicke, werde ich zur Produktseite weitergeleitet und eine Standard-WooCommerce-Nachricht „Sorry, this product not be gekauft.” erscheint. Was passieren sollte, ist, dass das Produkt automatisch zum Warenkorb hinzugefügt wird, wenn auf die Schaltfläche “In den Warenkorb” geklickt wird.

Auch von der Einzelproduktseite aus kann ich problemlos den käuflichen Warenkorb hinzufügen.

Ich bin mir nicht sicher, warum dies auf diese Weise geschieht. Irgendwelche Ideen?

Ich habe Ihren Code getestet und er funktioniert ohne Probleme… Ich habe nicht das problematische Verhalten, das Sie beschreiben… Also etwas anderes macht probleme:

Sie müssen zuerst ein Datenbank-Backup erstellen… Dann sollten Sie Folgendes versuchen:

  1. Überprüfen Sie, ob in Ihren anderen Anpassungen etwas das Hinzufügen von Ajax zum Warenkorb deaktiviert und diese Meldung angezeigt wird. Versuchen Sie, Ihre anderen Anpassungen zu kommentieren, um die schuldige zu finden.
  2. Versuchen Sie, alle Plugins von Drittanbietern im Zusammenhang mit Woocommerce zu deaktivieren (außer Woocommerce). Wenn das Problem behoben ist, aktivieren Sie sie nacheinander wieder, um die Schuldigen zu finden.

Das Problem könnte auch vom Thema herrühren.


Jetzt seit Woocommerce 3 und eingeführte CRUD-Objektedein Code ist etwas veraltet.

Hier ist eine überarbeitete und verbesserte Codeversion (für Woocommerce 3+):

// Add a custom field in the Product data's General tab (for simple products).
add_action( 'woocommerce_product_options_general_product_data', 'add_general_product_data_custom_field' );
function add_general_product_data_custom_field() {
    woocommerce_wp_checkbox( array( // Checkbox.
        'id'            => '_not_ready_to_sell',
        'label'         => __( 'Call to Order', 'woocommerce' ),
        'wrapper_class' => 'show_if_simple',
    ) );
}

// Save custom field value
add_action( 'woocommerce_admin_process_product_object', 'save_general_product_data_custom_field', 10, 1 );
function save_general_product_data_custom_field( $product ) {
    $product->update_meta_data( '_not_ready_to_sell', isset( $_POST['_not_ready_to_sell'] ) ? 'yes' : 'no' );
}

// Make not purchasable, products with '_not_ready_to_sell' meta data set to "yes" (for simple products)
add_filter( 'woocommerce_is_purchasable', 'filter_woocommerce_set_purchasable', 10, 2);
function filter_woocommerce_set_purchasable( $purchasable, $product ) {
    return 'yes' === $product->get_meta( '_not_ready_to_sell' ) && $product->is_type('simple') ? false : $purchasable;

}

// Change button text to "Call to Order" for simple products not purchasable.
add_filter( 'woocommerce_product_add_to_cart_text', 'filter_product_add_to_cart_text', 10, 2 );
function filter_product_add_to_cart_text( $button_text, $product ) {
    if ( 'yes' === $product->get_meta( '_not_ready_to_sell' ) && $product->is_type('simple') ) {
        $button_text =  __( 'Call to Order', 'woocommerce' );
    }
    return $button_text;
}

Der Code geht in die function.php-Datei Ihres aktiven untergeordneten Designs (oder aktiven Designs). Es könnte funktionieren.

  • Ich habe Ihren Code anstelle von meinem hinzugefügt, und es funktioniert !! Den Ausschnitt habe ich oben gefunden sridharkatakam.com/…, also ist es vielleicht etwas veraltet für WooCommerce 3.0+. Danke für deine Hilfe! Schätze es wirklich!

    – Farrukh Karimow

    25. März 2019 um 1:57 Uhr

1004900cookie-checkDeaktivieren der Schaltfläche „In den Warenkorb“ für bestimmte WooCommerce-Produkte

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

Privacy policy