Хук posts_where
в WordPress позволяет модифицировать часть SQL-запроса, которая определяет, какие записи будут извлечены из базы данных. Это очень полезно, когда необходимо добавить или изменить условия поиска, фильтруя посты по специфическим критериям, например, по автору, меткам или произвольным полям.
apply_filters_ref_array( 'posts_where', string $where, WP_Query $query );
Параметры
$where
(string): Строка SQL-запроса, которая будет добавлена вWHERE
-условие запроса.$query
(WP_Query): Экземпляр объектаWP_Query
, который был передан по ссылке и содержит информацию о текущем запросе.
Хук позволяет изменить SQL-запрос в любой момент его выполнения, добавив новые условия фильтрации.
Пример 1: Ограничение выборки записей в админ-панели по автору
Предположим, у нас есть тип записи book
, связанный с таксономией author
(автор книги). В админ-панели мы добавили выпадающий список авторов, и теперь нам нужно фильтровать записи (книги) по выбранному автору.
add_filter( 'posts_where', 'filter_books_by_author' );
function filter_books_by_author( $where ) {
if ( is_admin() ) {
global $wpdb;
// Проверяем, если передан параметр для фильтрации по автору
if ( isset( $_GET['author_restrict_posts'] ) && ! empty( $_GET['author_restrict_posts'] ) ) {
$author = intval( $_GET['author_restrict_posts'] );
// Добавляем условие для фильтрации по автору
$where .= " AND ID IN (SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = $author)";
}
}
return $where;
}
В этом примере мы изменяем SQL-запрос в админ-панели, добавляя условие для фильтрации постов по автору, выбранному в выпадающем списке.
Пример 2: Ограничение выборки постов с ID больше 350
Иногда бывает полезно ограничить выборку записей на основе конкретных условий, например, отфильтровать посты, у которых ID больше определенного значения.
function filter_posts_by_id( $where ) {
// Добавляем условие для выборки постов с ID > 350
return $where . ' AND ID > 350';
}
add_filter( 'posts_where', 'filter_posts_by_id' );
// Выполняем запрос
$posts = new WP_Query( [
'post_type' => 'post',
'posts_per_page' => -1,
// Другие параметры запроса
] );
// Удаляем фильтр, чтобы он не применялся к другим запросам
remove_filter( 'posts_where', 'filter_posts_by_id' );
Этот пример демонстрирует, как с помощью фильтра posts_where
ограничить выборку постов с ID больше 350. После выполнения запроса мы удаляем фильтр, чтобы он не воздействовал на другие вызовы WP_Query()
.
Пример 3: Использование фильтра для добавления условий поиска по произвольным полям
Предположим, что вы хотите фильтровать записи не только по стандартным полям, но и по значениям произвольных полей (например, по цене книги). Для этого можно использовать фильтр posts_where
, добавив дополнительные условия в запрос:
add_filter( 'posts_where', 'filter_posts_by_custom_field' );
function filter_posts_by_custom_field( $where ) {
global $wpdb;
// Добавляем условие для поиска по произвольному полю 'price'
$where .= " AND EXISTS (SELECT * FROM {$wpdb->postmeta} WHERE post_id = {$wpdb->posts}.ID AND meta_key = 'price' AND meta_value > 20)";
return $where;
}
// Выполняем запрос
$posts = new WP_Query( [
'post_type' => 'book',
'posts_per_page' => -1,
] );
В этом примере мы добавляем условие, которое фильтрует записи типа book
с произвольным полем price
, значением которого больше 20. Таким образом, только книги с ценой выше 20 будут извлечены в запросе.
Пример 4: Использование фильтра для исключения определенных постов
Если вам нужно исключить из выборки посты с определенными условиями, можно воспользоваться фильтром posts_where
для добавления условий исключения.
function exclude_specific_posts( $where ) {
// Исключаем посты с ID 10 и 20
return $where . " AND ID NOT IN (10, 20)";
}
add_filter( 'posts_where', 'exclude_specific_posts' );
// Запрос для получения всех постов
$posts = new WP_Query( [
'post_type' => 'post',
'posts_per_page' => -1,
] );
// Убираем фильтр, чтобы не влиять на другие запросы
remove_filter( 'posts_where', 'exclude_specific_posts' );
В этом примере мы добавляем условие, которое исключает посты с ID 10 и 20 из выборки.
Заключение
Хук posts_where
в WordPress предоставляет возможность гибко изменять SQL-запросы, добавляя свои условия для фильтрации постов. Этот фильтр полезен для создания сложных запросов, например, для фильтрации по меткам, произвольным полям или автору, а также для исключения постов по определенным критериям. Важно помнить, что фильтр применяется только к запросам WP_Query
, и необходимо аккуратно использовать его, чтобы не повлиять на другие части сайта.