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', 10, 2);

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

	// 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Введено.

Де викликається хук

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *