Как связать типы постов «product» (от woocommerce) и «club» (свой кастомный)?
Есть кастомный тип поста club, к нему была создана своя таксономия city.
Также есть продукты с типом записи product от woocommerce.
Нужно в товаре указать клуб, чтобы отнести таким образом товар к клубу (товар может быть отнесён к нескольким клубам). Находил информацию что это можно сделать несколькими способами. Через таксономию, wp option и метаданные.
Вот как выглядит сейчас запрос на вывод товаров в клубе
$args = [ 'post_type' => 'product', 'product_cat' => 'events', ]; $events = new WP_Query ($args); while ($events->have_posts()) : $events->the_post(); global $product; ...
Не знаю как связать лучше эти сущности.
Сейчас код работает, но через "костыль"(причем ненадежный). В woocommerce создал категории, которые назвал именами клубов. И при выводе товара на странице клуба проверяю слаги (слаг категории товара == слаг названия клуба в котором выводится). Если равно то выводим... Все работает, но стоит поменять название клуба - связь теряется.
Заранее спасибо.
Добавьте кастомную таксономию tax_club с помощью функции register_taxonomy. В параметре object_type пишите array('product', 'club'). И у вас будет одна таксономия на 2 типа постов. При выводе товара на странице клуба вы будете продукты фильтровать по одному термину.
Спасибо за комментарий.
Добавил. теперь в дашборде в разделе products и clubs появилась таксономия "in club". И сейчас было бы хорошо сделать так, чтобы термины этих таскономий автоматически создавались и удалялись при создании и удалении клуба. Иначе придется после создания нового клуба дополнительно создавать в таксономии для него терм(и удалять тоже).
Это событие происходит во время сохранения поста https://wp-kama.ru/hook/save_post. Только для post_type club выполнить 2 функции https://wp-kama.ru/function/wp_insert_term и эту https://wp-kama.ru/function/wp_set_post_terms. Ну само собой всякие там проверки сделать. И потом аналогично для события https://wp-kama.ru/hook/before_delete_post
Спасибо за коммент.
Получился такой код, вроде все работает в нем(name и slug у терма копируются у поста(club)). После удаления поста в корзину к слагу терма добаляется _trashed. После удаления основательного с корзины удаляется и сам term.
add_action( 'save_post_club', 'add_club_term', 10, 2 ); function add_club_term( $post_ID ) { $post = get_post( $post_ID ); // Получаем обьект поста if (!current_user_can('edit_post', $post->ID)) return; // Если юзер не имеет прав на рекдактирование - прекращаем работу функции $is_term = term_exists( (int)get_post_meta( $post->ID, 'club_tax_meta', true ), 'tax_club' ); // Проверяем существует ли term таксономии tax_club c ID соxраненном в мета толе $current_term_id = $is_term['term_id']; // Если да - сохраняем в переменную $current_term_id if ( $is_term ) { // Обновляем если есть wp_update_term($current_term_id, 'tax_club', [ // Обновляем term по его ID 'name' => $post->post_title, 'slug' => $post->post_name ]); update_post_meta( $post->ID, 'club_tax_meta', $current_term_id ); // сохраняем ID терма в мета поле поста } else { // Добавляем новый если нет $data = wp_insert_term( $post->post_title, 'tax_club', [ // Создаем term по с именем как название клуба 'slug' => $post->post_name ]); if( ! is_wp_error($data) ) { $term_id = $data['term_id']; update_post_meta( $post->ID, 'club_tax_meta', $term_id );// Добавляем ID терма } else { return; } ; } } add_action( 'before_delete_post', 'delete_club_term' ); function delete_club_term( $post_ID ) { global $post_type; if ( $post_type != 'club' ) return; // Прекращаем если тип поста не club $post = get_post( $post_ID ); // Получаем обьект поста if (!current_user_can('edit_post', $post->ID)) return; // Если юзер не имеет прав на рекдактирование - прекращаем работу функции $is_term = term_exists( (int)get_post_meta( $post->ID, 'club_tax_meta', true ), 'tax_club' ); // Проверяем существует ли term таксономии tax_club c ID соxраненном в мета толе $current_term_id = $is_term['term_id']; // Если да - сохраняем в переменную $current_term_id if ( $is_term ) { // Удаляем если есть wp_delete_term($current_term_id, 'tax_club'); } }Но это только автоматическое создание, изменение и удаление этих term.
Теперь осталось сделать правильный запрос для вывода товаров на основе отмеченных разделов.
https://wp-kama.ru/function/wp_get_post_terms На странице клуба получаете массив terms таксономии клубов. Затем создаете новый цикл который дергает продукты и фильтруете его с помощью массива terms который мы получили выше (можете подтянуть темплейт woocommerce content-product.php для отображения единицы продукта). Всю эту радость пихаете в темплейт поста клуба.