Поддержка Проблемы и решения Создать каталог — register_post_type() или метаданные

  • Доброго дня
    Прошу Вашей помощи в области понимания структуры хранения данных при создании каталога продукции. Суть такова: необходимо реализовать каталог продукции, в котором содержится информация о товарах со всеми продавцами и поставщиками данных товаров, т.е. результирующая таблица товаров, которая должна выводиться пользователю после выбора им всех параметров фильтрации товаров, имеющихся в БД, такова:
    Наименование_товара Производитель Поставщик Данные_поставщика/производителя Цена.
    Для реализации я создаю свой тип записи при помощи register_post_type(), создаю свои таксономии для классификации товаров при помощи register_taxonomy(), но не пойму как хранить в структуре БД сущность самого товара и связанного с ним поставщика и производителя. Т.е. если товар — это мой тип записи, то производитель и поставщик это должны быть произвольные поля в таблице wp_postmeta, или же для производителя/поставщика нужно создавать ещё один тип записи? но тогда как их связать между собой тип записи товар и поставщик/производитель?
    Т.е. к примеру, имеется кирпич и его могут продавать/производить условно 10 разных компаний по разным ценам, тогда соответственно в таблице wp_posts будет 10 записей, связанных с произвольными полями в wp_postmeta (я склоняюсь к данному варианту) или в таблице wp_posts будет 10 записей товаров каким-то образом связанных с типом записи производитель/поставщик?
    Или имеет место какой-то третий вариант? (пытаюсь всё реализовать без плагинов и создания своих собственных таблиц)
    Извините, если написал замудрено, но пытался спросить максимально доступно. Буду благодарен за любую консультацию — не могу понять как верно хранить данные в данном случае. Помогите, пожалуйста

Просмотр 15 ответов — с 31 по 45 (всего 49)
  • Значит буду пытаться исправлять 🙂
    Но почему элемент массива $postarr['tax_input']['groupasset'] не существует?, если таксономия groupasset зарегистрирована, термины её — вставлены wp_insert_term(). Не подскажете как можно устранить данные нотисы ?

    Модератор Юрий

    (@yube)

    Но почему элемент массива $postarr[‘tax_input’][‘groupasset’] не существует?

    Кто его знает. Возможно, это как-то связано с дефолтным термом для таксономии, типа, должен быть, но его нет.

    Не подскажете как можно устранить данные нотисы ?

    Добавить условие isset($postarr[‘tax_input’][ $taxonomy ]) перед is_array. Но поскольку этот код в ядре, то правка проживет ровно до первого обновления.

    @yube , я кажется разобрался с данными нотисами, но вопрос остался.
    К типу записи asset привязано 3 таксономии — country, groupasset, employer. Таксы и записи я регистрирую в functions.php и у каждой таксы при регистрации указываю атрибут 'default_term'. По той таксе, которая регистрируется первой из трех привязанных к записи, нотис не возникает; но именно та, которая регистрируется первой, т.е. если меняю порядок регистрации, то и нотисы вида Undefined index: таксономия соответственно меняются и нет нотиса только по первой зарегистрированной таксе, которая привязана к этому типу записи.
    Не подскажете, почему так может получаться ? Можно ведь использовать ‘default_term’ для всех таксономий, а не только для одной ?

    Модератор Юрий

    (@yube)

    Можно ведь использовать ‘default_term’ для всех таксономий, а не только для одной ?

    Теоретически — да, а практически — хз. Это новая фишка, я с ней еще не сталкивался.

    Автор Dmitry Kohan

    (@dmay1989)

    @yube , доброго времени суток ) сразу прошу прощения за беспокойство
    Подходя к завершению данного вопроса по реализации каталога продукции, столкнулся с проблемой вывода всех поставщиков и продавцов по определенной категории товаров (как Вы и советовали, товары у меня — это записи в wp_posts, продавцы и поставщики — это термины соответствующих таксономий в wp_terms, привязанные к этим товарам; у каждого товара есть свой производитель и поставщик, но у разных товаров производители и поставщики могут совпадать и при этом они являются разными терминами в БД). Подскажите, пожалуйста, как можно извлечь весь список продавцов определенной категории товаров, не дублируя их при этом. Не пойму как реализовать эту задачу, пытаюсь с помощью get_terms(), но одинаковые продавцы дублируются т.к. это разные термины в БД:

    $terms = get_terms( [
            'hide_empty'  => false,  
            'orderby'     => 'name',
            'hierarchical'=> false,
            'parent'      => $group_material,
            'order'       => 'ASC',
            'taxonomy'    => 'seller',
        ] );

    Может быть как то можно их анализировать по полю name каждого термина, но как… или есть другой способ? подскажите, пожалуйста

    Автор Dmitry Kohan

    (@dmay1989)

    Если выразиться проще — не могу извлечь все термины определенного типа записи так, чтобы эти термины не повторялись т.е. записи могут иметь термины с одинаковым name, description и т.д. но с разным term_id. Не могу понять как извлекать такие «повторяющиеся» термины только один раз… может кто подскажет.
    Буду рад любому комментарию или подсказке в каком направлении думать.
    Заранее спасибо

    Автор Dmitry Kohan

    (@dmay1989)

    @yube , может быть у Вас будет какая-нибудь идея ?) зашел в тупик..
    ps еще раз извините, так сказать последняя надежда

    Модератор Юрий

    (@yube)

    «Фильтруйте» в php, типа

    
    $uniq_terms = [];
    foreach ( $terms as $term ) {
     $uniq_terms[$term->slug] = $term;
    }
    

    или сделайте свой SQL-запрос по образу и подобию порождаемого WP, только с GROUP BY slug (или name)

    Автор Dmitry Kohan

    (@dmay1989)

    @yube , спасибо огромное, пытаюсь сделать свой SQL-запрос по образу и подобию порождаемого WP. Для постов (объекта WP_Query) существует фильтр posts_groupby, чтобы изменять GROUP BY часть SQL запроса. Вы не подскажете — для терминов ничего такого подобного не существует ? Т.е. нужно посредством $wpdb писать свой запрос, чтобы изменить результат, который формирует функция get_terms() ?

    Модератор Юрий

    (@yube)

    Под «свой запрос» я имел в виду использование $wpdb

    Автор Dmitry Kohan

    (@dmay1989)

    @yube , понял, спасибо. Разбираюсь с метаданными терминов.
    Вы не подскажете, в функции get_terms() параметр meta_query работает аналогично параметру meta_query в WP_Query ? это массив массивов, но только работает вместо postmeta с termmeta, верно ?

    Модератор Юрий

    (@yube)

    Не подскажу. Не пользовался. Думаю, да. А что документация говорит?

    Автор Dmitry Kohan

    (@dmay1989)

    get_terms() WP 2.3.0

    meta_query(массив)
    Запрос для получения элементов на основе метаданных. Смотрите WP_Meta_Query.

    WP_Meta_Query{} WP 3.2.0
    Класс создает JOIN и WHERE части SQL запроса, которые в дополнении к основному запросу будут фильтровать результат по указанным ключу и значению метаполя.

    WP_Meta_Query — это вспомогательный класс, который используется в комбинации с классами: WP_Query, WP_User_Query, WP_Comment_Query и помогает им фильтровать результат на основе указанных метаданных.

    @yube , еще раз спасибо, разобрался. Действительно, параметр meta_query в функции get_terms() работает аналогично параметру meta_query в WP_Query.
    @yube , позвольте у Вас попросить ещё один совет: если есть 3 числовых поля, результат вычисления по которым нужно сравнить со значением из БД и вывести в фоновом режиме на экран, то как это лучше реализовать ? нужно как-то проверять три поля input на пустоту и если все поля заполнены выполнять AJAX-запрос ? и это нужно проверять всякий раз когда любое из полей теряет фокус ? но как быть, если после ввода всех трех значений пользователь нажимает кнопку «Сохранить» ? — результат сравнения ведь не успеет даже показаться на экране… или может быть есть другой вариант, до которого я не додумался… подскажите, пожалуйста

    и это нужно проверять всякий раз когда любое из полей теряет фокус ?

    Обычно вешают на on change и/или keyup.

    как быть, если после ввода всех трех значений пользователь нажимает кнопку «Сохранить» ?

    On change дизаблить кнопку submit и выставлять флаг, блокирующий submit, а по окончанию ajax возвращать всё взад.

Просмотр 15 ответов — с 31 по 45 (всего 49)
  • Тема «Создать каталог — register_post_type() или метаданные» закрыта для новых ответов.