Use register_post_type () para modificar um tipo de postagem existente

29

Existem muitas situações em que um tema ou plug-in registra um tipo de postagem e você deseja modificá-lo. Há, claro, add_post_type_support()e remove_post_type_support(), mas aqueles não dão acesso à lista completa de argumentos que register_post_type()toma. Em particular, talvez eu queira desativar um arquivo de tipo de postagem, ocultar a interface do usuário do administrador, ocultar da pesquisa, etc., deixando o restante das configurações de tipo de postagem em paz.

A página do Codex pararegister_post_type() dangles isso na minha frente:

Descrição

Crie ou modifique um tipo de postagem.

Mas, no passado, quando tento fazer isso, isso não parecia funcionar. Essa função é realmente para modificar os tipos de postagem? Em caso afirmativo, você pode simplesmente redefinir alguns argumentos e deixar o resto em paz?

Vendo que não há sequer uma deregister_post_type()função , não entendo como isso pode ser feito.

mrwweb
fonte

Respostas:

18

Esta função é realmente para modificar tipos de postagem

Sim.

e se sim, você pode simplesmente redefinir alguns argumentos e deixar o resto em paz?

Não. Se você deseja modificar argumentos para um tipo de postagem, é necessário usar get_post_type_objectpara obter o objeto de tipo de postagem, modificar o que deseja nele e registrá-lo novamente, usando seu tipo modificado como o novo parâmetro $ args.

Otto
fonte
Fazer duas chamadas consecutivas com argumentos modificados para o mesmo register_post_typeestaria correto? Eu assumo isso pelo seu "Sim". E ele não descarta nenhum erro e tem o efeito desejado. O caso real é a segunda opção I presente nesta resposta: wordpress.stackexchange.com/a/74331/12615
brasofilo
Sim, isso funciona, mas parece que, se você precisar fazer isso, será necessário adicionar alguns filtros ou algo mais para evitar o registro repetido do mesmo tipo de postagem repetidamente. Basicamente, organize os argumentos primeiro e depois registre-os.
Otto
Eu apenas pensei sobre isso por causa do gancho fornecido logo antes do plugin register_post_type. Na realidade, não há necessidade. Foi uma pergunta "para os registros", obrigado pelo feedback.
Brasofilo
34

Após algumas pesquisas, descobri que nenhuma dessas respostas está atualizada.

Em 8 de dezembro de 2015, o WordPress inclui um novo filtro register_post_type_args, que permite conectar-se aos argumentos de um tipo de postagem registrado.

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 );
Radley Sustaire
fonte
6
Este é o caminho certo para fazer isso agora.
Dave Romsey
6
Isso deve a resposta aceite
klewis
E se você precisar atualizá-lo após ter sido registrado em tempo de execução? Por exemplo: depoisinit
Lucas Bustamante
@LucasBustamante Isso não importa. Basta chamar a linha 'add_filter' durante o seu plugin / tema, não em uma ação. O filtro será chamado durante todas as register_post_typefunções. O único cenário em que meu código não funcionará é se o tipo de postagem não estiver sendo registrado corretamente. Todos os tipos de postagem devem ser registrados durante o gancho init. No codex: "register_post_type não funcionará se for chamado antes de 'init', e os aspectos do tipo de postagem recém-criado ou modificado funcionarão incorretamente se for chamado mais tarde." Se você ainda precisar de ajuda, sugiro postar mais detalhes em uma nova pergunta.
Radley Sustaire 28/06
8

Aqui está um exemplo de como usar o 'registered_post_type'filtro para modificar um tipo de postagem em outro plug-in.

Um plug-in que eu estava usando não incluía um menu_icon em sua definição, então eu queria adicionar um dos meus.

<?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 );
jjeaton
fonte
Essa é uma maneira muito mais limpa de fazer isso na maioria dos casos; no entanto, observe que esse filtro é muito tarde para ser reescrito e, portanto, a resposta aceita deve ser usada nessas situações.
mrwweb
4

Conecte-se 'registered_post_type'depois que o outro código o registrar. É chamado no final de register_post_type(). Você recebe dois argumentos: $post_typee $args.
Agora você pode alterar qualquer coisa para este tipo de postagem. Inspecione $GLOBALS['wp_post_types']algumas opções.

fuxia
fonte
Obrigado por me apontar para esse gancho. Isso responde à pergunta (mais importante) sobre como modificar um tipo de postagem, mas e a descrição register_post_type()que inclui "modificar?" Isso está errado? Devo pular no meu cavalo da Internet e derrotá-lo do Codex neste momento?
Mrwweb
2
$wp_post_types[$post_type] = $args;… Sugere que você possa alterar as propriedades. Adicione um exemplo do código com falha à sua pergunta.
fuxia
0

Enfrentei a mesma coisa com o plug-in The Events Calendar .

Adicionei o código abaixo ao function.php para modificar o tipo de postagem 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 );
Abouasy
fonte
0

Não sei se isso é feio, mas você pode alterar o GLOBALespaço reservado "on the fly" sempre que precisar manipular um único argumento. É assim que usamos um tipo de postagem não pública contentspara ser aceitável no menu do administrador. Fechamos antes e depois após o menu renderizar:

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);

No nosso caso, queremos que o plugin Admin Menu Post List aceite nosso tipo de post, pois eles chamam return get_post_types(array('public' => true));dentro do seu gancho com a prioridade 11 ...

Desenvolvedores -Por favor, comente se isso pode causar problemas.

Jonas Lundman
fonte