WPDB SQL запрос ВЫБОР из категории

Вопрос или проблема

Я написал 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',
));

wc_get_products и WC_Product_Query

Ответ или решение

Чтобы извлечь идентификаторы товаров из определенной категории с статусом "в наличии" в WordPress, используя класс wpdb, нам необходимо объединить несколько таблиц в базе данных. Давайте подробно рассмотрим, как можно сделать этот запрос.

Основная структура SQL-запроса

Запрос будет включать следующие таблицы:

  1. wp_posts – для получения информации о продуктах.
  2. wp_postmeta – для проверки статуса запасов.
  3. wp_term_relationships – для связывания продуктов с категориями.
  4. 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.

Оцените материал
Добавить комментарий

Капча загружается...