WordPress как на ладони

Как связать типы постов «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 создал категории, которые назвал именами клубов. И при выводе товара на странице клуба проверяю слаги (слаг категории товара == слаг названия клуба в котором выводится). Если равно то выводим... Все работает, но стоит поменять название клуба - связь теряется.

Заранее спасибо.

0
Sergs
6.5 лет назад 1
  • 1

    Добавьте кастомную таксономию tax_club с помощью функции register_taxonomy. В параметре object_type пишите array('product', 'club'). И у вас будет одна таксономия на 2 типа постов. При выводе товара на странице клуба вы будете продукты фильтровать по одному термину.

    Sergs 6.5 лет назад

    Спасибо за комментарий.
    Добавил. теперь в дашборде в разделе products и clubs появилась таксономия "in club". И сейчас было бы хорошо сделать так, чтобы термины этих таскономий автоматически создавались и удалялись при создании и удалении клуба. Иначе придется после создания нового клуба дополнительно создавать в таксономии для него терм(и удалять тоже).

    Molotow 6.5 лет назад

    Это событие происходит во время сохранения поста 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

    Sergs 6.5 лет назад

    Спасибо за коммент.
    Получился такой код, вроде все работает в нем(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');
    	}
    }
    
    Sergs 6.5 лет назад

    Но это только автоматическое создание, изменение и удаление этих term.
    Теперь осталось сделать правильный запрос для вывода товаров на основе отмеченных разделов.

    Molotow 6.5 лет назад

    https://wp-kama.ru/function/wp_get_post_terms На странице клуба получаете массив terms таксономии клубов. Затем создаете новый цикл который дергает продукты и фильтруете его с помощью массива terms который мы получили выше (можете подтянуть темплейт woocommerce content-product.php для отображения единицы продукта). Всю эту радость пихаете в темплейт поста клуба.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация