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

У вас есть несколько вариантов, и я поясню, что вы можете сделать.
Создать шаблон страницы для пользовательского типа записи, используя что-то вроде
single-customposttype.php
, и воспользоваться преимуществами иерархии шаблонов: http://codex.wordpress.org/Template_HierarchyИспользовать условный запрос для стилизации в цикле (или в том, что вы используете), например:
if (post type= ваш_пользовательский_тип) стилизовать_так;
. Или использовать другие условные теги WordPress. http://codex.wordpress.org/Class_Reference/WP_QueryИспользовать таксономию для организации в админке — пользовательские таксономии не обязательно должны быть публичными.
Использовать форматы записей для вашего пользовательского типа записей, CPT могут поддерживать
post-formats
, http://codex.wordpress.org/Function_Reference/register_post_type
Большинство выбирает первый вариант, но это зависит от того, что вы пытаетесь сделать.

Спасибо за ответ, Wyck. У меня есть 3 CPT, которые я хочу форматировать согласно 4 подтипам, как это делают форматы записей. Возможно, я буду использовать шаблоны в будущем, но сейчас я ищу способ применить формат без использования таксономий, которые видны на фронтенде. Так что мне нужно либо найти способ ограничить видимость пользовательской таксономии только бэкендом, либо использовать форматы записей, переименованные для ясности, которые уже хорошо ограничены бэкендом. Буду благодарен за подсказки, как добиться таксономий только для бэкенда, так как это, вероятно, лучший вариант.

При регистрации таксономии у вас есть много опций, некоторые из которых позволяют не делать их публичными, http://codex.wordpress.org/Function_Reference/register_taxonomy

Спасибо, Wyck - OK, я видел опцию public => false и пробовал её, но таксономия всё ещё отображалась в подвале моей записи, но понял, что эта опция убирает её из облаков тегов и т.д. Теперь я вижу, что мне нужно найти способ исключить определённые пользовательские таксономии из функции, которая генерирует подвал записи. Начну новый вопрос.

Ротберт, ты скрываешь видимость таксономий в файлах своей темы.
Ключевое различие между "Пользовательскими типами записей" (Custom Post Types) и "Форматами записей" (Post Formats) заключается в слове "пользовательские".
Другими словами, ты не можешь изменить название пользовательских форматов записей. Ты ограничен 10 стандартными форматами, встроенными в WordPress. Ты не можешь добавлять новые форматы записей. И ты не можешь изменять названия существующих.

Я нашел интересную статью в блоге Натана Сварца, в которой рассказывается, как создавать пользовательские форматы записей для любого типа записей с помощью пользовательской таксономии. Я воспроизвожу его код здесь, чтобы, даже если его блог исчезнет, его решение осталось доступным.
Основные шаги:
- Создать пользовательскую таксономию и назначить ее для записей.
- Программно создать термины в этой таксономии так, чтобы не-администраторы не могли создавать, редактировать или удалять новые, но могли назначать их записям.
- Установить термин по умолчанию.
- Изменить отображение таксономии на странице редактора записи, чтобы можно было выбрать только один формат.
Вот код:
// Подключаемся к действию init и вызываем функцию custom_post_formats_taxonomies
add_action( 'init', 'custom_post_formats_taxonomies', 0 );
// Создаем новую таксономию под названием 'format'
function custom_post_formats_taxonomies() {
// Добавляем новую таксономию, делаем ее иерархической (как категории)
$labels = array(
'name' => _x( 'Форматы', 'название таксономии', 'textdomain' ),
'singular_name' => _x( 'Формат', 'название таксономии в единственном числе', 'textdomain' ),
'search_items' => __( 'Искать форматы', 'textdomain' ),
'all_items' => __( 'Все форматы', 'textdomain' ),
'parent_item' => __( 'Родительский формат', 'textdomain' ),
'parent_item_colon' => __( 'Родительский формат:', 'textdomain' ),
'edit_item' => __( 'Редактировать формат', 'textdomain' ),
'update_item' => __( 'Обновить формат', 'textdomain' ),
'add_new_item' => __( 'Добавить новый формат', 'textdomain' ),
'new_item_name' => __( 'Название нового формата', 'textdomain' ),
'menu_name' => __( 'Формат', 'textdomain' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'format' ),
'capabilities' => array(
'manage_terms' => '',
'edit_terms' => '',
'delete_terms' => '',
'assign_terms' => 'edit_posts'
),
'public' => true,
'show_in_nav_menus' => false,
'show_tagcloud' => false,
);
register_taxonomy( 'format', array( 'post' ), $args ); // Наша новая таксономия 'format'
}
// Программно создаем несколько терминов форматов
function example_insert_default_format() { // Позже определим это как формат по умолчанию, чтобы все записи имели хотя бы один формат
wp_insert_term(
'По умолчанию',
'format',
array(
'description' => '',
'slug' => 'default'
)
);
}
add_action( 'init', 'example_insert_default_format' );
// Повторяем следующие 11 строк для каждого формата, который нужно добавить
function example_insert_map_format() {
wp_insert_term(
'Карта', // Измените это название
'format',
array(
'description' => 'Добавляет большую карту в начало записи.',
'slug' => 'map'
)
);
}
add_action( 'init', 'example_insert_map_format' );
// Убеждаемся, что есть формат по умолчанию, и он выбирается, если пользователь не выбрал другой
function moseyhome_default_format_term( $post_id, $post ) {
if ( 'publish' === $post->post_status ) {
$defaults = array(
'format' => 'default' // Измените 'default' на slug термина, который должен быть по умолчанию
);
$taxonomies = get_object_taxonomies( $post->post_type );
foreach ( (array) $taxonomies as $taxonomy ) {
$terms = wp_get_post_terms( $post_id, $taxonomy );
if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
}
}
}
}
add_action( 'save_post', 'moseyhome_default_format_term', 100, 2 );
// Заменяем чекбоксы для таксономии формата на радио-кнопки с помощью кастомного метабокса
function wpse_139269_term_radio_checklist( $args ) {
if ( ! empty( $args['taxonomy'] ) && $args['taxonomy'] === 'format' ) {
if ( empty( $args['walker'] ) || is_a( $args['walker'], 'Walker' ) ) { // Не переопределяем сторонние walker'ы
if ( ! class_exists( 'WPSE_139269_Walker_Category_Radio_Checklist' ) ) {
class WPSE_139269_Walker_Category_Radio_Checklist extends Walker_Category_Checklist {
function walk( $elements, $max_depth, $args = array() ) {
$output = parent::walk( $elements, $max_depth, $args );
$output = str_replace(
array( 'type="checkbox"', "type='checkbox'" ),
array( 'type="radio"', "type='radio'" ),
$output
);
return $output;
}
}
}
$args['walker'] = new WPSE_139269_Walker_Category_Radio_Checklist;
}
}
return $args;
}
add_filter( 'wp_terms_checklist_args', 'wpse_139269_term_radio_checklist' );
