Используйте register_post_type (), чтобы изменить существующий тип записи


29

Есть много ситуаций, когда тема или плагин регистрирует тип сообщения, и вы хотите изменить его. Существует, конечно, add_post_type_support()и remove_post_type_support(), но те не дают доступа к полному списку аргументов, которые register_post_type()принимает. В частности, может быть, я хочу отключить архив типов записей, скрыть интерфейс администратора, скрыть от поиска и т. Д., Оставив остальные настройки типа сообщений в покое.

Страница Кодекса дляregister_post_type() болтающих это передо мной:

Описание

Создайте или измените тип сообщения.

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

Видя, что нет даже deregister_post_type()функции , я не понимаю, как это можно сделать.

Ответы:


18

Эта функция действительно для изменения типов записей

Да.

и если да, можете ли вы просто переопределить пару аргументов и оставить остальные в покое?

Нет. Если вы хотите изменить аргументы для типа записи, вам нужно использовать get_post_type_objectдля получения объекта типа записи, изменить то, что вы хотите в нем, а затем повторно зарегистрировать его, используя ваш измененный тип в качестве нового параметра $ args.


Было register_post_typeбы правильно сделать два последовательных вызова с измененными аргументами к одному и тому же ? Я полагаю, что это ваше «Да», и оно не выдает никаких ошибок и дает желаемый эффект. Реальный случай - второй вариант, который я представляю в этом ответе: wordpress.stackexchange.com/a/74331/12615
brasofilo

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

Я просто подумал об этом из-за крючка, предоставленного перед плагином register_post_type. На самом деле в этом нет необходимости. Это был вопрос «для записей», спасибо за отзыв.
brasofilo

34

После некоторых исследований я обнаружил, что ни один из этих ответов не актуален.

По состоянию на 8 декабря 2015 года WordPress включает новый фильтр, register_post_type_argsкоторый позволяет подключаться к аргументам зарегистрированного типа записи.

function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

6
Это правильный способ сделать это сейчас.
Дэйв Ромси,

6
Это должен принять принятый ответ
Klewis

Что делать, если вам нужно обновить его после того, как он был зарегистрирован во время выполнения? Например: послеinit
Лукас Бустаманте

@LucasBustamante Это не имеет значения. Просто вызовите строку add_filter во время вашего плагина / темы, а не в действии. Фильтр будет вызываться во время каждой register_post_typeфункции. Единственный сценарий, в котором мой код не будет работать, - это если тип сообщения не регистрируется правильно. Все типы сообщений должны быть зарегистрированы во время инициализации. Из кодекса: «register_post_type не будет работать, если вызывается до 'init', а аспекты вновь созданного или измененного типа записи будут работать некорректно, если будут вызваны позже." Если вам все еще нужна помощь, я предлагаю опубликовать более подробную информацию в новом вопросе.
Рэдли Сустер

8

Вот пример того, как использовать 'registered_post_type'фильтр для изменения типа записи в другом плагине.

Плагин, который я использовал, не включал menu_icon в свое определение, поэтому я хотел добавить свой собственный.

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

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

4

Подключитесь 'registered_post_type'после того, как другой код зарегистрирует его. Это называется в конце register_post_type(). Вы получаете два аргумента: $post_typeи $args.
Теперь вы можете изменить что-либо для этого типа сообщения. Проверьте на $GLOBALS['wp_post_types']наличие некоторых вариантов.


Спасибо, что указал мне на этот крючок. Это отвечает на (более важный) вопрос о том, как изменить тип сообщения, но как насчет описания, register_post_type()которое включает в себя «изменить»? Это просто неправильно? Должен ли я запрыгнуть на своего интернет-коня и победить его из Кодекса в этот момент?
mrwweb

2
$wp_post_types[$post_type] = $args;... предполагает, что вы сможете изменить свойства. Добавьте пример ошибочного кода в свой вопрос.
fuxia

0

Я столкнулся с тем же самым с плагином Календарь событий .

Я добавил приведенный ниже код в function.php, чтобы изменить тип записи tribe_organizer

function tribe_modify_organizer() {
 //New arguments
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // get the post type to modify
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // add taxonomies support
    $tribe_organizer_args-> exclude_from_search = false; // show in search result
 //re-register the same post type includeing the new args
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

0

Я не знаю, если это уродливо, но вы можете изменить GLOBALзаполнитель "на лету" всякий раз, когда вам нужно манипулировать одним аргументом. Вот как мы используем непубличный тип сообщения, contentsчтобы быть приемлемым в меню администратора. Мы закрываем до и после закрытия меню:

function entex_theme_make_contents_public(){
    $GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);

function entex_theme_make_contents_private_again(){
    $GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);

В нашем случае мы хотим, чтобы плагин Admin Menu Post List принимал наш тип поста, так как они вызывают return get_post_types(array('public' => true));внутри своего хука с приоритетом 11 ...

Разработчики -Пожалуйста, оставьте комментарий, если это может вызвать какие-либо проблемы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.