request хук-фільтрWP 2.1.0

Фільтрує параметри (змінні) основного запиту 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
(масив)
Параметри запиту, які потрібно змінити (відфільтрувати).

Приклади

0

#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;
}
0

#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)
0

#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;
}
0

#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;
} );
0

#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;
} );
0

#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/';
	}
} );
0

#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

wp-includes/default-filters.php 543

add_filter( 'request', '_post_format_request');

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

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