Woocommerce изменить запрос выборки товаров


Tempter
257

Проблема такая, есть товары со статусом «В наличии», а есть «Нет в наличии».

На страницах каталога товары «нет в наличии» не отображаются. Но это сделано как-то по кривому. Выводиться должно 12 товаров на страницу, но выводится, например, 8. Посмотрел запросы в базу данных — там всё верно лимит 0, 12. Но сам запрос не учитывает, что в выборку попадают товары со статусом «нет в наличии». Они видимо, потом как-то отсекаются и на странице оказывается не 12 товаров, а меньше.

Так вот, подскажите, где формируется запрос в базу данных, чтобы можно было добавить нужные исключения?

Сейчас запрос такой:


SELECT SQL_CALC_FOUND_ROWS w9p_posts.ID FROM w9p_posts INNER JOIN ( SELECT post_id, min( meta_value+0 ) price FROM w9p_postmeta WHERE meta_key='_price' GROUP BY post_id ) as price_query ON w9p_posts.ID = price_query.post_id WHERE 1=1 AND (
w9p_posts.ID NOT IN (
SELECT object_id
FROM w9p_term_relationships
WHERE term_taxonomy_id IN (1823,1825)
)
) AND w9p_posts.post_type="product" AND (w9p_posts.post_status="publish" OR w9p_posts.post_status="private") GROUP BY w9p_posts.ID ORDER BY price_query.price ASC, w9p_posts.ID ASC LIMIT 0, 12

Хочу поменять на такой:


SELECT SQL_CALC_FOUND_ROWS w9p_posts.ID FROM w9p_posts
LEFT JOIN (SELECT post_id, `meta_value` as stock_status FROM w9p_postmeta WHERE meta_key='_stock_status' GROUP BY post_id)
AS w_stock ON w9p_posts.ID = w_stock.post_id
INNER JOIN ( SELECT post_id, min( meta_value+0 ) price FROM w9p_postmeta WHERE meta_key='_price' GROUP BY post_id ) as price_query ON w9p_posts.ID = price_query.post_id WHERE 1=1 AND (
w9p_posts.ID NOT IN (
SELECT object_id
FROM w9p_term_relationships
WHERE term_taxonomy_id IN (1823,1825)
)
) AND w_stock.stock_status="instock" AND w9p_posts.post_type="product" AND (w9p_posts.post_status="publish" OR w9p_posts.post_status="private") GROUP BY w9p_posts.ID ORDER BY price_query.price ASC, w9p_posts.ID ASC LIMIT 0, 12


SeVlad
Tempter:
Так вот, подскажите, где формируется запрос в базу данных,

В шаблоне категории с помощью функций.

https://docs.woocommerce.com/wc-apidocs/package-WooCommerce.html

А прямыми запросами не лезь в базу.


Tempter

я так понял, запросы формируются где-то в скриптах воокомерс, а в шаблоне, например, arhive-product.php вызываются только хуки.

Может быть подскажете в каком файле сам код формирования этих запросов?


SeVlad
Tempter:
я так понял, запросы формируются где-то в скриптах воокомерс, а в шаблоне, например, arhive-product.php вызываются только хуки.

Неправильно понял.

Шаблоны отвечают за вывод. А что в них будет — зависит исключительно от разработчика (в соответствии с иерархией, конечно: https://codex.wordpress.org/%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2). В самом страшном случае они вообще могут содержать только статический контент.

Tempter:
Может быть подскажете в каком файле сам код формирования этих запросов?

Если в теме есть каталог woocommece, то там как правило archive-product.php (но может быть и другие). Если нет, то в плагине.

См https://docs.woocommerce.com/document/template-structure/

А чтобы переписать шаблон надо создать дочернюю тему и в ней уже изменять.


Gerga
Tempter:
Так вот, подскажите, где формируется запрос в базу данных, чтобы можно было добавить нужные исключения?

можете использовать хук-событие «pre_get_posts». Пример:


/**
* Формирование query
* вызывается хук-событием pre_get_posts
*/
function theme_pre_get_posts($query) {
if ($query->is_main_query() && $query->is_archive) {
$query->set('meta_key', '_stock_status');
$query->set('meta_value', 'instock');
}
}
add_action('pre_get_posts', 'theme_pre_get_posts');

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *