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


16

J'essaie de configurer un type de publication personnalisé après ce tutoriel . Cependant, je suis un peu confus quant à savoir comment / où mettre en œuvre 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']);
}

Cela fonctionne, mais a le malheureux ajout de ces métadonnées à chaque article, qu'il appartienne ou non à ce type personnalisé.

J'ai mis ce qui précède functions.phpet je suppose que cela pourrait faire partie du problème. Je suppose que je dois restreindre l'action 'save_post' pour qu'elle ne se déclenche que pour les publications de mon type personnalisé.


Belle question Bobby Jack, mais puis-je vous demander de retitrer la question sur quelque chose comme "Comment enregistrer uniquement les métadonnées pour des types de publication personnalisés spécifiques"; tout comme votre titre est trop générique pour être reconnu par les gens lorsqu'ils recherchent une solution à ce problème.
MikeSchinkel

@Mike: fait (totalement d'accord avec votre suggestion, merci!)
Bobby Jack

Réponses:


18
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. Remplacez simplement 'your_post_type' par le nom du type de message. En outre, fait peu connu: le crochet «save_post» passe l'ID de la publication comme argument.

ÉDITER

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


1
Il ajoute même le post lui-même comme deuxième argument , vous n'avez donc pas besoin d'utiliser la variable globale.
Jan Fabry

Cette solution fonctionne ... Je l'ai déjà utilisée sur des projets clients avec beaucoup de succès.
EAMann

Brillant - fonctionne comme un charme. Et je suppose qu'il serait logique de faire "if ($ post-> post_type == 'animal') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} else if ($ post-> post_type == 'véhicule') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']);} // ... etc ... pour gérer plusieurs types de messages différents? (Excuses pour le mauvaises capacités de formatage des commentaires!)
Bobby Jack

En fait, avec plusieurs post-types, je recommanderais plutôt d'utiliser une instruction switch. Moins de balisage, des performances plus rapides, plus facile d'ajouter des cas à l'avenir.
EAMann

@EAMann - oui, à mi-chemin de l'écriture, j'ai réalisé qu'un changement serait mieux, mais les commentaires ne sont pas l'endroit idéal pour commencer à éditer du code, alors je suis devenu paresseux;)
Bobby Jack

4

Si vous souhaitez gérer plusieurs types de publication, je recommanderais une instruction de commutation de base:

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 defaultbloc dans le commutateur gère les cas où le type de publication n'est pas dans votre ensemble personnalisé.


4

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

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

    fonction 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 auriez besoin d'une métabox personnalisée pour pouvoir également modifier les champs. Voici un écran d'édition pour le contexte:



  2. Une autre chose que vous pourriez faire est d'ajouter votre propre crochet pour faciliter l'enregistrement de types de messages spécifiques, c'est-à-dire que votre crochet pourrait être " save_{$post_type}_post"; pour un movietype de poste, ce serait save_movie_post. Voici ce que vous devez ajouter au functions.phpfichier 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");
    }
    
    Avec cela, vous pouvez ensuite réécrire votre code d'origine comme ceci (y compris l'astuce de soulignement du n ° 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, '_my_metadata', $ _POST ['my_metadata']);
    }

1

Personnellement, je préfère suivre le modèle ci-dessous pour ajouter des méta-gestionnaires personnalisés aux types de publication. Avec ce qui suit, vous pouvez ajouter la méta-prise en charge à un type de publication en ajoutant simplement la clé de prise en charge (`` sous-titre '' dans l'exemple ci-dessous) au tableau des 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 ça sera bientôt ajouté dans le noyau.


0

Avant la mise à jour, vérifiez si le message actuel est de votre type. Cela vous garantirait de ne pas l'enregistrer pour tous les messages.

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

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


0

Je ne peux pas faire fonctionner cela - je ne sais pas ce que je fais mal - mais j'essaie d'utiliser le crochet 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');

Peu importe - je l'ai compris!
jrutter le
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.