web-dev-qa-db-fra.com

Utilisez register_post_type () pour modifier un type de publication existant.

Il existe de nombreuses situations dans lesquelles un thème ou un plug-in enregistre un type de publication et que vous souhaitez modifier. Il y a bien sûr add_post_type_support() et remove_post_type_support(), mais ceux-ci ne donnent pas accès à la liste complète des arguments pris par register_post_type(). En particulier, je souhaite peut-être désactiver une archive de type de publication, masquer l'interface utilisateur de l'administrateur, masquer la recherche, etc. tout en laissant le reste des paramètres de type de publication uniquement.

La page du Codex pour register_post_type() pendante devant moi:

La description

Créer ou modifier un type de message.

Mais dans le passé, lorsque j'ai essayé de le faire, cela ne semblait pas fonctionner. Cette fonction sert-elle vraiment à modifier les types de publication, et si oui, pouvez-vous simplement redéclarer quelques arguments et laisser le reste tranquille?

Voyant qu'il y a n'est même pas une fonction deregister_post_type() , je ne comprends pas comment cela peut être fait.

25
mrwweb

Cette fonction sert-elle vraiment à modifier les types de publication?

Oui.

et si oui, pouvez-vous simplement redéclarer quelques arguments et laisser le reste tranquille?

Non. Si vous souhaitez modifier les arguments d'un type de publication, vous devez utiliser get_post_type_object pour obtenir l'objet de type de publication, modifiez ce que vous souhaitez, puis réenregistrez-le en utilisant votre type modifié en tant que nouveau paramètre $ args.

15
Otto

Après quelques recherches, aucune de ces réponses n’est à jour.

À compter du 8 décembre 2015, WordPress inclut un nouveau filtre, register_post_type_args, qui vous permet d’accrocher les arguments d’un type de message enregistré.

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 );
31
Radley Sustaire

Voici un exemple d'utilisation du filtre 'registered_post_type' pour modifier un type de publication dans un autre plugin.

Un plugin que j'utilisais n'incluait pas menu_icon dans sa définition, donc je voulais en ajouter un.

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

Accrocher dans 'registered_post_type' après que l'autre code l'ait enregistré. Il s’appelle à la fin de register_post_type(). Vous obtenez deux arguments: $post_type et $args.
Vous pouvez maintenant tout changer pour ce type de message. Inspectez $GLOBALS['wp_post_types'] pour certaines options.

4
fuxia

Je ne sais pas si c'est moche, mais vous pouvez modifier le paramètre fictif GLOBAL "à la volée" chaque fois que vous devez manipuler un seul argument. Voici comment nous utilisons une publication non publique de type contents pour être acceptable dans le menu admin. Nous raccrochons avant et après le rendu du 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);

Dans notre cas, nous voulons que le plugin Admin Menu Post List accepte notre type de message, car ils appellent return get_post_types(array('public' => true)); dans leur hook avec la priorité 11 ...

Développeurs - Merci de faire un commentaire si cela peut poser problème.

0
Jonas Lundman

J'ai fait face à la même chose avec Le calendrier des événements plugin.

J'ai ajouté le code ci-dessous à function.php pour modifier le type tribe_organizer post

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
Abouasy