Пользовательские форматы записей для пользовательских типов записей

31 окт. 2011 г., 00:48:12
Просмотры: 13.9K
Голосов: 4

Судя по распространенному мнению, лучше использовать пользовательские типы записей вместо пользовательских форматов записей.

У меня есть несколько пользовательских типов записей, которые я хочу стилизовать в 4 разных форматах, причем так, чтобы это не было публично видно (не как категория, метка или пользовательская таксономия).

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

Главный недостаток - они не так просто настраиваются - я мог бы переименовать их для ясности.

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

0
Все ответы на вопрос 4
3

У вас есть несколько вариантов, и я поясню, что вы можете сделать.

  1. Создать шаблон страницы для пользовательского типа записи, используя что-то вроде single-customposttype.php, и воспользоваться преимуществами иерархии шаблонов: http://codex.wordpress.org/Template_Hierarchy

  2. Использовать условный запрос для стилизации в цикле (или в том, что вы используете), например: if (post type= ваш_пользовательский_тип) стилизовать_так;. Или использовать другие условные теги WordPress. http://codex.wordpress.org/Class_Reference/WP_Query

  3. Использовать таксономию для организации в админке — пользовательские таксономии не обязательно должны быть публичными.

  4. Использовать форматы записей для вашего пользовательского типа записей, CPT могут поддерживать post-formats, http://codex.wordpress.org/Function_Reference/register_post_type

Большинство выбирает первый вариант, но это зависит от того, что вы пытаетесь сделать.

31 окт. 2011 г. 01:21:18
Комментарии

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

Rothbert Rothbert
31 окт. 2011 г. 04:36:38

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

Wyck Wyck
31 окт. 2011 г. 05:36:51

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

Rothbert Rothbert
1 нояб. 2011 г. 00:51:20
0

Ротберт, ты скрываешь видимость таксономий в файлах своей темы.

Ключевое различие между "Пользовательскими типами записей" (Custom Post Types) и "Форматами записей" (Post Formats) заключается в слове "пользовательские".

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

4 янв. 2012 г. 23:55:50
1

Вы можете включить поддержку форматов записей для пользовательского типа записи (CPT). При регистрации типа записи укажите 'post-formats' в аргументе 'supports'.

8 янв. 2014 г. 01:14:47
Комментарии

Можете ли вы улучшить ваш ответ, добавив пример кода и ссылки на дополнительную документацию?

Aurovrata Aurovrata
17 апр. 2021 г. 17:28:49
0

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

Основные шаги:

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

Вот код:

// Подключаемся к действию 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' );
17 апр. 2021 г. 17:38:21