web-dev-qa-db-fra.com

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

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

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 l’effet regrettable 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. J'imagine que je dois limiter l'action "save_post" à ne déclencher que pour les publications de mon type personnalisé.

15
Bobby Jack
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.

MODIFIER

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

16
John P Bloch

Si vous souhaitez gérer plusieurs types de publication, je vous conseillerais 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 fondamentalement les mêmes que 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 jeu personnalisé.

4
EAMann

@John P Bloch et @EAMann ont déjà donné d'excellentes réponses, alors la mienne est en plus:

  1. Considérer préfixer vos meta_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.-à-d.

    function save_my_metadata ($ post_id, $ post = false) {
     if ($ post-> post_type == 'votre_post_type') 
     update_post_meta ($ post_id, '_my_metadata', $ _POST ['mon_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 hook pour faciliter la sauvegarde de types de publication spécifiques, c’est-à-dire que votre hook pourrait être "save_{$post_type}_post"; pour un type de poste movie, ce serait 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); 
     fonction save_custom_post_type_posts ($ post_id, $ post = false) {
     do_action ("save _ {$ post- > post_type} _post "); 
    } 
    
    Vous pourrez ensuite réécrire votre code original comme suit (y compris l’astuce de soulignement du point 1 ci-dessus):

     add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2); 
     fonction save_my_postype_metadata ($ post_id, $ post) {
     update_post_meta ($ post_id, "_ _POST ['my_metadata']); 
    }
4
MikeSchinkel

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 ceci sera bientôt ajouté au noyau.

1
prettyboymp

Je ne peux pas que cela fonctionne - je ne sais pas ce que je fais de mal - mais je tente d'utiliser un 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 des 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');
0
jrutter

La mise à jour préalable vérifie si la publication actuelle est de votre publication ou non. Cela é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 pouvez ajouter l'action uniquement lorsque ce 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;

0
hakre