Utilisez register_post_type () pour modifier un type de publication existant


29

Il existe de nombreuses situations où un thème ou un plugin enregistre un type de publication et que vous souhaitez le 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 qui register_post_type()prend. En particulier, je souhaite peut-être désactiver une archive de type de publication, masquer l'interface utilisateur d'administration, masquer la recherche, etc. tout en laissant le reste des paramètres de type de publication seuls.

La page du Codex pourregister_post_type() balancer ceci devant moi:

La description

Créez ou modifiez un type de publication.

Mais dans le passé, quand j'ai essayé de faire ça, ça n'a pas semblé fonctionner. Cette fonction sert-elle vraiment à modifier les types de messages, et si oui, pouvez-vous simplement redéclarer quelques arguments et laisser le reste tranquille?

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

Réponses:


18

Cette fonction sert-elle vraiment à modifier les types de messages

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_objectpour obtenir l'objet de type de publication, modifier ce que vous voulez, puis le réenregistrer en utilisant votre type modifié comme nouveau paramètre $ args.


Est-ce que faire deux appels consécutifs avec des arguments modifiés sur le même register_post_typeserait correct? Je le suppose par votre "Oui", et il ne supprime aucune erreur et a l'effet souhaité. Le cas réel est la deuxième option que je présente dans cette réponse: wordpress.stackexchange.com/a/74331/12615
brasofilo

Oui, cela fonctionne, mais il semble que si vous devez le faire, vous devez ajouter des filtres ou autre chose pour éviter d'avoir à enregistrer à plusieurs reprises le même type de publication. En gros, triez d'abord les arguments, puis enregistrez-les.
Otto

J'y ai juste pensé à cause du crochet fourni juste avant le plugin register_post_type. En réalité, ce n'est pas nécessaire. C'était une question «pour les dossiers», merci pour les commentaires.
brasofilo

34

Après quelques recherches, je n'ai trouvé aucune de ces réponses à jour.

Depuis le 8 décembre 2015, WordPress inclut un nouveau filtre register_post_type_args, qui vous permet de vous accrocher aux arguments d'un type de publication 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 );

6
C'est la bonne façon de procéder maintenant.
Dave Romsey

6
Cela devrait être la réponse acceptée
klewis

Que se passe-t-il si vous devez le mettre à jour une fois qu'il a été enregistré lors de l'exécution? Par exemple: aprèsinit
Lucas Bustamante

@LucasBustamante Cela n'a pas d'importance. Appelez simplement la ligne 'add_filter' pendant votre plugin / thème, pas dans une action. Le filtre sera appelé pendant chaque register_post_typefonction. Le seul scénario où mon code ne fonctionnera pas est si le type de publication n'est pas enregistré correctement. Tous les types de publication doivent être enregistrés pendant le hook init. Du codex: "register_post_type ne fonctionnera pas s'il est appelé avant 'init', et les aspects du type de publication nouvellement créé ou modifié fonctionneront incorrectement s'ils sont appelés plus tard." Si vous avez encore besoin d'aide, je vous suggère de publier plus de détails dans une nouvelle question.
Radley Sustaire

8

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

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

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

C'est une façon beaucoup plus propre de le faire dans la plupart des cas; cependant, il convient de noter que ce filtre est trop tard pour être récupéré par les réécritures, de sorte que la réponse acceptée doit être utilisée à la place dans ces situations.
mrwweb

4

Connectez-vous 'registered_post_type'après que l'autre code l'ait enregistré. Il est appelé à la fin de register_post_type(). Vous obtenez deux arguments: $post_typeet $args.
Vous pouvez maintenant modifier quoi que ce soit pour ce type de publication. Inspectez $GLOBALS['wp_post_types']pour certaines options.


Merci de m'avoir pointé vers ce crochet. Cela répond à la question (la plus importante) sur la façon de modifier un type de message, mais qu'en est-il de la description register_post_type()qui inclut "modifier?" Est-ce juste faux? Dois-je sauter sur mon cheval Internet et le vaincre du Codex en ce moment?
mrwweb

2
$wp_post_types[$post_type] = $args;… Suggère que vous devriez pouvoir modifier les propriétés. Ajoutez un exemple du code défaillant à votre question.
fuxia

0

J'ai fait face à la même chose avec le plugin The Events Calendar .

J'ai ajouté le code ci-dessous à function.php pour modifier le type de publication 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

Je ne sais pas si c'est moche, mais vous pouvez modifier l' GLOBALespace réservé "à la volée" chaque fois que vous devez manipuler un seul argument. C'est ainsi que nous utilisons un type de publication non public contentspour être acceptable dans le menu d'administration. Nous accrochons la fermeture avant et la fermeture 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 List Post List accepte notre type de message, car ils appellent à l' return get_post_types(array('public' => true));intérieur de leur crochet avec la priorité 11 ...

Développeurs -Veuillez faire un commentaire si cela peut provoquer des problèmes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.