• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

Как в общем списке запретить вывод определённых товаров

Image CMS
Статус
В этой теме нельзя размещать новые ответы.

adward

Форумчанин
#1
так случилось, что у меня в магазине достточно большое коиличество товаров, которые сгруппированы.
то есть собраны по принципу коллекций

к примеру - спальня. она состоит из кроватей шкафов и тумбочек. каждый товар имеет свою стоимость и может быть продан отдельно.

но когда мы выводим все товары - эти внутриколлекционные товары - тоже выводятся, клиенту это не нравится.

Как сделать так, чтобы в общем списке не выводились товары, которые имеют признак parent()

Спасибо.
 

Валерий

Специалист
#2
Это можно сделать при помощи хуков. Т.е. создается пользовательский фильтр, который привязывается к фильтру WooCommerce, фильтрующему товары до вывода. В пользовательский хук-фильтр передается массив всех товаров, из этого массива удаляются определенные товары (в вашем случае, внутриколлекционные), а затем посредством переменной возвращается урезанный массив, который и выводится стандартными средствами WooCommerce. Поищите среди описаний всевозможных хуков. Где-то я что-то подобное видел...
 

Валерий

Специалист
#3
но когда мы выводим все товары - эти внутриколлекционные товары - тоже выводятся, клиенту это не нравится.
Это можно сделать при помощи хуков. Т.е. создается пользовательский фильтр, который привязывается к фильтру WooCommerce, фильтрующему товары до вывода. В пользовательский хук-фильтр передается массив всех товаров, из этого массива удаляются определенные товары (в вашем случае, внутриколлекционные), а затем посредством переменной возвращается урезанный массив, который и выводится стандартными средствами WooCommerce. Поищите среди описаний всевозможных хуков. Где-то я что-то подобное видел...
 

adward

Форумчанин
#4
WooCommerce. Поищите среди описаний всевозможных хуков. Где-то я что-то подобное видел...
заебательский замечательный ответ
я такой же даю, когда меня спрашивают о чём либо сложном.
но факт в том, что я не нашёл решения! его судя по всему нет и нужно движок дописать
вопрос в том - кто этим займётся...
готов выделить рублей 300-500 тому, кто расскажет мне как это сделать.
 

Валерий

Специалист
#5
...готов выделить рублей 300-500 тому, кто расскажет мне как это сделать.
Разместите заявку где-нибудь на фрилансерских сайтах. Думаю Вам помогут.

Однако, если взять код с сайта поддержки WooCommerce для исключения товаров определенной категории с главной страницы магазина:
Код:
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
    if ( ! $q->is_main_query() ) return;
    if ( ! $q->is_post_type_archive() ) return;
   
    if ( ! is_admin() && is_shop() ) {
        $q->set( 'tax_query', array(array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => array( 'knives' ), // Don't display products in the knives category on the shop page
            'operator' => 'NOT IN'
        )));
   
    }
    remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
и сопоставить его с классическим кодом для Wordpress, предназначенным для удаления определенных записей с главной страницы по их id:
Код:
function exclude_post($query) {
if ($query->is_home)
    {$query->set('post__not_in', array(1146, 1199) );} // id записи (поста)
return $query; }
add_filter('pre_get_posts','exclude_post');
то прослеживаются определенные параллели, и удалить нужные товары с главной страницы магазина по их id можно и без обязательного дописывания движка.
 

adward

Форумчанин
#6
Я вот что нарыл.
Если на странице вывода конкретного товара выставиьт определённое условие:
global $product;
$parentElementID = $product->get_parent();
то это условие нам расскажет - есть родительский товар у текущего, или нет.
то есть, если $parentElementID равно нулю, это говорит только об одном - это просто товар.
если же там число - то это и будет ID родительского товара.
но... как это применить?
я перерыл весь код и так и не могу понять, как же создать хук для моего случая..
 

adward

Форумчанин
#7
а так же я заметил, что в базе у продукта, у которого есть родитель, в поле post_parent прописано ID этого продукта.
Если родителя нет, то в post_parent записано ноль.
осталось вот сюда:
$q->set( 'tax_query', array(array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'knives' ),
'operator' => 'NOT IN'
)));
вписать эту логику...
 

Валерий

Специалист
#8
А почему бы "вот сюда" Вам в ручную не загнать ID нужных продуктов? Понятно, что приятнее, когда присутствует полная автоматизация, но все идеально не сделаешь (по крайней мере в разумные сроки :().
 

adward

Форумчанин
#9
А почему бы "вот сюда" Вам в ручную не загнать ID нужных продуктов
Сайт передан на заполнение операторам клиента.
они ща там насочиняют туеву хучу продукции, я ошалею вводить вручную )))

я тут так понял в общем:
по сути, вот эта сущность:
'terms' => array( 'knives' ),
'operator' => 'NOT IN'
это есть sql запрос, завуалированный.

и если кто либо мне на sql переведёт такую фразу:
"выбрать только те продкты, у которых парент больше нуля"

я думаю, что вставив в этот запрос наш sql
можно получить желаемое.
 

adward

Форумчанин
#10
хотя, можно с помощью этого же sql получить id элементов, имеющих родителя и впихнуть в хук.
 

adward

Форумчанин
#12
А где Вы вообще выводите все товары, на главной?
Есть страница где выходят все товары: http://mebelopt-kazan.ru/shop/
есть где по категориям: http://mebelopt-kazan.ru/tovary/mebel-dlya-spalni/
а вот тут прям видно как в эту категорию замусорили товары, что входят в коллекции: http://mebelopt-kazan.ru/tovary/mebel-dlya-spalni/page/2/
 

Валерий

Специалист
#13
но когда мы выводим все товары - эти внутриколлекционные товары - тоже выводятся, клиенту это не нравится.
Насколько я понял, из того, что увидел:
"ГлавнаяМебель для спальниСПАЛЬНЯ «ПРЕМЬЕРА»→ Премьера 13.1"
т.е. "СПАЛЬНЯ «ПРЕМЬЕРА»" - это подрубрика для рубрики "Мебель для спальни", а "Премьера 13.1" - это уже конкретный товар.

Если мы заходим в раздел "Мебель для спальни", то видим список всех товаров, относящихся к данной категории, т.е. выведутся и все товары, и все рубрики, т.е. выражаясь языком клиента "коллекции". А клиент хочет видеть в разделе "Мебель для спальни" только отдельные товары, исключая их родительские рубрики.

В таком случае я бы сделал так: "Woocommerce" -> "Настройки" -> "Каталог"
и в "Настройки каталога" переключил бы с вида

foto1.png
на вид

foto2.png

а еще лучше, на вид

foto3.png

Или я что-то недопонял, и все это в вашем случае не работает?
 

Валерий

Специалист
#14
Кстати, "сущность", которую Вы описывали

Код:
$q->set( 'tax_query', array(array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'knives' ),
'operator' => 'NOT IN'
)));
является составной частью более общей "сущности"

Код:
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
    if ( ! $q->is_main_query() ) return;
    if ( ! $q->is_post_type_archive() ) return;

    if ( ! is_admin() && is_shop() ) {
        $q->set( 'tax_query', array(array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => array( 'knives' ), // Don't display products in the knives category on the shop page
            'operator' => 'NOT IN'
        )));

    }
    remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
а та, в свою очередь, как можно видеть из кода, является частью "сущности" Wordpress функции "get_categories", для которой можно добавить аргумент

Код:
'child_of'  => 0
child_of = '0' / '1' — показывает "детскую" (нижний уровень) категорию с идентификатором ID
 

adward

Форумчанин
#15
Насколько я понял, из того, что увидел:
"ГлавнаяМебель для спальниСПАЛЬНЯ «ПРЕМЬЕРА»→ Премьера 13.1"
т.е. "СПАЛЬНЯ «ПРЕМЬЕРА»" - это подрубрика для рубрики "Мебель для спальни", а "Премьера 13.1" - это уже конкретный товар.
нет. всё это не так.
вот, смотрите, как в woocommerce товары группируются в коллекции:

к примеру "спальня Премьера":

когда мы её создаём, мы говорим ей, что тип продукции будет не простой продукт, а группировка продуктов:


когда же мы создаём продукт, который будет входить в эту коллекцию - то мы выбираем, кто будет у него родителем: например "Премьера 25 шкаф 3-створчатый":


то есть тут речь не о том, что товар является товаром в подрубрике, речь о том, что товар является дочерним товаром в группе товаров.
 

adward

Форумчанин
#16
Похоже мы вообще не в той степи роемся.
вот люди как решают вопросы с выводом товаров: http://www.onwordpress.ru/spisok-wordpress-postov-sgruppirovannyj-po-rubrikam.html

Вывод товаров по рубрикам:

<?php $cats = get_categories(); // Получаем список всех категорий
foreach ($cats as $cat) {
echo "<h3>".$cat->cat_name."</h3>"; // Получаем название одной категории
echo "<ul class='uldotted'>";
query_posts('posts_per_page=-1&cat='.$cat->cat_ID); // изменяем параметры основного цикла WordPress и затем выводим посты
while(have_posts()) {
the_post();
$category = get_the_category(); // получаем список категорий для одного поста
if ($category[0]->cat_ID == $cat->cat_ID) { // Сравниваем список всех категорий с ID первой категории этого поста, и если совпадает, то выводим ссылку на пост только один раз, даже если он указан в нескольких категориях
echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
}
} echo "</ul>";
} ?>
там же рассказывается, как группировать записи произвольного типа по значениям таксономий.
Однако моего ответа там по прежнему нет :(
 

adward

Форумчанин
#17
для которой можно добавить аргумент
Код:
'child_of'  => 0
child_of = '0' / '1' — показывает "детскую" (нижний уровень) категорию с идентификатором ID
не работает.
если в functions.php вставить вот этот код:

Код:
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
    if ( ! $q->is_main_query() ) return;
    if ( ! $q->is_post_type_archive() ) return;
 
    if ( ! is_admin() && is_shop() ) {
        $q->set( 'tax_query', array(array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'child_of'  => 0   
        )));
 
    }
    remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
выходит сообщение "Товаров по выбранным критериям пока нет"
 

Валерий

Специалист
#18
Похоже мы вообще не в той степи роемся. вот люди как решают вопросы с выводом товаров
Ага, не там роемся, т.к. люди часто решают данный вопрос по другому. Вы разве не видите, что Ваша логика раздела "Мебель для спальни" противоречит человеческому восприятию? o_O

Предположим, я клиент, зашел на Ваш сайт и кликнул на раздел "Мебель для спальни". Что я хочу там увидеть? Вы не знаете, но очевидно, что я ищу мебель для спальни. Вот тут-то Вы, вместо того, чтобы уточнить, что же я ищу, вываливаете мне всю кучу товаров! :confused: "Гениально, Ватсон!" :D Не хватает еще всплывающего баннера следующего содержания: "Получи фашист гранату! А ты думал легко будет?! Не хрен было заходить на наш сайт! Вот теперь сиди и разбирайся полдня, пытаясь найти то, что тебе действительно нужно, паразит ты этакий!!! :p"

А что я должен был увидеть? Многоуровневый раскрывающийся список примерно следующего вида:

Мебель для спальни
  • КОЛЛЕКЦИИ
    • Коллекция "Премьера"
    • Коллекция "Не Премьера"
    • Коллекция "Совершенно другая коллекция"
    • ...
    • Коллекция "Еще одна коллекция"
  • Тумбы
  • Кровати
  • Табуреты
  • Шкафы 2-х створчатые
  • Шкафы 3-х створчатые
  • ...
  • Шкафы купе
Если я сейчас выбираю какую-то коллекцию, то я вижу вот это, в начале:

foto4.png

А вот это, в конце:

foto5.png

Что лично для меня несколько неожиданно, т.к. согласно общепринятым стандартам торговли приличных офлайн магазинов (а клиенты обязательно пройдутся по обычным магазинам o_O) коллекция - это самостоятельная сущность, а не просто набор элементов, т.е. это сложный вариативный товар, а не групповой. В хороших магазинах коллекции оформлены в виде мини-комнат (с тремя стенами), где посередине стоит кровать, справа и слева - тумбы, у стен - шкафы. И коллекции имеют цену типа от 29300 руб (среднестатистический набор), а не как у Вас от 1442 руб!!!:)
 

adward

Форумчанин
#19
И коллекции имеют цену типа от 29300 руб (среднестатистический набор), а не как у Вас от 1442 руб!!!:)
Да, скорее по уму выводить не ту цену, которую предлагает движок WooCommerce, а сумму цен товаров, входящих в первоначальный набор определённой коллекции. Я ещё подумаю над этим, может это и в настройках где есть.

Но сейчас это не суть важно. Важно в общем списке избавиться от элементов, имеющих признак parent'a -)
 

adward

Форумчанин
#20
коллекция - это самостоятельная сущность, а не просто набор элементов, т.е. это сложный вариативный товар, а не групповой.
для вариативных товаров в WooCommerce есть своё понятие. Вариативный товар - так и есть. И где то я уже использовал это. Мобильник может быть красным,синим илизелёным и у каждого своя цена. в этом случае создаём вариативный товар.

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

когда клиент требует чтобы была выложена спальня, но покупатель должен иметь возможность собрать товар из нескольких или отказаться от какой либо части? Такой момент весьма характерен для кухонь. Кухня может быть как 3 метра длиной, так и 8. и собираться из разных блоков, каждый из которых имеет стоимость.
 
Статус
В этой теме нельзя размещать новые ответы.