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
Використання не знайдено.