Usa register_post_type () per modificare un tipo di post esistente


29

Esistono molte situazioni in cui un tema o un plug-in registra un tipo di post e si desidera modificarlo. C'è ovviamente add_post_type_support()e remove_post_type_support(), ma quelli non danno accesso all'elenco completo degli argomenti che register_post_type()accetta. In particolare, forse desidero disabilitare un archivio del tipo di post, nascondere l'interfaccia utente dell'amministratore, nascondere dalla ricerca, ecc. Lasciando da solo il resto delle impostazioni del tipo di post.

La pagina del Codex perregister_post_type() penzola questo davanti a me:

Descrizione

Crea o modifica un tipo di post.

Ma in passato, quando ho provato a farlo, non sembra funzionare. Questa funzione è davvero utile per modificare i tipi di post e, in tal caso, puoi semplicemente ripetere un paio di argomenti e lasciare il resto da solo?

Visto che non c'è nemmeno una deregister_post_type()funzione , non capisco come si possa fare.

Risposte:


18

Questa funzione è davvero per modificare i tipi di post

Sì.

e se è così, puoi semplicemente ridimensionare un paio di argomenti e lasciare il resto da solo?

No. Se si desidera modificare gli argomenti in un tipo di post, è necessario utilizzare get_post_type_objectper ottenere l'oggetto del tipo di post, modificare ciò che si desidera in esso, quindi registrarlo nuovamente utilizzando il tipo modificato come nuovo parametro $ args.


Effettuare due chiamate consecutive con argomenti modificati allo stesso register_post_typesarebbe corretto? Presumo così dal tuo "Sì", e non scarica alcun errore e ha l'effetto desiderato. Il caso reale è la seconda opzione che presento in questa risposta: wordpress.stackexchange.com/a/74331/12615
brasofilo,

Sì, funziona, ma sembra che tu debba farlo, quindi devi aggiungere alcuni filtri o qualcos'altro per evitare di dover registrare ripetutamente lo stesso tipo di post più e più volte. Fondamentalmente, ottenere prima gli argomenti risolti, quindi registrarlo.
Otto,

Ci ho pensato solo grazie all'hook fornito appena prima del plugin register_post_type. In realtà, non è necessario. Era una domanda "per i record", grazie per il feedback.
brasofilo,

34

Dopo alcune ricerche non ho trovato nessuna di queste risposte aggiornate.

A partire dall'8 dicembre 2015 WordPress include un nuovo filtro register_post_type_args, che consente di agganciare gli argomenti di un tipo di post registrato.

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
Questo è il modo giusto per farlo ora.
Dave Romsey,

6
Questa dovrebbe essere la risposta accettata
klewis,

Cosa succede se è necessario aggiornarlo dopo che è stato registrato in runtime? Ad esempio: dopoinit
Lucas Bustamante il

@LucasBustamante Non importa. Chiama la linea "add_filter" durante il tuo plugin / tema, non in un'azione. Il filtro verrà chiamato durante ogni register_post_typefunzione. L'unico scenario in cui il mio codice non funzionerà è se il tipo di post non viene registrato correttamente. Tutti i tipi di posta devono essere registrati durante il hook di init. Dal codice: "register_post_type non funzionerà se chiamato prima di 'init', e gli aspetti del tipo di post appena creato o modificato funzioneranno in modo errato se chiamati in seguito." Se hai ancora bisogno di aiuto ti suggerisco di pubblicare maggiori dettagli in una nuova domanda.
Radley Sustaire,

8

Ecco un esempio di come utilizzare il 'registered_post_type'filtro per modificare un tipo di post in un altro plugin.

Un plugin che stavo usando non includeva un menu_icon nella sua definizione, quindi volevo aggiungerne uno mio.

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

Questo è un modo molto più pulito di farlo nella maggior parte dei casi; tuttavia, va notato che questo filtro è troppo tardi per essere raccolto dalle riscritture, quindi la risposta accettata deve essere usata invece in quelle situazioni.
mrwweb,

4

Collegalo 'registered_post_type'dopo che l'altro codice lo ha registrato. Si chiama alla fine di register_post_type(). Ottieni due argomenti: $post_typee $args.
Ora puoi modificare qualsiasi cosa per questo tipo di post. Controlla $GLOBALS['wp_post_types']alcune opzioni.


Grazie per avermi indicato quell'amo. Ciò risponde alla domanda (più importante) su come modificare un tipo di post, ma che dire della descrizione register_post_type()che include "modifica?" È solo sbagliato? Dovrei salire sul mio cavallo su Internet e sconfiggerlo dal Codice in questo momento?
mrwweb,

2
$wp_post_types[$post_type] = $args;... suggerisce che dovresti essere in grado di modificare le proprietà. Aggiungi un esempio del codice in errore alla tua domanda.
fuxia

0

Ho affrontato la stessa cosa con il plugin The Events Calendar .

Ho aggiunto il codice seguente a function.php per modificare il tipo di post 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

Non so se sia brutto, ma potresti modificare il GLOBALsegnaposto "al volo" ogni volta che devi manipolare un singolo argomento. Questo è il modo in cui utilizziamo un tipo di post non pubblico contentsper essere accettabile nel menu di amministrazione. Agganciamo prima e chiudiamo dopo il rendering del menu:

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

Nel nostro caso, vogliamo che il plug-in Elenco post del menu Admin accetti il ​​nostro tipo di post, poiché chiamano return get_post_types(array('public' => true));nel loro hook con priorità 11 ...

Sviluppatori -Si prega di fare un commento se questo potrebbe causare problemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.