Використовуйте register_post_type () для зміни існуючого типу публікації


29

Існує маса ситуацій, коли тема або плагін реєструє тип публікації, і ви хочете змінити її. Існує, звичайно , add_post_type_support()і remove_post_type_support(), але ті не дають доступ до повного списку аргументів , які register_post_type()приймають. Зокрема, можливо, я хочу відключити архів типу публікації, приховати інтерфейс адміністратора, приховати від пошуку і т.д., залишаючи решту параметрів типу публікації в спокої.

Сторінка Codex дляregister_post_type() цього звисає:

Опис

Створіть або змініть тип публікації.

Але в минулому, коли я намагався це зробити, це, здавалося, не вийшло. Чи справді ця функція модифікує типи публікацій, і якщо так, можна просто передекларувати пару аргументів, а решту залишити в спокої?

Бачачи, що навіть немає deregister_post_type()функції , я не розумію, як це можна зробити.

Відповіді:


18

Чи дійсно ця функція для зміни типів публікацій

Так.

а якщо так, то можете просто переоформити пару аргументів, а решту залишити в спокої?

Ні. Якщо ви хочете змінити аргументи на тип публікації, вам потрібно скористатися, get_post_type_objectщоб отримати об’єкт типу публікації, змінити те, що ви хочете в ньому, а потім перереєструвати його, використовуючи модифікований тип як новий параметр $ args.


Чи register_post_typeправильним буде два послідовні дзвінки із зміненими аргументами ? Я вважаю, що це є вашим "Так", і це не скидає жодних помилок і дає бажаний ефект. Справжній випадок - це другий варіант, який я привожу у цій відповіді: wordpress.stackexchange.com/a/74331/12615
привожу

Так, це працює, але, схоже, якщо вам це потрібно зробити, вам потрібно додати кілька фільтрів або щось інше, щоб запобігти повторному реєстрації одного і того ж типу публікації. В основному спочатку розбирайте аргументи, а потім реєструйте їх.
Отто

Я щойно подумав про це через гачок, що був перед самим плагіном 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функції. Єдиний сценарій, коли мій код не працюватиме - це те, що тип публікації неправильно зареєстрований. Усі типи постів повинні бути зареєстровані під час гачка init. З кодексу: "register_post_type не працюватиме, якщо його викликають перед" init ", а аспекти новоствореного або модифікованого типу публікації будуть працювати неправильно, якщо викликати пізніше." Якщо вам все-таки потрібна допомога, пропоную опублікувати більше деталей у новому запитанні.
Radley Sustaire

8

Ось приклад того, як використовувати 'registered_post_type'фільтр для зміни типу публікації в іншому плагіні.

Плагін, який я використовував, не містив у своєму визначенні меню_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);

У нашому випадку ми хочемо, щоб плагін "Список списку адміністраторів" прийняв наш тип публікації, як вони називають return get_post_types(array('public' => true)); всередину свого гака з пріоритетом 11 ...

Розробники -Запросити коментар, якщо це може вирішити якісь проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.