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

T
На сайте с 24.07.2008
Offline
139
469

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

На страницах каталога товары "нет в наличии" не отображаются. Но это сделано как-то по кривому. Выводиться должно 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
На сайте с 03.11.2008
Offline
1609
#1
Tempter:
Так вот, подскажите, где формируется запрос в базу данных,

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

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

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

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
T
На сайте с 24.07.2008
Offline
139
#2

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

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

SeVlad
На сайте с 03.11.2008
Offline
1609
#3
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
На сайте с 02.08.2015
Offline
94
#4
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');

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий