Necesita un ejemplo simple pero completo de agregar metabox a la taxonomía

18

¡Ahora que WordPress 4.4 está fuera, podemos comenzar a usar las nuevas funciones geniales de meta término!

Aún así, parece que no hay un tutorial simple sobre cómo agregar un campo de texto básico a una Taxonomía. Traté de adaptar este increíble tutorial de Justin Tadlock a mis necesidades, eliminando todo el código relacionado con el selector de color y reemplazándolo con un simple campo de entrada de texto ... pero no funciona.

¿Podría alguien proporcionar una muestra de código de trabajo básico? Sin validación de datos, ahora, selectores de color ... solo un cuadro de texto mínimo, agregado a la página Agregar taxonomía / Editar taxonomía.

Actualización: Mientras tanto, hice algunas variaciones de este fragmento de código:

Agregar término metacampo a la categoría :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Agregar término metacampo a la etiqueta de publicación :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Agregue metacampo de término a Taxonomía personalizada :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Agregue varios metacampos de término a Taxonomía personalizada :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

Manu
fuente
Publique su fragmento de código actual y cómo falla.
Birgire
@birgire lo siento por no publicar mi código original, pero ya estaba demasiado desordenado, y preferiría comenzar con un ejemplo limpio.
Manu

Respuestas:

13

Esto agregará un campo llamado 'TÉRMINO META TEXTO' a sus categorías. Saqué el nonce pero realmente creo que debería volver a entrar. Además, es mejor tener un poco de desinfección frente a ninguno. Este ejemplo incluye enlaces de JavaScript y CSS que puede necesitar o no, pero puede ver rápidamente cómo se combinan todas las partes.

¡Disfrutar!

// 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
fuente
Muchas gracias, esto es realmente útil! Pero al aplicar el código tal como está, me encuentro con un problema: el campo TÉRMINO META TEXTO se actualiza cuando se modifica un término, pero no se guarda cuando se crea un término.
Manu
Intenté en otro sitio de prueba y vi el mismo comportamiento: todo funcionaba bien, excepto que al crear el término, el meta texto no se guardó. Deshabilité la verificación nonce dentro ___save_term_meta_text( $term_id )... y esto solucionó el problema, ¡el meta texto ahora se guarda al crear un nuevo término! Por lo tanto, acepto su respuesta, ya que proporciona exactamente lo que necesito para comenzar.
Manu
1
Acabo de entender qué causó el problema: el nonce no se estaba definiendo en la ___add_form_field_term_meta_text()función. Después de agregarlo, todo funciona como se esperaba.
Manu
1
No es necesario contaminar con nonces adicionales ya que WP ya ha colocado algunos. Sólo hacer check_admin_referer( 'add-tag', '_wpnonce_add-tag' );y check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )en 'edit_category'y 'category_category'acciones.
Z. Zlatev
Vale la pena señalar que en su ___register_term_meta_text()función, el tercer parámetro ha sido desaprobado y reemplazado con una matriz. Tendrías que usar algo como:$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 );
Fritas