Comment puis-je enregistrer des métadonnées pour un type de poste spécifique sur mesure seulement?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/444

  •  16-10-2019
  •  | 
  •  

Question

Je suis en train de mettre en place un type de poste personnalisé suivant ce tutoriel . Cependant, je suis un peu confus quant comment / où la mise 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']);
}

Ce qui fonctionne, mais a pour effet regrettable d'ajouter que les métadonnées à chaque poste, si elle appartient à ce type personnalisé ou non.

Je l'ai mis ci-dessus dans functions.php et je devine que cela pourrait faire partie du problème. Je devine que je dois limiter l'action « save_post » pour déclencher uniquement pour les messages de mon type personnalisé.

Était-ce utile?

La solution

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 » avec le nom du type de poste. En outre, fait peu connu:. Le crochet « save_post » passe l'ID du poste comme argument

EDIT

Je mis à jour la fonction de refléter le commentaire de janvier Merci Jan!

Autres conseils

Si vous voulez gérer plusieurs types de poste, je recommande une déclaration de commutateur 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 bloc default dans les cas de poignées de commutation où le type de poste n'est pas dans votre jeu personnalisé.

P Bloch et @John @EAMann ont déjà donné de grandes réponses si le mien est en plus:

  1. Considérez préfixer vos meta_keys avec un trait de soulignement . Ce faisant, les peaux de la liste des champs personnalisés affichés sur un écran d'édition de poste, à savoir

    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']);
    }
    
    De toute évidence, cela signifie que vous auriez besoin d'un METABOX personnalisé pour être en mesure de modifier les champs aussi. Voici un écran d'édition pour le contexte:

  2. Une autre chose que vous pouvez faire est d'ajouter votre propre crochet pour faire économiser les types de poste spécifique plus facile, à savoir votre crochet pourrait être « save_{$post_type}_post »; pour un type de poste movie il serait save_movie_post. Voici ce que vous devez ajouter à votre fichier functions.php de thème ou dans un endroit plugin:
    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 pouvez ensuite réécrire votre code original comme si (y compris le truc underscore de # 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']);
    }

Personnellement, je préfère suivre le modèle ci-dessous pour ajouter des gestionnaires de méta personnalisés aux types de poste. Avec le ci-dessous, vous pouvez ajouter le support de méta à un type poste en ajoutant simplement la clé de supports ( « sous-titre » dans l'exemple ci-dessous) au tableau des supports pour le type de poste en appelant add_post_type_support ( « my_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é dans le noyau.

vérification de mise à jour préalable si le poste actuel est de votre type de poste. Cela vous assurer de ne pas l'enregistrer pour tous les messages.

Vous devriez vérifier l'entrée et (qui manque dans votre exemple) et à côté de cela, garder à l'esprit que vous pourriez ajouter que l'action lorsque ce type de post-est actif. Si tel est le cas, vous n'avez pas besoin de vérifier plus tard après le type sur.

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

Je ne peux pas obtenir ce travail - pas sûr de ce que Im faire le mal - mais Im essayant d'utiliser le crochet post_updated au lieu du save_post - comme je veux que ces valeurs soient insérés après le message a été mis à jour pour que je puisse récupérer les valeurs de la d'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');
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top