2016-08-17 2 views
4

У меня есть клиент со следующим вопросом:Как скрыть WooCommerce продуктов с данной категории на основе роли пользователя

Мне нужно, чтобы иметь возможность разделить их сайт WooCommerce WordPress в по существу две категории. Если пользователь вошел в систему как "Wholeseller", только продукты в "Wholesale" категории вытащить из базы данных.

Однако, если пользователь не вошел в систему или в системе, но не "Wholeseller", то только продукты без "Wholesale" категории втянуты из базы данных.

Я полагаю, что я буду добавлять что-то вроде этого в functions.php файл ТЕМЫ:

add_filter("some_woocommerce_hook", "wholeseller_filter"); 

function wholeseller_filter() { 
    if (current_user->role == "Wholeseller"){ 
     //omit products without "wholesale" category while browsing whole site 
    } else { 
     //omit products with "wholesale" in the category while browsing whole site. 
    } 
} 

Я просматриваемый вокруг StackOverflow, но я не нашел то, что я ищу или совсем знать, какие ключевые слова Я должен использовать для своих поисков.

Можете ли вы указать мне правильное направление?

ответ

5

Да, это возможно. Существует 2 способа:

1) С помощью Wordpress hook, который вызывается после создания объекта переменной запроса, но до запуска фактического запроса. Поэтому он идеально подходит для этого случая. Представьте себе, что ID категории 'Wholesale' - это '123'.

Вот пользовательский код:

function wholeseller_role_cat($query) { 

    // Get the current user 
    $current_user = wp_get_current_user(); 

    if ($query->is_main_query()) { 
     // Displaying only "Wholesale" category products to "whole seller" user role 
     if (in_array('wholeseller', $current_user->roles)) { 
      // Set here the ID for Wholesale category 
      $query->set('cat', '123'); 

     // Displaying All products (except "Wholesale" category products) 
     // to all other users roles (except "wholeseller" user role) 
     // and to non logged user. 
     } else { 
      // Set here the ID for Wholesale category (with minus sign before) 
      $query->set('cat', '-123'); // negative number 
     } 
    } 
} 
add_action('pre_get_posts', 'wholeseller_role_cat'); 

Этот код идет на function.php файл вашей активной темы ребенка или тему, или лучше в пользовательском плагином.


2) С WooCommerce крючком woocommerce_product_query. (Мы все еще представляем здесь, что ID 'Wholesale' категория is '123').

Вот пользовательский код:

function wholeseller_role_cat($q) { 

    // Get the current user 
    $current_user = wp_get_current_user(); 

    // Displaying only "Wholesale" category products to "whole seller" user role 
    if (in_array('wholeseller', $current_user->roles)) { 
     // Set here the ID for Wholesale category 
     $q->set('tax_query', array(
      array(
       'taxonomy' => 'product_cat', 
       'field' => 'term_id', 
       'terms' => '123', // your category ID 
      ) 
     )); 

    // Displaying All products (except "Wholesale" category products) 
    // to all other users roles (except "wholeseller" user role) 
    // and to non logged user. 
    } else { 
     // Set here the ID for Wholesale category 
     $q->set('tax_query', array(
      array(
       'taxonomy' => 'product_cat', 
       'field' => 'term_id', 
       'terms' => '123', // your category ID 
       'operator' => 'NOT IN' 
      ) 
     )); 
    } 
} 
add_action('woocommerce_product_query', 'wholeseller_role_cat'); 

Этот код идет на function.php файл вашей активной темы ребенка или тему, или лучше в пользовательском плагином.

Если вы хотите использовать категорию слизняка вместо категории ID вы должны заменить частично (как массивы) с:

  array(
       'taxonomy' => 'product_cat', 
       'field' => 'slug', 
       'terms' => 'wholesale', // your category slug (to use the slug see below) 

Вы могли бы добавить, если вы хотите, и нужно, some woocommerce conditionals tags в if statements, чтобы ограничить это еще больше.

Ссылки:

+0

'pre_get_posts' все! Хотя я бы посоветовал не держать это в 'functions.php вашей темы и скорее переместить его в плагин. – helgatheviking

+1

'functions.php' - это самое простое место для отбрасывания фрагментов для быстрого тестирования, но я всегда советую использовать вашу тему для функций, связанных с дисплеем, и поддерживать любой функциональный код в плагинах. – helgatheviking

+0

Вы не должны запускать это на pre_get_posts, если вы не хотите, чтобы это выполнялось через каждый запрос. Woocommerce hook 'woocommerce_product_query' позволит вам запускать его только по запросам woocommerce. –

0

Чтобы сделать это более производительным и работают только на запрос WooCommerce использовать следующую функцию и крюк.

function exclude_product_from_wholesale($q){ 

$current_user = wp_get_current_user(); 
$ARRAY_OF_PRODUCT_IDS_YOU_WANT_HIDDEN = array(); 

if (in_array('wholeseller', $current_user->roles)) { 
    $q->set('post__not_in', $ARRAY_OF_PRODUCT_IDS_YOU_WANT_HIDDEN); 
} 

} 

add_action('woocommerce_product_query', 'exclude_product_from_wholesale'); 

Вы можете оставить эту простую функцию в своем файле functions.php.

Смежные вопросы