web-dev-qa-db-fra.com

Comprendre et utiliser les métaboxes dans les posts

Je développe mon premier thème qui ne dépend pas d'un thème parent, mais je rencontre des problèmes d'arrière-plan. J'essaie d'ajouter un metabox à tous les articles en cours de rédaction. Cette question est assez large dans la mesure où elle couvre pas mal de fonctionnalités. Donc, si c'est ce que je préfère, je le découperai en morceaux sur plusieurs articles de ce site. Pour le moment, je les posterai comme un seul.

Comme je l'ai dit, j'essaie d'ajouter des champs dans lesquels les auteurs peuvent éventuellement renseigner des informations supplémentaires, par exemple une source où ils ont trouvé l'essentiel de leurs informations et la page d'accueil d'un contact presse. Basé sur cette excellente réponse à une question précédente, je me suis mis à copier-éditer ce code et je me suis retrouvé avec ce qui suit.

function add_source_metabox(){
    add_meta_box(
        'source_post_metabox', 'Bron', 'output_source_metabox', 'post'
    );
}
add_action('add_meta_boxes', 'add_source_metabox');

function output_source_metabox($post){
    wp_nonce_field('source_post_metabox', 'source_post_metabox_nonce');

    echo '<label for="source_post">';
    echo '<input type="text" id="source_post" name="source_post" value="" style="width: 80%;max-width: 720px;">';
    echo ' Voer hier de bron van je bericht in.</label>';
    echo '<p>Bv. <em>http://tweakers.net/nieuws/101372/ing-belgie-wil-betalingsgedrag-van-klanten-meer-gebruiken-voor-dienstverlening.html</em></p>';

}
function save_source_metabox($post_id){
    /*
     * We need to verify this came from our screen and with proper authorization,
     * because the save_post action can be triggered at other times.
     */

    /** Ensure that a nonce is set */
    if(!isset($_POST['source_post_metabox_nonce'])) :
        return;
    endif;

    /** Ensure that the nonce is valid */
    if(!wp_verify_nonce( $_POST['source_post_metabox_nonce'], 'source_post_metabox')) :
        return;
    endif;

    /** Ensure that an AUTOSAVE is not taking place */
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) :
        return;
    endif;

    /** Ensure that the user has permission to update this option */
    if(!current_user_can('edit_post', $post_id)) :
        return;
    endif;

    // Update and save the field so it can be used in our template

}
add_action('save_post', 'save_source_metabox');

Qui ressemble à ceci:

source

Le problème est cependant que lors de la saisie de données dans le nouveau champ de saisie, puis de la sauvegarde de la publication, le champ est vide. Je n'étais pas vraiment surpris car je ne pense pas avoir sauvegardé ces données pour le moment - cette partie est manquante dans save_source_metabox. Il me reste donc besoin de: 1. enregistrer l'entrée et savoir comment 2. accéder aux données de mon modèle, et 3. afficher ces données dans le champ d'entrée après l'enregistrement afin que l'utilisateur sache que quelque chose a déjà été rempli.

De plus, je veux ajouter un champ supplémentaire (comme dit) au même wrapper. C'est à dire. également sous la rubrique "Bron". Ce champ doit avoir le même comportement que celui ci-dessus: il peut être renseigné éventuellement par un auteur. Une fois rempli, il devrait pouvoir faire écho à son contenu dans le modèle. Je suppose que je peux ajouter une autre métabox dans le add_source_metabox, mais aurais-je besoin d'une autre fonction de rappel et de sauvegarde?

1
Bram Vanroy

Sauver:

// Update and save the field so it can be used in our template
if ( isset( $_POST['input_name'] ) ) {
    $data = sanitize_text_field( $_POST['input_name'] );
    update_post_meta( $post_id, 'field_name', $data );
}

Lire:

$data = get_post_meta( $post_id, 'field_name', true );
// With post object, a leaner, cleaner method:
$data = $post->field_name;

Il n'est pas nécessaire d'enregistrer une autre métabox et d'écrire un autre rappel. Il suffit de dupliquer le premier lot de echo dans output_source_metabox() et de changer l'étiquette et le nom.

Pour renseigner la valeur avec les données sauvegardées:

echo '<input ... value="' . esc_attr( get_post_meta( $post_id, 'field_name', true ) ) . '" ... />';

Vous aurez besoin d'un autre bloc "save" pour ce second champ. Assurez-vous simplement d'échanger input_name pour le name de l'entrée et field_name pour la clé méta dans laquelle vous souhaitez stocker ces données.

2
TheDeadMedic