Отключение кнопки «Добавить в корзину» для определенных продуктов WooCommerce

Я пытаюсь отключить добавление в корзину определенных продуктов, для которых установлен флажок «Позвонить в заказ» (см. Код ниже) в редакторе продуктов.

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' );
    }
}

Продукты, отмеченные флажком, фактически не подлежат покупке, что является желаемым результатом.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю «Добавить в корзину» для покупаемых продуктов (тех, у которых флажок не установлен) на странице каталога продуктов, меня перенаправляют на страницу продукта и появляется сообщение WooCommerce по умолчанию «Извините, этот продукт не может быть куплено ". появляется. Что должно произойти, так это то, что при нажатии кнопки «Добавить в корзину» товар автоматически добавляется в корзину.

Кроме того, со страницы одного продукта я могу без проблем добавить покупаемую корзину.

Я не уверен, почему так происходит. Любые идеи?


person Farrukh Karimov    schedule 25.03.2019    source источник


Ответы (1)


Я протестировал ваш код, и он работает без проблем ... У меня нет проблемного поведения, о котором вы описываете ... Итак, что-то еще создает проблемы:

Сначала вам нужно будет сделать резервную копию базы данных ... Затем вы должны попробовать:

  1. Проверьте, есть ли в других ваших настройках что-то, что отключает добавление Ajax в корзину и вызывает появление этого сообщения. Попробуйте прокомментировать другие свои настройки, чтобы найти виноватую.
  2. Попробуйте отключить все сторонние плагины, связанные с Woocommerce (кроме Woocommerce). Если проблема исчезла, включите их по очереди, чтобы найти виновных.

Проблема тоже могла исходить из темы.


Теперь, поскольку Woocommerce 3 и представили объекты CRUD, ваш код немного устарело.

Вот обновленная и улучшенная версия кода (для 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;
}

Код размещается в файле function.php вашей активной дочерней темы (или активной темы). Это могло сработать.

person LoicTheAztec    schedule 25.03.2019
comment
Я добавил ваш код вместо своего, и он работает !! Я нашел фрагмент выше sridharkatakam.com/, поэтому возможно, он немного устарел для WooCommerce 3.0+. Спасибо за помощь! Действительно ценю это! - person Farrukh Karimov; 25.03.2019