Вопрос или проблема
Я написал SQL-запрос, чтобы получить ID товаров со статусом ‘instock’, но не знаю, как добавить к SELECT только из указанной категории продуктов.
Мой код:
$results = $wpdb->get_col( "
SELECT p.ID
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
WHERE p.post_type LIKE 'product'
AND p.post_status LIKE 'publish'
AND pm.meta_key LIKE '_stock_status'
AND pm.meta_value LIKE 'instock'
" );
Если вы ищете товары по указанной категории. Пожалуйста, найдите код ниже:
$results = $wpdb->get_col( "
SELECT p.ID
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
LEFT JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}posts.ID = {$wpdb->prefix}term_relationships.object_id)
WHERE p.post_type LIKE 'product'
AND p.post_status LIKE 'publish'
AND pm.meta_key LIKE '_stock_status'
AND pm.meta_value LIKE 'instock'
AND {$wpdb->prefix}term_relationships.term_taxonomy_id IN ( 'cat 1', 'cat 2', 'cat 3' )
" );
Примечание: Вам нужно заменить “cat 1”, “cat 2” и “cat 3” на вашу категорию.
Если вам обязательно нужно использовать $wpdb:
$results = $wpdb->get_col(
$wpdb->prepare( "
SELECT p.ID
FROM $wpdb->posts as p
INNER JOIN $wpdb->postmeta as pm ON p.ID = pm.post_id
INNER JOIN $wpdb->term_relationships as tr ON p.ID = tr.object_id
WHERE p.post_type="product"
AND p.post_status="publish"
AND pm.meta_key = '_stock_status'
AND pm.meta_value="instock"
AND tr.term_taxonomy_id = %d
", $cat_id)
);
Если вы хотите выбрать по имени категории вместо ID, вам нужно объединить одну таблицу:
$results = $wpdb->get_col(
$wpdb->prepare( "
SELECT p.ID
FROM $wpdb->posts as p
INNER JOIN $wpdb->postmeta as pm ON p.ID = pm.post_id
INNER JOIN $wpdb->term_relationships as tr ON tr.object_id = p.ID
INNER JOIN $wpdb->terms as t ON t.term_id = tr.object_id
WHERE p.post_type="product"
AND p.post_status="publish"
AND pm.meta_key = '_stock_status'
AND pm.meta_value="instock"
AND t.name %LIKE% %s
", $wpdb->esc_like($cat_name) )
);
Тем не менее, предпочтительный метод для запроса продуктов – это:
$products = wc_get_products( array(
'category' => array( 'shirts' ),
'stock_status' => 'instock',
'status' => 'publish',
));
Ответ или решение
Чтобы извлечь идентификаторы товаров из определенной категории с статусом "в наличии" в WordPress, используя класс wpdb
, нам необходимо объединить несколько таблиц в базе данных. Давайте подробно рассмотрим, как можно сделать этот запрос.
Основная структура SQL-запроса
Запрос будет включать следующие таблицы:
wp_posts
– для получения информации о продуктах.wp_postmeta
– для проверки статуса запасов.wp_term_relationships
– для связывания продуктов с категориями.wp_terms
– для получения названий категорий.
SQL-запрос для получения ID товаров из определенной категории со статусом "в наличии"
Вот пример запроса, который объединяет все перечисленные таблицы и учитывает фильтрацию по категории:
$results = $wpdb->get_col(
$wpdb->prepare( "
SELECT p.ID
FROM {$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}term_relationships AS tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->prefix}terms AS t ON t.term_id = tr.term_taxonomy_id
INNER JOIN {$wpdb->prefix}term_taxonomy AS tt ON tt.term_id = t.term_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND pm.meta_key = '_stock_status'
AND pm.meta_value = 'instock'
AND tt.taxonomy = 'product_cat'
AND t.name LIKE %s
", $wpdb->esc_like($cat_name) )
);
Объяснение параметров запроса
-
%s
: Это специальный маркер для подстановки значения строки. Мы используем его, чтобы безопасно передать название категории через методprepare()
; это помогает избежать SQL-инъекций. -
$wpdb->esc_like($cat_name)
: Этот метод используется для экранирования символов в строке, предназначенной для SQL-запроса, гарантируя, что она будет правильно интерпретирована. -
INNER JOIN
: Мы используем внутреннее соединение, чтобы убедиться, что только те записи, которые удовлетворяют всем условиям, будут возвращены.
Использование WooCommerce API
Хотя запрос с использованием $wpdb
предоставляет нам доступ к необходимым данным, более предпочтительным способом для работы с продуктами WooCommerce является использование метода wc_get_products
. Этот метод абстрагирует от деталей реализации базы данных и предоставляет более простой в использовании интерфейс. Вот как можно получить те же данные с его помощью:
$products = wc_get_products(array(
'category' => array('название_категории'), // Укажите название вашей категории
'stock_status' => 'instock',
'status' => 'publish',
));
Это не только упрощает ваш код, но и делает его более понятным и удобным в дальнейшей поддержке.
Заключение
Объединение таблиц wpdb
предоставляет мощный инструмент для работы с данными в WordPress. Тем не менее, использование API WooCommerce — это более безопасный и удобный способ, который позволяет избежать многих проблем, связанных с возможными ошибками в SQL-запросах и управлением безопасностью. Таким образом, для получения идентификаторов товаров в указанной категории со статусом "в наличии" мы можем использовать как прямые SQL-запросы, так и преимущества, предоставляемые API WooCommerce.