У меня есть запрос на получение данных о продукте от WooCommerce. У продуктов есть вариации (то есть атрибуты), и каждая комбинация атрибутов в сочетании с базовым продуктом представляет собой свой собственный SKU. Для каждого SKU данные записываются в таблицу post_meta с довольно общими ключами c (например, _sku, _price), которые имеют связанные значения. Исключением является поле описания атрибута, которое, как ни странно, его ключ основан на самом имени базового продукта. Это кажется ненужным, поскольку мы уже знаем, на какой базовый продукт он ссылается. Тем не менее, вот как это делается.
В моем примере ниже базовое название продукта - «Ford RAM 1500». Я просто делаю один вариант для тестирования, и атрибут «трейлер», который определяет тип трейлера, который идет с грузовиком. Тип прицепа может быть «без прицепа», «сцепка-2 дюйма», «сцепка-2,5 дюйма», «сцепка-3 дюйма». Затем он создает ключ в таблице Post_Meta под названием «attribute_ford_ram_1500» и назначает мета-значение описание, например «hitch-2in $ 25,269» - элемент варианта и общая цена, включая этот вариант.
Вот мой запрос пока:
SELECT * FROM
(
SELECT p.ID,
p.post_title 'name', -- Ford RAM 1500
p.post_content 'description',
GROUP_CONCAT(cat.name SEPARATOR ' | ') 'Category',
MAX(CASE WHEN meta.meta_key = '_sku' THEN meta.meta_value END) 'SKU',
MAX(CASE WHEN meta.meta_key = 'attribute_trailer' THEN meta.meta_value END) 'Trailer', -- Trailer type added to product, or none
MAX(CASE WHEN meta.meta_key = 'attribute_ford_ram_1500' THEN meta.meta_value END) 'Var_Description', -- Ford RAM 1500 is from the p.post_title (name) field above
MAX(CASE WHEN meta.meta_key = '_price' THEN meta.meta_value END) 'Price',
MAX(CASE WHEN meta.meta_key = '_weight' THEN meta.meta_value END) 'Weight',
MAX(CASE WHEN meta.meta_key = '_stock' THEN meta.meta_value END) 'Stock'
FROM wp_posts AS p
JOIN wp_postmeta AS meta ON p.ID = meta.post_ID
LEFT JOIN
(
SELECT pp.id,
GROUP_CONCAT(t.name SEPARATOR ' > ') AS name
FROM wp_posts AS pp
JOIN wp_term_relationships tr ON pp.id = tr.object_id
JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t ON tt.term_id = t.term_id
|| tt.parent = t.term_id
WHERE tt.taxonomy = 'product_cat'
GROUP BY pp.id, tt.term_id
) cat ON p.id = cat.id
WHERE (p.post_type = 'product' OR p.post_type = 'product_variation')
AND meta.meta_key IN ('_sku', '_price', '_weight', '_stock','attribute_foundation','attribute_ford_ram_1500') -- Would need to dynamically change the last attribute based on the p.post_title (name) field
AND meta.meta_value is not null
GROUP BY p.ID
) d
WHERE d.SKU IS NOT NULL
Это прекрасно работает - для одного базового продукта. Но, скажем, есть также продукт Ford RAM 2500. Для его вариантов не будет meta.meta_key = 'attribute_ford_ram_1500'; вместо этого это будет meta.meta_key = 'attribute_ford_ram_2500'. Я предполагаю, что мне нужно сделать что-то более динамичное c. Поэтому мой вопрос заключается в том, как мне сделать так, чтобы мой запрос нашел правильное имя мета-ключа на основе post_title (name) в этой строке результатов?