Besoin d'un exemple simple mais complet d'ajout de métabox à la taxonomie

18

Maintenant que WordPress 4.4 est sorti, nous pouvons commencer à utiliser les nouvelles fonctions méta géniales!

Pourtant, il ne semble pas y avoir de didacticiel simple sur la façon d'ajouter un champ de texte de base à une taxonomie. J'ai essayé d'adapter ce tutoriel génial de Justin Tadlock à mes besoins, en supprimant tout le code relatif au sélecteur de couleurs et en le remplaçant par un simple champ de saisie de texte ... mais cela ne fonctionne pas.

Quelqu'un pourrait-il fournir un exemple de code de travail à nu? Sans validation des données, nonces, sélecteurs de couleurs ... juste une zone de texte minimale, ajoutée à la page Ajouter une taxonomie / Modifier la taxonomie.

Mise à jour: En attendant, j'ai fait quelques variantes de cet extrait de code:

Ajouter un champ méta de terme à la catégorie :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Ajouter un méta-champ de terme au tag de publication :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Ajoutez le terme méta-champ à la taxonomie personnalisée :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Ajoutez plusieurs champs méta de termes à la taxonomie personnalisée :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

Manu
la source
Veuillez publier votre extrait de code actuel et comment il échoue.
birgire
@birgire désolé de ne pas avoir publié mon code d'origine, mais il était déjà trop foiré, et je préfère partir d'un exemple clair.
Manu

Réponses:

13

Cela ajoutera un champ appelé «TERM META TEXT» à vos catégories. J'ai retiré le nonce mais je pense vraiment qu'il devrait y retourner. De plus, il est préférable d'avoir une désinfection par rapport à aucune. Cet exemple inclut des crochets javascript et CSS dont vous pouvez ou non avoir besoin, mais vous pouvez rapidement voir comment toutes les parties vont ensemble.

Prendre plaisir!

// REGISTER TERM META

add_action( 'init', '___register_term_meta_text' );

function ___register_term_meta_text() {

    register_meta( 'term', '__term_meta_text', '___sanitize_term_meta_text' );
}

// SANITIZE DATA

function ___sanitize_term_meta_text ( $value ) {
    return sanitize_text_field ($value);
}

// GETTER (will be sanitized)

function ___get_term_meta_text( $term_id ) {
  $value = get_term_meta( $term_id, '__term_meta_text', true );
  $value = ___sanitize_term_meta_text( $value );
  return $value;
}

// ADD FIELD TO CATEGORY TERM PAGE

add_action( 'category_add_form_fields', '___add_form_field_term_meta_text' );

function ___add_form_field_term_meta_text() { ?>
    <?php wp_nonce_field( basename( __FILE__ ), 'term_meta_text_nonce' ); ?>
    <div class="form-field term-meta-text-wrap">
        <label for="term-meta-text"><?php _e( 'TERM META TEXT', 'text_domain' ); ?></label>
        <input type="text" name="term_meta_text" id="term-meta-text" value="" class="term-meta-text-field" />
    </div>
<?php }


// ADD FIELD TO CATEGORY EDIT PAGE

add_action( 'category_edit_form_fields', '___edit_form_field_term_meta_text' );

function ___edit_form_field_term_meta_text( $term ) {

    $value  = ___get_term_meta_text( $term->term_id );

    if ( ! $value )
        $value = ""; ?>

    <tr class="form-field term-meta-text-wrap">
        <th scope="row"><label for="term-meta-text"><?php _e( 'TERM META TEXT', 'text_domain' ); ?></label></th>
        <td>
            <?php wp_nonce_field( basename( __FILE__ ), 'term_meta_text_nonce' ); ?>
            <input type="text" name="term_meta_text" id="term-meta-text" value="<?php echo esc_attr( $value ); ?>" class="term-meta-text-field"  />
        </td>
    </tr>
<?php }


// SAVE TERM META (on term edit & create)

add_action( 'edit_category',   '___save_term_meta_text' );
add_action( 'create_category', '___save_term_meta_text' );

function ___save_term_meta_text( $term_id ) {

    // verify the nonce --- remove if you don't care
    if ( ! isset( $_POST['term_meta_text_nonce'] ) || ! wp_verify_nonce( $_POST['term_meta_text_nonce'], basename( __FILE__ ) ) )
        return;

    $old_value  = ___get_term_meta_text( $term_id );
    $new_value = isset( $_POST['term_meta_text'] ) ? ___sanitize_term_meta_text ( $_POST['term_meta_text'] ) : '';


    if ( $old_value && '' === $new_value )
        delete_term_meta( $term_id, '__term_meta_text' );

    else if ( $old_value !== $new_value )
        update_term_meta( $term_id, '__term_meta_text', $new_value );
}

// MODIFY COLUMNS (add our meta to the list)

add_filter( 'manage_edit-category_columns', '___edit_term_columns' );

function ___edit_term_columns( $columns ) {

    $columns['__term_meta_text'] = __( 'TERM META TEXT', 'text_domain' );

    return $columns;
}

// RENDER COLUMNS (render the meta data on a column)

add_filter( 'manage_category_custom_column', '___manage_term_custom_column', 10, 3 );

function ___manage_term_custom_column( $out, $column, $term_id ) {

    if ( '__term_meta_text' === $column ) {

        $value  = ___get_term_meta_text( $term_id );

        if ( ! $value )
            $value = '';

        $out = sprintf( '<span class="term-meta-text-block" style="" >%s</div>', esc_attr( $value ) );
    }

    return $out;
}

// ADD JAVASCRIPT & STYLES TO COLUMNS

add_action( 'admin_enqueue_scripts', '___admin_enqueue_scripts' );

function ___admin_enqueue_scripts( $hook_suffix ) {

    if ( 'edit-tags.php' !== $hook_suffix || 'category' !== get_current_screen()->taxonomy )
        return;

    // ADD YOUR SUPPORTING CSS / JS FILES HERE
    // wp_enqueue_style( 'wp-color-picker' );
    // wp_enqueue_script( 'wp-color-picker' );

    add_action( 'admin_head',   '___meta_term_text_print_styles' );
    add_action( 'admin_footer', '___meta_term_text_print_scripts' );
}

// PRINT OUR CUSTOM STYLES

function ___meta_term_text_print_styles() { ?>

    <style type="text/css">
        .column-__term_meta_text { background-color:rgb(249, 249, 249); border: 1px solid lightgray;}
        .column-__term_meta_text .term-meta-text-block { display: inline-block; color:darkturquoise; }
    </style>
<?php }

// PRINT OUR CUSTOM SCRIPTS

function ___meta_term_text_print_scripts() { ?>

    <script type="text/javascript">
        jQuery( document ).ready( function( $ ) {
             $input_field = $( '.term-meta-text-field' );
             // console.log($input_field); // your input field
        } );
    </script>
<?php }
jgraup
la source
Merci beaucoup, c'est vraiment utile! Mais lorsque j'applique le code tel quel, je rencontre un problème: le champ TERM META TEXT est mis à jour lorsqu'un terme est modifié, mais n'est pas enregistré lorsqu'un terme est créé.
Manu
J'ai essayé sur un autre site de test et j'ai vu le même comportement - tout fonctionnait bien, sauf qu'à la création du terme, le méta-texte n'était pas enregistré. J'ai désactivé la vérification nonce à l'intérieur ___save_term_meta_text( $term_id )... et cela a résolu le problème, le méta texte est maintenant enregistré lors de la création d'un nouveau terme! J'accepte donc votre réponse, car elle fournit exactement ce dont j'ai besoin pour commencer.
Manu
1
Je viens de comprendre ce qui a causé le problème: le nonce n'était pas défini dans la ___add_form_field_term_meta_text()fonction. Après l'avoir ajouté, tout fonctionne comme prévu.
Manu
1
Pas besoin de polluer avec des nonces supplémentaires puisque WP en a déjà placé. Il suffit de faire check_admin_referer( 'add-tag', '_wpnonce_add-tag' );et check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )à l' intérieur 'edit_category'et les 'category_category'actions.
Z. Zlatev
Il convient de noter que dans votre ___register_term_meta_text()fonction, le troisième paramètre a été déconseillé et remplacé par un tableau à la place. Vous devez utiliser quelque chose comme:$args = array( 'type' => 'string', 'description' => 'A text field', 'single' => 'false', 'sanitize_callback' => '___sanitize_term_meta_weare_product', 'auth_callback' => null, 'show_in_rest' => false, ); register_meta( 'term', '__term_meta_text', $args );
Frits