Скрыть цены для незарегистрированных участников, кроме одной категории

#php #wordpress #woocommerce

#php #wordpress #woocommerce

Вопрос:

Я пытаюсь внести некоторые изменения в код, который я нашел здесь, что позволит мне скрыть все цены в моем магазине woocommerce, ЗА исключением одной категории.

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

 
add_action( 'init', 'bbloomer_hide_price_add_cart_not_logged_in' );
  
function bbloomer_hide_price_add_cart_not_logged_in() {   

    if (! is_user_logged_in() amp;amp; 
        ! has_term( 'courses', 'product_cat' ) ) 
    { 
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
        remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );   
        add_action( 'woocommerce_single_product_summary', 'bbloomer_print_login_to_see', 31 );
        add_action( 'woocommerce_after_shop_loop_item', 'bbloomer_print_login_to_see', 11 );
    }
}
 
function bbloomer_print_login_to_see() {
    echo '<a class="button product_type_simple" href="' . 
    get_permalink(wc_get_page_id('myaccount')) . '">' . 
    __('Login to see prices', 'theme_name') . '</a>';
}
  

Любая помощь будет высоко оценена!

Ответ №1:

Вместо удаления каждого действия, которое выводит price simply, удалите цену.

Этот код будет фильтровать get_price_html() функцию из WC_Product класса и возвращать пустую строку.

 function bbloomer_hide_price_add_cart_not_logged_in() { 
    global $product;  
    if (! is_user_logged_in() amp;amp;
        !has_term( 'courses', 'product_cat', $product->get_id())) 
    { 
        add_filter('woocommerce_get_price_html', '__return_empty_string', 10);
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
        remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); 
    }
}
  

или… чтобы добавить свой клик на кнопку входа…

 function bbloomer_hide_price_add_cart_not_logged_in() { 
    global $product;
    if (!is_user_logged_in() amp;amp; 
        !has_term( 'courses', 'product_cat', $product->get_id())) // add product ID to check if that specific product is part of courses category. 
    { 
        add_filter('woocommerce_get_price_html', 'bbloomer_print_login_to_see'), 
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
        remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); 10);
    }
}

function bbloomer_print_login_to_see() {
    // Modify the function to return the value, not echo it.
    return '<a class="button product_type_simple" href="' . 
    get_permalink(wc_get_page_id('myaccount')) . '">' . 
    __('Login to see prices', 'theme_name') . '</a>';
}
  

Исправленные дополнения к ответам

  • Получите доступ к текущему $product внутри вашего цикла, чтобы проверить, является ли он частью courses category.
  • Удалить add to cart button со страниц отдельных продуктов, если продукт является частью категории courses

Комментарии:

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

2. Хорошо, в этот момент вы начнете использовать remove_action , чтобы удалить кнопки добавления в корзину, я добавлю их в свой ответ

3. Привет, приятель — спасибо за ваш ответ. Тем не менее, это по-прежнему скрывает все цены по всему сайту.. не для всех, кроме одной категории..