Програмне створення сторінок у WordPress та їх відображення

Програмне створення сторінок у WordPress та їх відображення

Вітаю, шановні читачі блогу!

Сьогодні ми торкнемося ще однієї важливої теми, а саме — програмне створення сторінок у WordPress. А також їх відображення за заданим 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 сайтом проблеми? потрібний додатковий функціонал? нестандартний плагін чи згорнути нову сторінку?
Тоді напишіть мені через форму зворотного зв'язку, і я намагатимусь вам допомогти.

Напишіть коментар

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