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');