Создание шаблона поста / Функция выбора шаблона для поста

Создание шаблона поста / Функция выбора шаблона для поста | n-wp.ru Настройки
Инструкция по внедрению функции, задающей индивидуальный шаблон для одиночного поста при его создании или редактировании.

Часто справшивают, как сделать пост с индивидуальным оформлением, убрать в определенном посте сайдбар, и вообще сделать специальный пост, структура которого бы отличалась от всех остальных? Для решения таких задач существуют шаблоны — разные типы файлов темы, предназначенной для одной цели. Давайте создадим дополнительный шаблон для поста, чтобы при необходимости применить его, когда нужно вывести пост с индивидуальным оформлением и структурой, и подключим возможность выбора шаблона поста в редакторе.

Чтобы создать шаблон поста, скопируйте файл single.php с новым названием. Например, single-one.php.

Создание шаблона поста / Функция выбора шаблона для поста (4)

Откройте файл single-one.php, и добавьте в него в самое начало, до всего остального кода строчки с названием шаблона (желательно на английском языке):


Создание шаблона поста / Функция выбора шаблона для поста (1)

Дополнительный шаблон для одиночного поста под названием «Single One» готов. Вы можете изменить его структуру, оформление, добавить и удалить элементы.

Теперь осталось подключить универсальную функцию, которая будет находить среди файлов темы те, которые помечены как шаблоны текстом «Single Post Template:» (пункт №2), и выводить их в виде выпадающего меню в редакторе. Для этого нужно добавить следующий код в файл functions.php:

if(!function_exists('get_post_templates')) {
function get_post_templates() {
	$themes = get_themes();
	$theme = get_current_theme();
	$templates = $themes[$theme]['Template Files'];
	$post_templates = array();

	$base = array(trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()));

	foreach ((array)$templates as $template) {
		$template = WP_CONTENT_DIR . str_replace(WP_CONTENT_DIR, '', $template); 
		$basename = str_replace($base, '', $template);

		if (false !== strpos($basename, '/'))
			continue;

		$template_data = implode('', file( $template ));

		$name = '';
		if (preg_match( '|Single Post Template:(.*)$|mi', $template_data, $name))
			$name = _cleanup_header_comment($name[1]);

		if (!empty($name)) {
			if(basename($template) != basename(__FILE__))
				$post_templates[trim($name)] = $basename;
		}
	}

	return $post_templates;

}}

if(!function_exists('post_templates_dropdown')) {
function post_templates_dropdown() {
	global $post;
	$post_templates = get_post_templates();
	
	foreach ($post_templates as $template_name => $template_file) {
		if ($template_file == get_post_meta($post->ID, '_wp_post_template', true)) { $selected = ' selected="selected"'; } else { $selected = ''; }
		$opt = '' . $template_name . '';
		echo $opt;
	}
}}

add_filter('single_template', 'get_post_template');
if(!function_exists('get_post_template')) {
function get_post_template($template) {
	global $post;
	$custom_field = get_post_meta($post->ID, '_wp_post_template', true);
	if(!empty($custom_field) && file_exists(TEMPLATEPATH . "/{$custom_field}")) { 
		$template = TEMPLATEPATH . "/{$custom_field}"; }
	return $template;
}}

add_action('admin_menu', 'pt_add_custom_box');
function pt_add_custom_box() {
	if(get_post_templates() && function_exists( 'add_meta_box' )) {
		add_meta_box( 'pt_post_templates', __( 'Шаблон поста', 'pt' ), 
			'pt_inner_custom_box', 'post', 'normal', 'high' );
	}
}
   
function pt_inner_custom_box() {
	global $post;
	echo '';
	echo '<label class="hidden" for="post_template">' . __("Шаблон поста", 'pt' ) . '</label><br />';
	echo '';
	echo 'Стандартный шаблон';
	post_templates_dropdown(); //get the options
	echo '<br /><br />';
	echo '<p>' . __("Некоторые темы имеют собственные шаблоны, которые можно использовать для одиночных постов. Они могут иметь дополнительные функции, или пользовательские макеты.", 'pt' ) . '</p><br />';
}

add_action('save_post', 'pt_save_postdata', 1, 2);
function pt_save_postdata($post_id, $post) {
	
	if ( !wp_verify_nonce( $_POST['pt_noncename'], plugin_basename(__FILE__) )) {
	return $post->ID;
	}

	if ( 'page' == $_POST['post_type'] ) {
		if ( !current_user_can( 'edit_page', $post->ID ))
		return $post->ID;
	} else {
		if ( !current_user_can( 'edit_post', $post->ID ))
		return $post->ID;
	}

	$mydata['_wp_post_template'] = $_POST['_wp_post_template'];
	foreach ($mydata as $key => $value) { 
		if( $post->post_type == 'revision' ) return;
		$value = implode(',', (array)$value); 
		if(get_post_meta($post->ID, $key, FALSE)) {
			update_post_meta($post->ID, $key, $value);
		} else { 
			add_post_meta($post->ID, $key, $value);
		}
		if(!$value) delete_post_meta($post->ID, $key);
	}
}

Чтобы сделать пост с индивидуальным оформлением, которое определяется кодом шаблона «Single One», откройте в админке редактор постов, и настройте экран, указав, что на экране должен отображаться бокс «Шаблон поста».

Создание шаблона поста / Функция выбора шаблона для поста (3)

После этого можете создавать запись и выбирать для нее новый шаблон.

Создание шаблона поста / Функция выбора шаблона для поста (2)

Таким образом вы можете создать столько разных шаблонов для одиночного поста, сколько вам нужно.

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. tiaurus автор

    P.S. В WordPress 3+ можно обойтись без пунктов 4 и 5.

    Ответить
    1. mrmasterix

      Как? Поподробнее можно?

      Ответить
      1. tiaurus автор

        Выполняете пункты 1-3.
        Создаете пост. Перед сохранением выбираете шаблон поста.

        Либо можете выполнить все по инструкции с 1 по 5 пункты.

        Ответить
  2. nixon

    Все сделал точно по вашей инструкции — не появляется возможность выбрать шаблон.

    В чём может быть ошибка?

    Ответить
  3. Марина

    Доброе утро! Все, очень тщательно сделала по вашей инструкции. Но нет возможности выбрать шаблон записи (поста). В панели Настройки экрана нет Надписи Шаблон поста
    Скажите пожалуйста! Где еще можно что-то подправить, чтобы появилась такая возможность выбрать шаблон именно для ПОСТА (записи)
    Спасибо!

    Ответить