Часто справшивают, как сделать пост с индивидуальным оформлением, убрать в определенном посте сайдбар, и вообще сделать специальный пост, структура которого бы отличалась от всех остальных? Для решения таких задач существуют шаблоны – разные типы файлов темы, предназначенной для одной цели. Давайте создадим дополнительный шаблон для поста, чтобы при необходимости применить его, когда нужно вывести пост с индивидуальным оформлением и структурой, и подключим возможность выбора шаблона поста в редакторе.
Чтобы создать шаблон поста, скопируйте файл single.php с новым названием. Например, single-one.php.
Откройте файл single-one.php, и добавьте в него в самое начало, до всего остального кода строчки с названием шаблона (желательно на английском языке):
Дополнительный шаблон для одиночного поста под названием “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”, откройте в админке редактор постов, и настройте экран, указав, что на экране должен отображаться бокс “Шаблон поста”.
После этого можете создавать запись и выбирать для нее новый шаблон.
Таким образом вы можете создать столько разных шаблонов для одиночного поста, сколько вам нужно.











P.S. В WordPress 3+ можно обойтись без пунктов 4 и 5.
Как? Поподробнее можно?
Выполняете пункты 1-3.
Создаете пост. Перед сохранением выбираете шаблон поста.
Либо можете выполнить все по инструкции с 1 по 5 пункты.
Все сделал точно по вашей инструкции – не появляется возможность выбрать шаблон.
В чём может быть ошибка?
Доброе утро! Все, очень тщательно сделала по вашей инструкции. Но нет возможности выбрать шаблон записи (поста). В панели Настройки экрана нет Надписи Шаблон поста
Скажите пожалуйста! Где еще можно что-то подправить, чтобы появилась такая возможность выбрать шаблон именно для ПОСТА (записи)
Спасибо!