request
Фільтрує параметри (змінні) основного запиту WordPress.
Основний запит – це запит, пов’язаний з поточною сторінкою. Наприклад, на сторінці рубрики одні змінні запити, на сторінці пошуку інші…
Коли спрацьовує хук request
Під час побудови основного запиту, що будується після події init . Давайте розберемо частинами.
Основний запит будуватися функцією WP::main() по суті він і є все, що написано про функцію wp() – він встановлює середовище WordPress. Подивимося на код, як встановлюється середовище:
// public function main($query_args = '') { $this->init(); // встановлює поточного користувача $this->parse_request($query_args); // Розбирає вказані параметри запиту та параметри URL (ЧПУ) $this->send_headers(); // встановлює header() заголовки $this->query_posts(); // отримує записи за параметрами запиту $this->handle_404(); // виставляє статус 404, якщо записів на запит не знайдено $this->register_globals(); // встановлює глобальні змінні WordPress: // $query_string, $posts, $post, $request, $more, $single, $authordata // фільтр середовища WordPress після того, як вона була встановлена do_action_ref_array( 'wp', array( &$this ) ); }
Що відбувається у коді, описано в коді. Так ось, фільтр request
спрацьовує в кінці методу WP::parse_request() і дозволяє змінити властивість WP::query_vars , яка містить змінні запити, що використовуються в методі WP::query_posts() , який у свою чергу отримує записи.
Інший фільтр: parse_request – розширена копія фільтра request
do_action_ref_array( 'parse_request', array( &$this ) );
Тільки він передає весь клас WP за посиланням і через нього ми можемо змінити як змінну класу $query_vars , а й інші змінні. Хоча, як правило, нам потрібно змінювати саме змінну $query_vars .
Ще один фільтр: pre_get_posts – аналог фільтра request
Фільтр pre_get_posts .
pre_get_posts спрацьовує абсолютно для всіх запитів, а не тільки для основного. Він спрацьовує щоразу коли викликається функція WP_Query .
Для основного запиту (з вище коду) він спрацьовує під час виклику методу WP::query_posts() , тобто. після фільтра request
.
Використання
add_filter( 'request', 'wp_kama_request_filter'); /** * Function for `request` filter-hook. * * @param array $query_vars array of requested query variables. * * @return array */ function wp_kama_request_filter( $query_vars ){ // Filter... return $query_vars; }
-
$query_vars
(масив) - Параметри запиту, які потрібно змінити (відфільтрувати).
Приклади
#1 Змінимо URL рубрики
Допустимо, у нас є рубрика /category/cars/ і нам потрібно щоб по URL /category/cars/super-cars/ відкривалася та сама рубрика /category/cars/ .
add_filter( 'request', 'my_request'); function my_request( $query_vars ){ $request = urldecode($_SERVER['REQUEST_URI']); if( $request == '/category/cars/super-cars/' ){ $query_vars['category_name'] = 'cars'; } return $query_vars; }
#2 Де які параметри встановлено
// На головній: `example.com` Array ( ) // Сторінка запису: http://example.com/my_post_name/ Array ( [page] => [name] => my_post_name ) // Сторінка постійної сторінки: http://example.com/my_page/ Array ( [page] => [pagename] => my_page ) // На сторінці рубрики: `example.com/category/cars/` Array ( [category_name] => uncategorized ) // Сторінка теги: http://example.com/tag/eshhe-odna-metka/ Array ([tag] => eshhe-odna-metka) // Сторінка автора: http://example.com/author/admin Array ([author_name] => admin) // Архів дати: http://example.com/2016/10/08/ Array ([year] => 2016 [monthnum] => 10 [day] => 08)
#3 Зміна адреси RSS стрічки на будь-яке інше
Можна створити будь-який фід, наприклад atom. Для цього створюємо сторінку та змінюємо її запит. У цьому прикладі сторінка називається ‘feed-yandex-zen’ .
add_filter( 'request', 'zen_url_replace'); function zen_url_replace( $query_vars ) { if ( isset( $query_vars['pagename'] ) && $query_vars['pagename'] == 'feed-yandex-zen' ) { unset($query_vars); $query_vars['feed'] = 'zen'; } return $query_vars; }
#4 Пагінація для постійної сторінки з ярликом category
Змінює запит, щоб працювала пагінація на сторінці категорії. Сторінка (page) category повинна бути створена в адмінці та вказана в налаштуваннях читання, як “Сторінка записів”.
У шаблоні сторінки має бути стандартний цикл ОП.
/** * Змінює запит, щоб працювала пагінація на сторінці категорії. * * Сторінка (page) category повинна бути створена в адмінці * і вказана в налаштуваннях читання як "Сторінка записів" * * $param array $query_vars * * @return array */ add_filter( 'request', function ( $query_vars ) { if ( isset( $query_vars['category_name'] ) ) { $page = explode( '/', $query_vars['category_name'] ); if ( $page[0] == 'page' ) { $paged = isset( $page[1] ) && is_numeric( $page[1] ) ? (int) $page[1]: 0; $query_vars['page'] = ''; $query_vars['pagename'] = 'category'; $query_vars['paged'] = $paged; unset( $query_vars['category_name'] ); } } return $query_vars; } );
#5 Функціонал “Показати записи” на вказаній статичній сторінці
add_filter( 'request', function ( $query_vars ) { $page_id = 484; $page_slug = 'all-articles'; if ( isset( $query_vars['pagename'] ) && $query_vars['pagename'] === $page_slug ) { add_filter( "pre_option_page_for_posts", function () { return $page_id; } ); } return $query_vars; } );
#6 За вказаним посиланням показати стандартний feed
Є послуги, яким необхідно віддавати ФІД з розширенням xml, наприклад news.xml
. Зробимо стандартний ФІД WordPress доступний за таким посиланням.
add_filter( 'request', function ( $query_vars ) { // Іде запит на адресу домен/news.xml if ( [ 'page' => '', 'name' => 'news.xml' ] === $query_vars ) { // Підмінюємо змінні запити такі ж, як за адресою домен/feed/ $query_vars = ['feed' => 'feed']; // Підмінюємо REQUEST_URI, інакше буде редирект на порожній фід домен/news.xml/feed/ $_SERVER['REQUEST_URI'] = '/feed/'; } return $query_vars; } );
Те саме можна зробити на хуку init :
add_filter('init', function() { if ( $_SERVER['REQUEST_URI'] === '/news.xml' ) { $_SERVER['REQUEST_URI'] = '/feed/'; } } );
#7 Відкриємо доступ до сторінки sitemap за адресою sitemap.html
Нехай на сайті ЧПУ виду /%postname%/
, але потрібно віддавати сторінку з html картою сайту за адресою example.com/sitemap.html . Створимо сторінку зі slug=sitemap, яка за допомогою плагіна або своїх напрацювань буде генерувати html карту сайту, решта зробить код:
add_filter( 'request', 'add_sitemap_html'); function add_sitemap_html( $query_vars ) { // Перевіряємо, чи запитана сторінка sitemap.html if ( isset( $query_vars['name'] ) && $query_vars['name'] == 'sitemap.html' ) { // Підмінюємо запит даними від сторінки зі slug=sitemap $query_vars = [ 'page' => '', 'pagename' => 'sitemap', ]; // Видаляємо перенаправлення на url зі слішем на кінці remove_action( 'template_redirect', 'redirect_canonical'); } return $query_vars; }
список змін
З версії 2.1.0 | Введено. |
Де викликається хук
Де використовується хук у WordPress
add_filter( 'request', '_post_format_request');