Comment enregistrer des métadonnées pour un type de publication personnalisé spécifique uniquement?

14

J'essaie de configurer un type de publication personnalisé après ce tutoriel . Cependant, je suis un peu confus quant à comment / où implémenter update_post_meta() . Le tutoriel suggère ce modèle:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

Ce qui fonctionne, mais a pour effet malheureux d'ajouter ces métadonnées à chaque publication, qu'elle appartienne ou non à ce type personnalisé.

J'ai mis ce qui précède dans functions.php et je suppose que cela pourrait faire partie du problème. Je suppose que je dois restreindre l'action 'save_post' à ne déclencher que pour les posts de mon type personnalisé.

    
posée Bobby Jack 17.08.2010 - 15:41

6 réponses

16
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

Cela devrait fonctionner. Il suffit de remplacer "your_post_type" par le nom du type de message. En outre, fait peu connu: le hook 'save_post' transmet l'identifiant de la publication en argument.

EDIT

J'ai mis à jour la fonction pour refléter le commentaire de Jan. Merci Jan!

    
réponse donnée John P Bloch 17.08.2010 - 16:02
4

Si vous souhaitez gérer plusieurs types de publication, je vous recommande une instruction switch simple:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

Les cas sont identiques à ceux de if($post->post_type) == 'post_type_1') {} mais ne nécessitent pas plusieurs blocs if-else. Le bloc default dans le commutateur gère les cas où le type de publication ne figure pas dans votre ensemble personnalisé.

    
réponse donnée EAMann 17.08.2010 - 16:48
4

@John P Bloch et @EAMann ont déjà donné d'excellentes réponses, alors les miennes s'ajoutent:

  1. Envisagez de préfixer vos méta_keys avec un trait de soulignement . Cela les masque dans la liste des champs personnalisés affichés sur un écran de post-édition, c'est-à-dire

    function save_my_metadata($post_id,$post=false) {
       if($post->post_type=='your_post_type')
          update_post_meta($post_id, '_my_metadata', $_POST['my_metadata']);
    }
    
    Évidemment, cela signifie que vous aurez également besoin d’une métabox personnalisée pour pouvoir modifier les champs. Voici un écran d'édition pour le contexte:



  2. Une autre chose que vous pouvez faire est d’ajouter votre propre crochet pour rendre l’enregistrement de types de publication spécifiques plus facile, c’est-à-dire que votre crochet pourrait être " save_{$post_type}_post "; pour un type de type movie post, il s'agirait de save_movie_post . Voici ce que vous devez ajouter au fichier functions.php de votre thème ou dans un plugin quelque part:

    add_action('save_post', 'save_custom_post_type_posts',10,2);
    function save_custom_post_type_posts($post_id,$post=false) {
       do_action("save_{$post->post_type}_post");
    }
    
    Avec cela, vous pourrez alors réécrire votre code original comme suit (y compris l’astuce de soulignement du n ° 1 ci-dessus):

    add_action('save_my_postype_post','save_my_postype_metadata',10,2);
    function save_my_postype_metadata($post_id,$post) {
        update_post_meta($post_id, '_my_metadata', $_POST['my_metadata']);
    }
réponse donnée MikeSchinkel 17.08.2010 - 22:03
1

Personnellement, je préfère suivre le modèle ci-dessous pour ajouter des gestionnaires de méta personnalisés aux types de publication. Avec ce qui suit, vous pouvez ajouter le méta-support à un type de message en ajoutant simplement la clé de support ("sous-titre" dans l'exemple ci-dessous) au tableau de supports pour le type de publication en appelant add_post_type_support ("mon_post_type", "sous-titre");

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

Espérons que quelque chose comme cela sera bientôt ajouté au noyau.

    
réponse donnée prettyboymp 18.08.2010 - 21:55
0

Avant la mise à jour, vérifiez si la publication en cours est ou non de votre type de publication. Cela vous éviterait de le sauvegarder pour tous les messages.

Vous devez également vérifier l'entrée (il manque dans votre exemple) et, à côté de cela, gardez à l'esprit que vous ne pouvez ajouter l'action que lorsque le post-type est actif. Si tel est le cas, vous n'avez pas besoin de vérifier ce post-type ultérieurement.

Obtenir un type de message: get_post_type() ou $post->post_type;

    
réponse donnée hakre 17.08.2010 - 15:49
0

Je ne peux pas obtenir que cela fonctionne - je ne sais pas ce que je fais de mal - mais je tente d'utiliser le hook post_updated au lieu de save_post - car je veux que ces valeurs soient insérées après la mise à jour du message afin que je puisse récupérer les valeurs du autres champs personnalisés.

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');
    
réponse donnée jrutter 10.04.2011 - 14:34

Lire d'autres questions sur les étiquettes