Отображение пользовательского сообщения, когда продукт нельзя купить на отдельных страницах Woocommerce

Я создаю сайт, который является цветочным магазином. Некоторые цветы доступны сезонно. Используя плагин Advanced Custom Fields, я добавил настраиваемое поле в список типов сообщений о продуктах Woocommerce (флажок) из месяцев, чтобы выбрать, в какой продукт будет доступен.

Я смог отключить кнопку «Добавить в корзину» для тех месяцев, когда продукт не будет доступен, используя приведенный ниже код:

add_filter('woocommerce_is_purchasable', 'is_available', 10, 2);
function is_available() {
    // this is a field added using 'Advance Custom Fields' plugin 
    $months = get_field('availability');
    $currentMonth = date('F');

    if(in_array($currentMonth, $months))
        return true;
    else
        return false;
}

Код, который я использую, работает, он удаляет кнопку «Добавить в корзину» с соответствующей страницы отдельного продукта. Я хотел бы добавить сообщение, чтобы клиенты знали, почему оно недоступно. Как я могу это сделать?

Мне просто нужно знать, как я могу добавить сообщение, когда продукт недоступен.


person Muhammad Tauseef    schedule 30.03.2019    source источник


Ответы (3)


В вашем коде есть некоторые ошибки, например, две отсутствующие функциональные переменные, объявленные для этого хука.

Следующий пересмотренный код включает отображаемое пользовательское сообщение, когда продукт недоступен:

add_filter('woocommerce_is_purchasable', 'woocommerce_is_purchasable_filter_callback', 10, 2 );
function woocommerce_is_purchasable_filter_callback( $purchasable, $product ) {
    $months      = (array) get_field('availability');
    $purchasable = in_array( date('F'), $months ) ? $purchasable : false;

    return $purchasable;
}

add_action( 'woocommerce_single_product_summary', 'unavailable_product_display_message', 20 );
function unavailable_product_display_message() {
    global $product;

    if(! $product->is_purchasable() ){
        echo '<p style="color:#e00000;">' . __("This product is currently unavailable.") . '</p>';
    }
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

введите здесь описание изображения


Вместо этого вы также можете отобразить отключенную кнопку с коротким текстом, заменив в моем коде:

echo '<p style="color:#e00000;">' . __("This product is currently unavailable.") . '</p>';

Этим:

echo '<a class="button alt disabled">' . __("Currently unavailable.") . '</a>';

введите здесь описание изображения

person LoicTheAztec    schedule 30.03.2019
comment
Он скрывает кнопку добавления в корзину и показывает сообщение, если месяц отсутствует в массиве. Но когда месяц указан в массиве, отображается кнопка, а при добавлении в корзину появляется сообщение «Извините, этот продукт нельзя приобрести». - person Muhammad Tauseef; 19.09.2019
comment
сделано, новые вопросы удалены, и ваш предыдущий ответ принят. И мои извинения, если мои действия оказали негативное влияние, я не знал об этом. Итак, проблема в том, что он отображает сообщение и удаляет кнопку корзины, если месяцы не находятся в массиве, но когда месяц находится в массиве, он показывает кнопку корзины, но когда я нажимаю «Добавить в корзину», он не добавляет продукт в корзину и дать ошибку Извините, этот продукт нельзя купить. Например, сентябрь находится в списке месяцев, когда продукт доступен, на странице продукта отображается кнопка «Добавить в корзину», но когда я добавляю его, я получаю сообщение об ошибке. - person Muhammad Tauseef; 19.09.2019
comment
@Muhammad Мой ответ здесь был просто ответом на ваш вопрос о коде, показывающим некоторые ошибки, и, поскольку он был основан на пользовательском поле ACF, его нельзя было полностью проверить. Я собираюсь проверить это и выяснить, как решить проблему. Дайте мне немного времени, и я прокомментирую вас здесь, когда он будет готов и обновлен. - person LoicTheAztec; 19.09.2019
comment
@MuhammadTauseef Я проверял, что в последней версии Woocommerce версии 3.7 для темы магазина, и все работает отлично, когда продукт доступен, нажатие кнопки «Добавить в корзину» действительно добавляет продукт в корзину, и нет сообщения о том, что: «Вы не можете купить этот продукт». … или что-то подобное. Итак, есть еще кое-что, что создает проблемы: это может быть другая настройка, сделанная вами, тема или плагин... - person LoicTheAztec; 22.09.2019
comment
Я установил новый wordpress и только что установил только woocommerce и расширенное настраиваемое поле и использовал тему витрины так же, как и вы, но я получаю эту ошибку. Я не добавляю никаких дополнительных скриптов и не активирую никаких других плагинов, кроме этих двух. - person Muhammad Tauseef; 23.09.2019
comment
Не возражаете, если я задам свой другой вопрос о том, чтобы не добавлять товар в корзину, в разных вопросах, чтобы кто-то другой мог ответить на него за меня. Я знаю, что вы ответили на то, что было задано в первый раз относительно отображения сообщения, которое работает, но новая проблема отличается, вы сказали, что проверили тему stronfront и woocommerce 3.7 и не получили эту ошибку. Я сделал то же самое, но Я все еще получаю сообщение об ошибке. - person Muhammad Tauseef; 26.09.2019
comment
@MuhammadTauseef Как уже было сказано, для меня это отлично работает в последней версии WooCommerce 3.7… Конечно, вы можете задать новый вопрос, если хотите, но используйте другой заголовок с чем-то вроде проблемы в Woocommerce 3.7, например, добавив этот ответ в качестве ссылки в вашем вопросе. Если кто-то может вам помочь, для меня не проблема. - person LoicTheAztec; 27.09.2019

Вы можете использовать is_purchasable в своем шаблоне для отображения сообщения

global $product;
if ( ! $product->is_purchasable()): ?>
  <p>Sorry Not Available</p>
<?php endif;

Небольшое примечание, если вы хотите вернуть только истину или ложь, вы могли бы сделать

return in_array($currentMonth, $months)

поскольку in_array все равно возвращает логическое значение

person James    schedule 30.03.2019
comment
Спасибо. Это сработает, но проблема в том, что я создаю страницу продукта с помощью конструктора страниц Elementor, поэтому я не могу поместить этот код на страницу шаблона продукта. Есть ли способ сделать это через add_filter, чтобы он удалял добавление в корзину и отображал сообщение вместо него. - person Muhammad Tauseef; 30.03.2019

Поскольку у вас есть метод проверки наличия продукта в месяц, вы можете написать этот код как отдельную функцию в файле functions.php. Таким образом, эту функцию можно вызвать из хука, чтобы удалить кнопку добавления в корзину, и из хука, который используется для отображения сообщения.

function get_product_availiblity(){
  $months = get_field('availability');
  $currentMonth = date('F');  
  if(in_array($currentMonth, $months))
    return true;
  else
    return false;
}

Таким образом, ваша функция woocommerce_is_purchasable может быть изменена как

function is_available() {
  $availibilty = get_product_availiblity();
  return $availibilty;
}
add_filter('woocommerce_is_purchasable', 'is_available', 10, 2);

И чтобы показать сообщение, вы можете добавить следующий хук

function show_availibilty_message() {
  $availibilty_msg = get_product_availiblity();
  if(!$availibilty_msg){
    echo '<p>This product is not available for this month</p>';
  }
}
add_action( 'woocommerce_single_product_summary', 'show_availibilty_message', 20 );
person melvin    schedule 30.03.2019
comment
Он скрывает кнопку добавления в корзину и показывает сообщение, если месяц отсутствует в массиве. Но когда месяц указан в массиве, отображается кнопка, а при добавлении в корзину появляется сообщение «Извините, этот продукт нельзя приобрести». - person Muhammad Tauseef; 19.09.2019