@Bodrosh

Как получить товары и категории из БД WP, у которых есть родительские категории?

Здравствуйте. Столкнулся с проблемой, не получается выцепить нужные товары из БД. Делаю поиск по сайту,
в БД хранятся данные:
`wp_posts` - информация о товарах
Напр., 'ID' => '8719' ,' post_title' => 'Кеды 1', 'post_type' = 'product'

`wp_term_relationships` - соответствия товаров и категорий
Напр.,  'object_id' => '8719','term_taxonomy_id' => '273'

`wp_term_taxonomy` - более подробная информация о категории
Напр.,  'term_taxonomy_id' => '273','term_id' => '273','taxonomy' => 'product_cat','parent' => '272'

Здесь ньюанс, к товару с id = 8719 Привязана только одна категория с id = 273. Но у этой категории есть родительские категории (они так же хранятся в `wp_term_taxonomy` ), а к товару они не привязаны.
'term_taxonomy_id' => '273','term_id' => '273','taxonomy' => 'product_cat','parent' => '272' 
'term_taxonomy_id' => '272','term_id' => '272','taxonomy' => 'product_cat','parent' => '160'
'term_taxonomy_id' => '160','term_id' => '160','taxonomy' => 'product_cat','parent' => '0'

Нужно, чтобы при поиске по названию родительских категорий, так же показывался данный товар.
В таблице `wp_terms` хранится название категории.
'term_id' => '273','name' => 'Категория1','slug' => 'kategory1'
'term_id' => '272','name' => 'Категория2','slug' => 'kategory2'
'term_id' => '160','name' => 'Категория3','slug' => 'kategory3'

Написал функцию, которая получает список родительских категорий товара:
DELIMITER //  
  
CREATE FUNCTION br_get_parent_caterory_proc(var1 INT) RETURNS CHAR(100)
 
DETERMINISTIC  
SQL SECURITY DEFINER  
COMMENT 'Get parent category procedure'
BEGIN
	DECLARE parent_id INT;  
    DECLARE result, result_while, parent_id_vchar  CHAR(100);
    SET parent_id = 0;
    SET parent_id_vchar = '';
    SET result_while = '';
    SET result = var1;     
    
    SET parent_id = (SELECT `parent` FROM wp_term_taxonomy  WHERE `term_taxonomy_id` = var1);  
	SET result = concat(result, ", ", parent_id);
      
  	WHILE parent_id <> 0 DO  
       SET parent_id = ( SELECT `parent` FROM wp_term_taxonomy  WHERE `parent` <> 0 AND `term_taxonomy_id` = parent_id );      
       IF (parent_id IS NOT NULL) THEN 
        	 SET parent_id_vchar = CONVERT(parent_id, CHAR(100));   
             SET result_while = concat(result_while, ", ", parent_id_vchar);
    	END IF; 
    END WHILE;  
    
    SET result = concat(result, result_while);
    RETURN result;
    
END//  

DELIMITER ;

SELECT br_get_parent_caterory_proc(273);
Выводит:  272, 160  (или можно сделать полный список 273, 272, 160)

Как можно сформировать запрос, чтобы в объединенных таблицах сформировался товар (дублировался), но у него былb все родительские категории? т.е. на выходе что-то вроде, т.е. Ищу Категория3 и должен найтись товар 8719
'ID' => '8719' ,' post_title' => 'Кеды 1', 'term_id' => '273', 'name' => 'Категория1
'ID' => '8719' ,' post_title' => 'Кеды 1', 'term_id' => '272', name' => 'Категория2',
'ID' => '8719' ,' post_title' => 'Кеды 1', 'term_id' => '160', 'name' => 'Категория3',
Пока пришел примерно к этому, но что не так? Бьюсь уже несколько дней, нид хелп) Спасибо.
SELECT *
FROM (((`wp_posts` p 
INNER JOIN `wp_term_relationships` tr ON p.ID = tr.object_id)
INNER JOIN `wp_term_taxonomy` tt ON tt.term_taxonomy_id = tr.term_taxonomy_id)
INNER JOIN `wp_terms` t ON t.term_id IN (SELECT br_get_parent_caterory_proc(t.term_id))) -- = tt.term_id)
WHERE post_type = 'product' AND taxonomy = 'product_cat' AND name LIKE '%Категория3%'
  • Вопрос задан
  • 2729 просмотров
Решения вопроса 1
@Bodrosh Автор вопроса
Вот решение:
Во первых, функция возвращает строку, а строка - это не список (подробнее Почуму функция не правильно возращает значение в условии WHERE? )
Во вторых, переписал запрос так:
SELECT *
FROM (((`wp_posts` p 
INNER JOIN `wp_term_relationships` tr ON p.ID = tr.object_id)
INNER JOIN `wp_term_taxonomy` tt ON tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN `wp_terms` t ON FIND_IN_SET(t.term_id, br_get_parent_cat(tt.term_id)))
WHERE post_type = 'product' AND taxonomy = 'product_cat' AND t.name LIKE '%Категория3%'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы