posts_where
Дозволяє змінювати 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, переданий за посиланням.
Приклади
#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;
}#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 | Введено. |
Де викликається хук
$where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) );
Де використовується хук у WordPress
Використання не знайдено.