WordPress как на ладони

posts_whereхук-фильтрWP 1.5.0

Позволяет изменять WHERE часть SQL запроса связанного с получением записей (WP_Query).

Этот хук-фильтр позволяет изменять запросы и создавать свои произвольные условия, чтобы определить выборку постов в том или ином случае.

Фильтр posts_where срабатывает до установки запроса пагинации, поэтому фильтр нужно использовать, когда изменения никак не связаны с пагинацией. Чтобы изменения влияли и на пагинацию, нужно использовать аналогичный фильтр posts_where_paged, который срабатывает после установки запроса пагинации.

Перед тем, как изменять запрос, установите условия if, чтобы точно определить страницу или событие, когда запрос должен изменяться. Фильтр срабатывает всякий раз, когда вызывается WP_Query и запрос может быть изменен там, где это совершенно не нужно. Это может стать проблемой, изменив запрос для одной страницы, он будет меняться везде.

Заметки

suppress_filters

Если нужно отключить работу всех фильтров в WP_Query связанных с изменением SQL запроса, то определите параметр suppress_filters=true. Тогда никакие фильтры не будут срабатывать и WP_Query будет работать "мимо" фильтров:

posts_where
posts_join
posts_where_paged
posts_groupby
posts_join_paged
posts_distinct
post_limits
posts_fields
posts_request
posts_results
the_posts
и т.д.

По умолчанию, в функции получения постов get_posts(), suppress_filters = true и она не чувствительна к изменениям запросов через фильтры. Пример:

// Функция которая изменяет запрос
function useless_condition ( $where ) {
	return $where . ' AND 1=1 ';
}

// Прикрепляем функцию к фильтру posts_where
add_filter( 'posts_where' , 'useless_condition' );

// Получаем посты и делаем так, чтобы наши фильтры сработали
// Для этого указываем параметр suppress_filters,
// по умолчанию в get_posts он true
$posts = get_posts( array( 'suppress_filters' => FALSE ) );

Использование

add_filter( 'posts_where', 'wp_kama_posts_where_filter' );

/**
 * Function for `posts_where` filter-hook.
 * 
 * @param string $where The WHERE clause of the query.
 *
 * @return string
 */
function wp_kama_posts_where_filter( $where ){

	// filter...
	return $where;
}
$where(строка)
Часть текущего SQL запроса. Например: WHERE post_status = 'publish' AND post_author = '1'.
$wp_query(WP_Query)
Экземпляр класса WP_Query, переданный по ссылке.

Примеры

0

#1 Ограничим выборку постов в админ-панели

Предположим, у нас есть тип записи book с прикрепленной к нему таксономией author (авторы книг). Мы использовали хук-действие restrict_manage_posts, через который создали выпадающий список авторов (термины таксономии). Теперь, при выборе из списка автора и нажатии на кнопку "фильтровать", нам нужно получить записи (книги) этого автора. Имя автора в этом случае будет добавлено в $_GET переменную author_restrict_posts. Учитывая эту переменную и используя posts_where, мы можем изменить запрос:

add_filter( 'posts_where' , 'posts_where' );

function posts_where( $where ) {

	if( is_admin() ) {
		global $wpdb;

		if (
			isset( $_GET['author_restrict_posts'] ) &&
			!empty( $_GET['author_restrict_posts'] ) &&
			intval( $_GET['author_restrict_posts'] ) != 0
		) {
			$author = intval( $_GET['author_restrict_posts'] );

			$where .= " AND ID IN (SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id=$author )";
		}
	}
	return $where;
}
0

#2 Запросим записи, у которых ID больше 350

function modify_posts_where( $where ) {
	return $where . ' AND ID > 350';
}

// Добавляем условие
add_filter( 'posts_where', 'modify_posts_where' );

// Делаем запрос
$posts = new WP_Query( [
	'post_type'      => 'post',
	'posts_per_page' => - 1,
	// и другие требуемые параметры
] );

// Удаляем условие, чтобы другие вызовы WP_Query() не затрагивать
remove_filter( 'posts_where', 'modify_posts_where' );

Список изменений

С версии 1.5.0 Введена.

Где вызывается хук

WP_Query::get_posts()
posts_where
wp-includes/class-wp-query.php 2717
$where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) );

Где используется хук в WordPress

Использование не найдено.
3 комментария
    Войти