Отображать пользовательское сообщение, когда товар недоступен для покупки на отдельных страницах Woocommerce. - PullRequest
1 голос
/ 30 марта 2019

Я создаю сайт, который является цветочным магазином. Некоторые цветы доступны в сезон. Используя плагин 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;
}

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

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

Ответы [ 3 ]

1 голос
/ 30 марта 2019

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

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

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 вашей активной дочерней темы (или активной темы).Протестировано и работает.

enter image description here


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

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

По этому:

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

enter image description here

0 голосов
/ 30 марта 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 );
0 голосов
/ 30 марта 2019

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

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

Незначительный sidenote, если вы только хотите вернуть true или false, вы могли бы сделать

return in_array($currentMonth, $months)

в любом случае in_array возвращает логическое значение

...