Введите часть искомого слова, названия или фразы...
↑ ↓
  1. Новые темы озаглавленные с маленькой буквы - удаляются без предупреждения!
  2. Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

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

Тема в разделе "Вопросы, советы и доработки.", создана пользователем adward, 22 сен 2013.

Статус темы:
Закрыта.
  1. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    так случилось, что у меня в магазине достточно большое коиличество товаров, которые сгруппированы.
    то есть собраны по принципу коллекций

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

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

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

    Спасибо.
     
  2. Валерий

    Валерий

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

    Валерий

    Сообщения:
    271
    Симпатии:
    152
    Баллы:
    43
    Это можно сделать при помощи хуков. Т.е. создается пользовательский фильтр, который привязывается к фильтру WooCommerce, фильтрующему товары до вывода. В пользовательский хук-фильтр передается массив всех товаров, из этого массива удаляются определенные товары (в вашем случае, внутриколлекционные), а затем посредством переменной возвращается урезанный массив, который и выводится стандартными средствами WooCommerce. Поищите среди описаний всевозможных хуков. Где-то я что-то подобное видел...
     
    • Нравится Нравится x 1
  4. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    заебательский замечательный ответ
    я такой же даю, когда меня спрашивают о чём либо сложном.
    но факт в том, что я не нашёл решения! его судя по всему нет и нужно движок дописать
    вопрос в том - кто этим займётся...
    готов выделить рублей 300-500 тому, кто расскажет мне как это сделать.
     
  5. Валерий

    Валерий

    Сообщения:
    271
    Симпатии:
    152
    Баллы:
    43
    Разместите заявку где-нибудь на фрилансерских сайтах. Думаю Вам помогут.

    Однако, если взять код с сайта поддержки 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 можно и без обязательного дописывания движка.
     
  6. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    Я вот что нарыл.
    Если на странице вывода конкретного товара выставиьт определённое условие:
    то это условие нам расскажет - есть родительский товар у текущего, или нет.
    то есть, если $parentElementID равно нулю, это говорит только об одном - это просто товар.
    если же там число - то это и будет ID родительского товара.
    но... как это применить?
    я перерыл весь код и так и не могу понять, как же создать хук для моего случая..
     
  7. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    а так же я заметил, что в базе у продукта, у которого есть родитель, в поле post_parent прописано ID этого продукта.
    Если родителя нет, то в post_parent записано ноль.
    осталось вот сюда:
    вписать эту логику...
     
  8. Валерий

    Валерий

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

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    Сайт передан на заполнение операторам клиента.
    они ща там насочиняют туеву хучу продукции, я ошалею вводить вручную )))

    я тут так понял в общем:
    по сути, вот эта сущность:
    это есть sql запрос, завуалированный.

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

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

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    хотя, можно с помощью этого же sql получить id элементов, имеющих родителя и впихнуть в хук.
     
  11. Валерий

    Валерий

    Сообщения:
    271
    Симпатии:
    152
    Баллы:
    43
    А где Вы вообще выводите все товары, на главной? Я чего-то недопонимаю. Киньте ссылку на сайт, чтобы видеть в живую...
     
  12. adward

    adward

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

    Валерий

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

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

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

    foto1.png
    на вид

    foto2.png

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

    foto3.png

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

    Валерий

    Сообщения:
    271
    Симпатии:
    152
    Баллы:
    43
    Кстати, "сущность", которую Вы описывали

    Код:
    $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
     
  15. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    нет. всё это не так.
    вот, смотрите, как в woocommerce товары группируются в коллекции:

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

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

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

    [​IMG]
    то есть тут речь не о том, что товар является товаром в подрубрике, речь о том, что товар является дочерним товаром в группе товаров.
     
  16. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    Похоже мы вообще не в той степи роемся.
    вот люди как решают вопросы с выводом товаров: http://www.onwordpress.ru/spisok-wordpress-postov-sgruppirovannyj-po-rubrikam.html

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

    там же рассказывается, как группировать записи произвольного типа по значениям таксономий.
    Однако моего ответа там по прежнему нет :(
     
  17. adward

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    не работает.
    если в 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. Валерий

    Валерий

    Сообщения:
    271
    Симпатии:
    152
    Баллы:
    43
    Ага, не там роемся, т.к. люди часто решают данный вопрос по другому. Вы разве не видите, что Ваша логика раздела "Мебель для спальни" противоречит человеческому восприятию? o_O

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

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

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

    foto4.png

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

    foto5.png

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

    adward

    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    6
    Да, скорее по уму выводить не ту цену, которую предлагает движок WooCommerce, а сумму цен товаров, входящих в первоначальный набор определённой коллекции. Я ещё подумаю над этим, может это и в настройках где есть.

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

    adward

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

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

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

Статус темы:
Закрыта.