Отмена регистрации пользовательских типов сообщений

44

Кто-нибудь знает способ отмены регистрации пользовательских типов сообщений?

Есть ли эквивалент register_post_type()?

ана
источник
1
ЛЮБОЙ ЕЩЕ ПОИСК ЭТОГО. Когда вы регистрируете пользовательский тип записи, в базу данных ничего не сохраняется. Таблица posts в wp db неструктурирована. Он регистрируется только с внутренними элементами сценария wp, и вы можете создать запись в таблице записей с типом того, что вы когда-либо создавали с помощью записей в реестре. Надеюсь, это поможет кому-то еще.
MageProspero
2
Начиная с WordPress 4.5 для этого есть функция unregister_post_type. См. Отмена регистрации типа записи с использованием
unregister_post_type

Ответы:

38

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

Эндрю Нацин предоставил некоторый код на trac, найденный здесь и размещенный ниже.

if ( ! function_exists( 'unregister_post_type' ) ) :
function unregister_post_type( $post_type ) {
    global $wp_post_types;
    if ( isset( $wp_post_types[ $post_type ] ) ) {
        unset( $wp_post_types[ $post_type ] );
        return true;
    }
    return false;
}
endif;

Отмена регистрации встроенного типа записи будет иметь неизвестные последствия для WordPress, поэтому, пожалуйста, делайте это на свой страх и риск. Отмена регистрации пользовательского типа записей должна быть абсолютно безопасной, но, естественно, не приведет к очистке вашей установки (т. Е. Отмена регистрации типа записей не означает удаление данных из базы данных).

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

t31os
источник
2
Не за что .. :) Если вы добавляете свои собственные типы записей в виде кода, более простым решением будет просто удалить выполняемую вами функцию / код, который их добавляет. Также обратите внимание, что удаление типов записей не приводит к их удалению из таблицы сообщений, поэтому в этой таблице могут быть избыточные записи.
t31os
2
@anu: Единственное, что остается «постоянным», если вы не выполняете register_post_type()загрузку на каждой странице ( init), это, вероятно, структура постоянной ссылки (обновите ее, и она исчезнет), и записи в базе данных, которые вы можете удалить делая DELETE FROM wp_posts WHERE post_type = '[your custom post type]'.
Ян Фабри
Интересно, что я удалил код register_post_type для этого custom_post_type, и я не добавил никаких сообщений в этот cpt, но он не удалил пользовательский интерфейс администратора.
ана
Или, конечно, теперь, когда я попробую это снова, это работает, как вы, ребята, описали - то есть пользовательский интерфейс администратора для нового cpt пропал. Возможно, я просто маппет :) Полезная информация в любом случае, так что спасибо.
ана
3
Обновление в феврале 2016 года - эта функция была объединена в ядре для WP 4.5.0 (будет запущена в апреле).
Рикардо BRGWeb
37

Начиная с WordPress 4.5 для этого есть функция unregister_post_type. Пример:-

function delete_post_type(){
    unregister_post_type( 'blocks' );
}
add_action('init','delete_post_type');
Дхинью Дивакаран
источник
это должно иметь более высокий приоритет, чем тот, который использовался для регистрации типа сообщения, иначе он не будет работать
Марк Каплун,
@Dhinju Divakaran это не удаляет старый тип записи из БД, который я не использую сейчас.
Фаяз Алам
его работа, убедитесь, что вы даете высокий приоритет этому действию по сравнению с действием, используемым для регистрации типа сообщения.
Аджит Р Наир
1
Стоит отметить, что unregister_post_type()ничего не удаляет из базы данных. Это только предотвращает регистрацию типа сообщения.
Дейв Ромси
Это отлично сработало для меня, но имейте в виду, что вам нужно будет сообщить WordPress об изменениях, повторно сохранив структуру постоянных ссылок на странице «Настройки» -> «Постоянные ссылки». В противном случае страницы с конфликтующими постоянными ссылками не будут работать правильно.
MarkPraschan
7

Это сработало для меня, как сказал Rarst, используя, по возможности, remove_action () .

add_action( 'after_setup_theme','remove_foundation_options', 100 );

function remove_foundation_options() {   
    remove_action( 'init', 'Orbit');    
}
Ваю
источник
5

Как заметил t31os, легко удалить тип записи из глобальной переменной.

Но если вы имеете в виду неосновной тип записи, то было бы лучше найти код, который его регистрирует и отсоединяет remove_action()(если это нормальный код, его нужно подключать, а не запускать напрямую).

Rarst
источник
2
register_post_type()это не функция, которая хорошо подходит для подключения. Обычный способ зарегистрировать тип записи - это запустить функцию непосредственно в функции, подключенной к init. Удаление этого действия может иметь нежелательные последствия, так как часто с этой функцией будут удалены другие функции.
Джон П Блох
@ Джон П Блох, да, я знаю об этом. Иногда вы перестраиваете все init, чтобы получить его правильно, в конце концов, это зависит от конкретного кода и его качества /
работоспособности
1

В WordPress версии 4.5 и выше они предоставляют функцию для удаления типа записи (unregister_post_type). пример

function delete_post_type(){
unregister_post_type( 'jobs' );
}
add_action('init','delete_post_type');

Это будет работать определенно.

Нипун Тяги
источник