Программное создание страниц в WordPress и их отображение

Программное создание страниц в WordPress и их отображение

Содержимое

Здравствуйте, уважаемые читатели блога!
Сегодня мы затронем еще одну важную тему, а именно — программное создание страниц в WP движке. А так же их отображение по заданному URL.

На первый взгляд, подобная функция может показаться совершенно не нужной. Но! Что если на странице просмотра плагина, нужно добавить текстовую информацию? Да, здесь мы можем реализовать наш плагин (к примеру форму обратной связи) в виде шорткода, и вставить его в текст страницы. Но ведь бывают ситуации, когда одним шорткодом не отделаешься. И нужно разрабатывать отдельную страницу, отображая на ней как форму (к примеру регистрации или заказа) так и текстовое пояснения к ней. И очень важно, что-бы этот текст можно было редактировать через админку. Почему? К примеру, если это страница с формой заказа, то текст пояснения может содержать информацию о текущей скидке. Которая может меняться в зависимости от сезона года или других предпочтений заказчика. Суть думаю понятна и задача ясна (или прошу к комментариям).

Программное создание страницы

Это делается очень и очень просто, одной функцией - «wp_insert_post». В нашем уроке, мы будет создавать страницу сразу же при установке плагина:

register_activation_hook(__FILE__, function(){
	global $user_ID;

	wp_insert_post(array(
		'post_type'		=> 'page',
		'post_title'		=> 'Солнце',
		'post_content'		=> file_get_contents(__DIR__.'/page.html'),
		'comment_status'	=> 'closed',
		'post_status'		=> 'private',
		'ping_status'		=> 'closed',
		'post_author'		=> $user_ID,
		'post_name'		=> 'module-name-page-sun',
		'post_password'	=> time(),
	));
});

где ключи массива:
post_type — тип записи (в нашем случае страница)
post_title — заголовок записи
post_content — содержимое записи (в примере выше, содержимое было считано с html файла)
comment_status — комментирование страницы запрещено
post_status — статус записи (закрыта, опубликована, черновик, пр.). У нас запись закрыта, т. к. нет смысла отображать пояснение к форме, в виде обычной страницы.
ping_status — статус пинга записи (у нас он отключен)
post_author — ID автора поста (в нашем случае, автором становится тот, кто инсталирует плагин)
post_name — slug статьи (т. е. часть URL по которому будет отображаться статья), это важно!
post_password — пароль для просмотра записи (на всякий случай)

На этом, создание страницы заканчивается. После установки модуля, страницу можно будет найти в соответствующем разделе:

Программно созданная страница WordPress

Как отобразить страницу по заданному URL в WordPress

Для начала код:

if((strpos($_SERVER["REQUEST_URI"], '/some-module-page') !== false))
{
	add_filter('the_posts', function($_posts = '', $_query = '')
	{
		global $wp_query;
		
		if(empty($_posts) == false)
		{
			return $_posts;
		}
		
		$Page = get_page_by_path('module-name-page-sun');
		if(is_object($Page) == false)
		{
			wp_die('Page not found');
		}
		
		$posts[] =
			(object) array(
				'ID'                    => '9999999',
				'post_author'           => '1',
				'post_date'             => '2001-01-01 01:01:01',
				'post_date_gmt'         => '2001-01-01 01:01:01',
				'post_title'            => $Page -> post_title,
				'post_content'          => $Page -> post_content,
				'post_excerpt'          => '',
				'post_status'           => 'publish',
				'comment_status'        => 'closed',
				'ping_status'           => 'closed',
				'post_password'         => '',
				'to_ping'               => '',
				'pinged'                => '',
				'post_modified'         => '2001-01-01 01:01:01',
				'post_modified_gmt'     => '2001-01-01 01:01:01',
				'post_content_filtered' => '',
				'post_parent'           => '0',
				'menu_order'            => '0',
				'post_type'             => 'page',
				'post_mime_type'        => '',
				'post_category'         => '0',
				'comment_count'         => '0',
				'filter'                => 'raw',
				'guid'                  => get_bloginfo('url').'/?page_id=9999999',
				'post_name'             => get_bloginfo('url').'/?page_id=9999999',
				'ancestors'             => array()
			);
		
			$wp_query -> is_page   = true;
			$wp_query -> is_single = false;
			$wp_query -> is_home   = false;
			$wp_query -> comments  = false;
			unset($wp_query -> query['error']);
			$wp_query -> query_vars['error'] = '';
			$wp_query -> is_404	   = false;

			remove_filter('the_content', 'wpautop');
		
		return $posts;
	}, 10, 2);
}

Что-бы понять, попали мы на нужную нам страницу, делаем проверку:

if((strpos($_SERVER["REQUEST_URI"], '/some-module-page') !== false))

и если все совпадает — да, мы там где нужно 🙂

Далее, создаем фильтр на the_post:

add_filter('the_posts', function($_posts = '', $_query = '')
{

}, 10, 2);

что бы можно было добавить и нашу страницу.

Т.к. «the_post» вызывается у нас в разных местах (во время формирования меню, списка записей, пр.). Делаем проверку:

if(empty($_posts) == false)
{
	return $_posts;
}

т. е. если $_posts что-то содержит — выходим из фильтра, возвращая объект поста/страницы.

В противном случае, мы можем отобразить что-то свое. В нашем примере — созданную нами в первой части — страницу. А для этого, ее нужно сначала получить из БД:

$Page = get_page_by_path('module-name-page-sun');
if(is_object($Page) == false)
{
	wp_die('Page not found');
}

используя ф-ю «get_page_by_path», по параметру «post_name», мы получаем содержимое страницы. Далее — проверка, т. к. страница может быть удалена через админку.

И ее отображение, через «псевдо» объект:

$posts[] =
	(object) array(
		'ID'                    => '9999999',
		'post_author'           => '1',
		'post_date'             => '2001-01-01 01:01:01',
		'post_date_gmt'         => '2001-01-01 01:01:01',
		'post_title'            => $Page -> post_title,
		'post_content'          => $Page -> post_content,
		'post_excerpt'          => '',
		'post_status'           => 'publish',
		'comment_status'        => 'closed',
		'ping_status'           => 'closed',
		'post_password'         => '',
		'to_ping'               => '',
		'pinged'                => '',
		'post_modified'         => '2001-01-01 01:01:01',
		'post_modified_gmt'     => '2001-01-01 01:01:01',
		'post_content_filtered' => '',
		'post_parent'           => '0',
		'menu_order'            => '0',
		'post_type'             => 'page',
		'post_mime_type'        => '',
		'post_category'         => '0',
		'comment_count'         => '0',
		'filter'                => 'raw',
		'guid'                  => get_bloginfo('url').'/?page_id=9999999',
		'post_name'             => get_bloginfo('url').'/?page_id=9999999',
		'ancestors'             => array()
	);

	$wp_query -> is_page   = true;
	$wp_query -> is_single = false;
	$wp_query -> is_home   = false;
	$wp_query -> comments  = false;
	unset($wp_query -> query['error']);
	$wp_query -> query_vars['error'] = '';
	$wp_query -> is_404	   = false;

	remove_filter('the_content', 'wpautop');

return $posts;

Где «$posts» наш новый объект статьи.

Скачать файл с уроком можно по этой ссылке.

На этом все. Спасибо за внимание!

Поделиться в соцсетях:
Статьи на похожую тематику

С вашим WordPress сайтом проблемы? нужен дополнительный функционал? нестандартный плагин или сверстать новую страницу?
Тогда напишите мне через форму обратной связи, и я постараюсь вам помочь.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *