Описание
Создает новый или изменяет имеющийся тип записи.
Функция не должна использоваться до инициализации основных функций WordPress, т.е. до срабатывания действия init.
Представленная ниже документация рассчитана на WordPress версии 3.1 и выше, поэтому некоторые моменты могут не работать на ранних версиях.
Использование
<?php register_post_type( $post_type, $args ) ?>
Шаблон для создания нового типа записи
add_action('init', 'custom_post_type');
function custom_post_type(){
$labels = array(
'name' => '' // основное название для типа записи
,'singular_name' => '' // название для одной записи этого типа
,'add_new' => '' // для добавления новой записи
,'add_new_item' => '' // заголовка у вновь создаваемой записи в админ-панели.
,'edit_item' => '' // для редактирования типа записи
,'new_item' => '' // текст новой записи
,'view_item' => '' // для просмотра записи этого типа.
,'search_items' => '' // для поиска по этим типам записи
,'not_found' => '' // если в результате поиска ничего не было найдень
,'not_found_in_trash' => '' // если не было найдено в корзине
,'parent_item_colon' => '' // для родительских типов. для древовидных типов
,'menu_name' => '' // название меню
);
$args = array(
'label' => null
,'labels' => $labels
,'description' => ''
,'public' => false
,'publicly_queryable' => null
,'exclude_from_search' =>
,'show_ui' => null
,'show_in_menu' => null
,'menu_position' => null
,'menu_icon' => null
,'capability_type' => 'post'
,'hierarchical' => false
,'supports' => array('title','editor')
,'taxonomies' => array('')
,'has_archive' => false
,'rewrite' => true
,'query_var' => true
,'show_in_nav_menus' => null
);
register_post_type( 'type_name', $args );
}
Параметры
- $post_type (строка) (обязательный)
- Название типа записи (максимум 20 значений).
По умолчанию: нет - $args (массив)
- Массив аргументов.
По умолчанию: нет
Аргументы параметра $args
- label (строка)
- Имя типа записи помеченное для перевода на другой язык.
По умолчанию: $post_type - labels (массив)
- Массив содержащий в себе названия ярлыков для типа записи.
По умолчанию будут использованы ярлыки как у "постов" для нового типа записи не имеющего древовидную структуру и ярлыки как у "постоянных страниц" для нового типа записи с древовидной структурой.В массиве можно указать следующие аргументы:
- name - основное название для типа записи, обычно во множественном числе.
- singular_name - название для одной записи этого типа.
- add_new - текс для добавления новой записи, как "добавить новый" у постов в админ-панели. Если нужно использовать перевод названия, вписывайте подобным образом: _x('Add New', 'product');
- add_new_item - текст заголовка у вновь создаваемой записи в админ-панели. Как "Добавить новый пост" у постов.
- edit_item - текст для редактирования типа записи. По умолчанию: редактировать пост/редактировать страницу.
- new_item - текст новой записи. По умолчанию: "Новый пост"/"Новая страница"
- view_item - текст для просмотра записи этого типа. По умолчанию: "Посмотреть пост"/"Посмотреть страницу".
- search_items - текст для поиска по этим типам записи. По умолчанию "Найти пост"/"найти страницу".
- not_found - текст, если в результате поиска ничего не было найдено. По умолчанию: "Постов не было найдено"/"Страниц не было найдено".
- not_found_in_trash - текст, если не было найдено в корзине. По умолчанию "Постов не было найдено в корзине"/"Страниц не было найдено в корзине".
- parent_item_colon - текст для родительских типов. Этот параметр не используется для не древовидных типов записей. По умолчанию "Родительская страница".
- menu_name - название меню. По умолчанию меню будет называться так же как название типа записи.
По умолчанию: если не установлено, name и singular_name примят значение аргумента label
- description (строка)
- Короткое описание этого типа записи.
По умолчанию: '' - public (логический)
- Аргумент определяющий показ пользовательского интерфейса этой менюшки, т.е. показывать ли эту менюшку в админ-панели.
- false - не показывать пользовательский интерфейс (UI) для этого типа записей (show_ui=false), запросы относящиеся к этому типу записей не будут работать в шаблоне (publicly_queryable=false), этот тип записей не будет учитываться при поиске по сайту (exclude_from_search=true), этот тип записей будет спрятан из выбора меню навигации (show_in_nav_menus=false).
- true - show_ui=true, publicly_queryable=true, exclude_from_search=false, show_in_nav_menus=true
По умолчанию: false
- publicly_queryable (логический)
- Запросы относящиеся к этому типу записей будут работать во фронтэнде (в шаблоне сайта).
По умолчанию: значение глобального аргумента (public) - exclude_from_search (логический)
- Исключить ли этот тип записей из поиска по сайту. 1 (true) - да, 0 (false) - нет. Если этот параметр установлен в true и при этом public тоже равен true то для архивов и категорий вывод этого типа постов работать не будет, т.е. этот тип постов будет исключен из запросов типа have_posts()!
По умолчанию: обратное значение аргумента public - show_ui (логический)
- Показывать ли меню для управления этим типом записи в админ-панели. false- не показывать меню, true - показывать меню в админ-панели.
По умолчанию: значение аргумента public - show_in_menu (строка/логический)
- Показывать ли тип записи в администраторском меню и где именно показывать управление этим типом записи. Аргумент show_ui должен быть включен!
- false - не показывать в администраторском меню.
- true - показывать как меню первого уровня.
- строка - показывать как страницу первого уровня, как например 'tools.php' или 'edit.php?post_type=page'
По умолчанию: null
ЗАМЕТКА: Если используется строка для того, чтобы показать как подменю, какого-нибудь главного меню, создаваемого плагином, этот пункт станет первым в списке и соответственно изменит расположение пунктов меню. Для того, чтобы этого не произошло, в плагине, который создает свое меню нужно установить приоритет для действия admin_menu 9 или ниже. - menu_position (число)
- Позиция где должно расположится меню нового типа записи:
- 5 - ниже постов;
- 10 - ниже медиатеки;
- 20 - ниже меню постоянных страниц;
- 60 - ниже первого разделителя;
- 100 - ниже второго разделителя.
По умолчанию: null
- menu_icon (строка)
- Ссылка на картинку, которая будет использоваться для этого меню.
По умолчанию: null - иконка как у меню постов - capability_type (строка/массив)
- Строка которая будет маркером для установки группы разрешений относительного этого типа записей. Можно передавать массив чтобы использовать несколько баз для построения разрешений, например: array('story', 'stories').
По умолчанию: "post" - capabilities (массив)
- Массив разрешений для этого типа записи.
По умолчанию, доступны 7 элементов массива, которые определяют разрешения для этого типа записей, это:
- edit_post, read_post и delete_post - 3 разрешения контролирующие редактирование, прочтение и удаление типа записи.
- edit_posts - контролирует возможность редактировать объекты этого типа записи.
- edit_others_posts - контролирует возможность редактировать объекты этого типа записей, которые принадлежат другому пользователю. Если тип записи не поддерживает авторов, то поведение этого аргумента будет похоже на edit_posts.
- publish_posts - контролирует публикацию объектов этого типа записи.
- read_private_posts - контролирует возможность прочтения личных объектов (записей).
По умолчанию: используется аргумент capability_type для построения списка разрешений
- map_meta_cap (логический)
- Использовать ли внутренние дефолтные разрешения.
По умолчанию: false - hierarchical (логический)
- Будут ли записи этого типа иметь древовидную структуру (как постоянные страницы). true - да, будут древовидными, false - нет, будут связаны тексономией (категориями)
По умолчанию: false - supports (массив)
- Вспомогательные поля на странице создания/редактирования этого типа записи. Метки для вызова функции add_post_type_support().
- title - блок заголовка;
- editor - блок для ввода контента;
- author - блог выбора автора;
- thumbnail блок выбора миниатюры записи;
- excerpt - блок ввода цитаты;
- trackbacks - блок уведомлений;
- custom-fields - блок установки произвольных полей;
- comments - блок комментариев;
- revisions - блок ревизий;
- page-attributes - блок атрибутов постоянных страниц (шаблон и древовидная связь записей, древовидность должна быть включена). Может быть использовано всместо.
По умолчанию: array('title','editor')
- register_meta_box_cb (строка)
- Коллбэк функция, которая будет срабатывать при установки мета блоков для страницы создания/редактирования этого типа записи. Используйте remove_meta_box() и add_meta_box() в коллбэк функции.
По умолчанию: нет - taxonomies (массив)
- Массив зарегистрированных таксономий, которые будут связанны с этим типом записей, например: category или post_tag. Может быть использовано вместо вызова функции register_taxonomy_for_object_type(). Таксономии нужно регистрировать с помощью функции register_taxonomy().
По умолчанию: нет - permalink_epmask (строка)
- ???
По умолчанию: EP_PERMALINK - has_archive (массив/логический)
- Включить поддержку архивов для этого типа записей. Для архивов будет добавлено новое правило перезаписи УРЛов, если аргумент rewrite включен.
По умолчанию: false - rewrite (массив/логический)
- Перезаписать постоянные ссылки (УРЛы) в соответствии с этим форматом. Ставим false, если не нужно перезаписывать УРЛы для этого типа записей.
Аргументы массива, если передается массив:
- slug - префикс для ссылки, по умолчанию название типа записи. Используйте
array('slug'=>$slug), чтобы создать произвольную структуру; - with_front - позволяет предварить постоянные ссылки (например, если если структура постоянных ссылок имеет /blog/, то ссылки будут выглядеть как: /blog/news/. По умолчанию true;
- feeds - по умолчанию значение аргумента has_archive;
- pages - по умолчанию true.
По умолчанию: true (тип записи используется как префикс)
- slug - префикс для ссылки, по умолчанию название типа записи. Используйте
- query_var (строка/логический)
- Ставим false, чтобы убрать возможность запросов или устанавливаем название запроса для этого типа записей.
По умолчанию: true - устанавливается аргумент $post_type - can_export (логический)
- Возможность экспорта этого типа записей.
По умолчанию: true - show_in_nav_menus (логический)
- Включить возможность выбирать этот тип записи в меню навигации.
По умолчанию: значение глобального аргумента
Примеры
1. Пример регистрации произвольного типа записей "book", включающий поддержку раздела помощь.
<?php
add_action('init', 'my_custom_init');
function my_custom_init()
{
$labels = array(
'name' => 'Книги', // Основное название типа записи
'singular_name' => 'Книга', // отдельное название записи типа Book
'add_new' => 'Добавить новую',
'add_new_item' => 'Добавить новую книгу',
'edit_item' => 'Редактировать книгу',
'new_item' => 'Новая книга',
'view_item' => 'Посмотреть книгу',
'search_items' => 'Найти книгу',
'not_found' => 'Книг не найдено',
'not_found_in_trash' => 'В корзине книг не найдено',
'parent_item_colon' => '',
'menu_name' => 'Книги'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','author','thumbnail','excerpt','comments')
);
register_post_type('book',$args);
}
// Добавляем фильтр, который изменит сообщение при публикации при изменении типа записи Book
add_filter('post_updated_messages', 'book_updated_messages');
function book_updated_messages( $messages ) {
global $post, $post_ID;
$messages['book'] = array(
0 => '', // Не используется. Сообщения используются с киндекса 1.
1 => sprintf( 'Book обновлено. <a href="%s">Посмотреть запись book</a>', esc_url( get_permalink($post_ID) ) ),
2 => 'Произвольное поле обновлено.',
3 => 'Произвольное поле удалено.',
4 => 'Запись Book обновлена.',
/* %s: дата и время ревизии */
5 => isset($_GET['revision']) ? sprintf( 'Запись Book востановлена из ревизии %s', wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
6 => sprintf( 'Запись Book опубликована. <a href="%s">Перейти к записи book</a>', esc_url( get_permalink($post_ID) ) ),
7 => 'Запись Book сохранена.',
8 => sprintf( 'Запись Book сохранена. <a target="_blank" href="%s">Предпросмотр записи book</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
9 => sprintf( 'Запись Book запланирована на: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Предпросмотр записи book</a>',
// Как форматировать даты в PHP можно посмотреть тут: http://php.net/date
date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
10 => sprintf( 'Черновик записи Book обновлен. <a target="_blank" href="%s">Предпросмотр записи book</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
);
return $messages;
}
// показ раздела "помощь" для типа записей Books
add_action( 'contextual_help', 'add_help_text', 10, 3 );
function add_help_text($contextual_help, $screen_id, $screen) {
//$contextual_help .= var_dump($screen); // используйте чтобы помочь определить параметр $screen->id
if ('book' == $screen->id ) {
$contextual_help =
'<p>Напоминалка при редактировании записи book:</p>
<ul>
<li>Указать жанр, например Фантастика или История.</li>
<li>Указать автора книги.</li>
</ul>
<p>Если нужно запланировать публикацию на будущее:</p>
<ul>
<li>В блоке с кнопкой "опубликовать" нажмите редактировать дату.</li>
<li>Измените дату на нужную, будущую и подтвердите изменения кнопкой ниже "ОК".</li>
</ul>
<p><strong>За дополнительной информацией обращайтесь:</strong></p>
<p><a href="http://wp-kama.ru/" target="_blank">Блог о WordPress</a></p>
<p><a href="http://wordpress.org/support/" target="_blank">Форум поддержки</a></p>';
} elseif ( 'edit-book' == $screen->id ) {
$contextual_help =
'<p>Это раздел помощи показанный для типа записи Book и т.д. и т.п.</p>' ;
}
return $contextual_help;
}
?>
register_post_type()
из файла: /wp-includes/post.php WP 3.3.2function register_post_type($post_type, $args = array()) {
global $wp_post_types, $wp_rewrite, $wp;
if ( !is_array($wp_post_types) )
$wp_post_types = array();
// Args prefixed with an underscore are reserved for internal use.
$defaults = array(
'labels' => array(), 'description' => '', 'publicly_queryable' => null, 'exclude_from_search' => null,
'capability_type' => 'post', 'capabilities' => array(), 'map_meta_cap' => null,
'_builtin' => false, '_edit_link' => 'post.php?post=%d', 'hierarchical' => false,
'public' => false, 'rewrite' => true, 'has_archive' => false, 'query_var' => true,
'supports' => array(), 'register_meta_box_cb' => null,
'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null,
'permalink_epmask' => EP_PERMALINK, 'can_export' => true,
'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null,
);
$args = wp_parse_args($args, $defaults);
$args = (object) $args;
$post_type = sanitize_key($post_type);
$args->name = $post_type;
if ( strlen( $post_type ) > 20 )
return new WP_Error( 'post_type_too_long', __( 'Post types cannot exceed 20 characters in length' ) );
// If not set, default to the setting for public.
if ( null === $args->publicly_queryable )
$args->publicly_queryable = $args->public;
// If not set, default to the setting for public.
if ( null === $args->show_ui )
$args->show_ui = $args->public;
// If not set, default to the setting for show_ui.
if ( null === $args->show_in_menu || ! $args->show_ui )
$args->show_in_menu = $args->show_ui;
// If not set, default to the whether the full UI is shown.
if ( null === $args->show_in_admin_bar )
$args->show_in_admin_bar = true === $args->show_in_menu;
// Whether to show this type in nav-menus.php. Defaults to the setting for public.
if ( null === $args->show_in_nav_menus )
$args->show_in_nav_menus = $args->public;
// If not set, default to true if not public, false if public.
if ( null === $args->exclude_from_search )
$args->exclude_from_search = !$args->public;
// Back compat with quirky handling in version 3.0. #14122
if ( empty( $args->capabilities ) && null === $args->map_meta_cap && in_array( $args->capability_type, array( 'post', 'page' ) ) )
$args->map_meta_cap = true;
if ( null === $args->map_meta_cap )
$args->map_meta_cap = false;
$args->cap = get_post_type_capabilities( $args );
unset($args->capabilities);
if ( is_array( $args->capability_type ) )
$args->capability_type = $args->capability_type[0];
if ( ! empty($args->supports) ) {
add_post_type_support($post_type, $args->supports);
unset($args->supports);
} else {
// Add default features
add_post_type_support($post_type, array('title', 'editor'));
}
if ( false !== $args->query_var && !empty($wp) ) {
if ( true === $args->query_var )
$args->query_var = $post_type;
$args->query_var = sanitize_title_with_dashes($args->query_var);
$wp->add_query_var($args->query_var);
}
if ( false !== $args->rewrite && ( is_admin() || '' != get_option('permalink_structure') ) ) {
if ( ! is_array( $args->rewrite ) )
$args->rewrite = array();
if ( empty( $args->rewrite['slug'] ) )
$args->rewrite['slug'] = $post_type;
if ( ! isset( $args->rewrite['with_front'] ) )
$args->rewrite['with_front'] = true;
if ( ! isset( $args->rewrite['pages'] ) )
$args->rewrite['pages'] = true;
if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
$args->rewrite['feeds'] = (bool) $args->has_archive;
if ( $args->hierarchical )
$wp_rewrite->add_rewrite_tag("%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=");
else
$wp_rewrite->add_rewrite_tag("%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=");
if ( $args->has_archive ) {
$archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
if ( $args->rewrite['with_front'] )
$archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
else
$archive_slug = $wp_rewrite->root . $archive_slug;
$wp_rewrite->add_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
$wp_rewrite->add_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
$wp_rewrite->add_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
}
if ( $args->rewrite['pages'] )
$wp_rewrite->add_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
}
$wp_rewrite->add_permastruct($post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask);
}
if ( $args->register_meta_box_cb )
add_action('add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1);
$args->labels = get_post_type_labels( $args );
$args->label = $args->labels->name;
$wp_post_types[$post_type] = $args;
add_action( 'future_' . $post_type, '_future_post_hook', 5, 2 );
foreach ( $args->taxonomies as $taxonomy ) {
register_taxonomy_for_object_type( $taxonomy, $post_type );
}
do_action( 'registered_post_type', $post_type, $args );
return $args;
}Связанные Функции
Ещё из раздела
Смотрите также: Функции WordPress и Теги Шаблона.
Пример-> пятый индекс:
не работает, следует заменить на
Не понял, в чем разница? А это че за часть кода с ошибкой: sprintf(<strong>__(</strong> ?
это парсер не сработал:
разница в spintf( и sprintf(__(
Пардон, ваша правда! Только там ошибка в том, что нужно было скобку убрать от сюда:
А не дописывать функцию локализации __() (хоть это тоже ошибку исправляет).
Должно быть так:
Спасибо! Поправил пост!
Скажите пожалуйста. Как создать новые типы записей стало понятно. А Как из того же файла fuctions.php изменять уже имеющиеся типы записей?
К примеру переименовать штатный тип записей "posts" "Записи", изменив именно ему имя на "Награды".
Или есть возможность удалить с глаз долой стандартный тип записей "pages" - ("Страницы" ) и создать свой тип записи со свойствами страницы?
Я не пробовал изменять существующие типы, поэтому ответить не могу.
Кстати мне то же приходили мысли о полном отказе от стандартных таксономий, но пока не ковырял. Вообще тема интересная. Чувствую эта ветка каментов будет длинной ))
да, а функцию локализации я взял с примера в кодексе. Я думаю правильным вариантом будет просто поступать на своё усмотрение
Здравствуйте!
Кто нибудь разобрался с парамтером permalink_epmask?
Как у нового типа записи сделать пермалинк по типу: сайт/newtype/123
Здравствуйте. Есть проблемка. При добавлении нового типа данных перестают отображаться статические страницы. Вот код нового типа.
add_action('init', 'my_custom_init'); function my_custom_init() { $labels = array( 'name' => 'Заказы', // Основное название типа записи 'singular_name' => 'Заказ', // отдельное название записи типа Book 'add_new' => 'Добавить новый', 'add_new_item' => 'Добавить новый заказ', 'edit_item' => 'Редактировать заказ', 'new_item' => 'Новый заказ', 'view_item' => 'Посмотреть заказ', 'search_items' => 'Найти заказ', 'not_found' => 'Заказов не найдено', 'not_found_in_trash' => 'В корзине заказов не найдено', 'parent_item_colon' => '', 'menu_name' => 'Заказы' ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','custom-fields') ); register_post_type('order',$args); }Люди вот подскажите... Бьюсь кучу времени... Как регистрировать новые post_type - это понятно... А вот как изменить такие post_type как post и page... например переименовать там всё через $labels = array( ); или добавить исключить там что-то... через 'supports' => array('title','editor','custom-fields')