Precisa de um exemplo simples, mas completo, de adição de metabox à taxonomia

18

Agora que o WordPress 4.4 foi lançado, podemos começar a usar o novo e impressionante termo meta-funções!

Ainda assim, parece não haver um tutorial simples sobre como adicionar um campo de texto básico a uma taxonomia. Tentei adaptar este incrível tutorial de Justin Tadlock às minhas necessidades, removendo todo o código relacionado ao seletor de cores e substituindo-o por um simples campo de entrada de texto ... mas não está funcionando.

Alguém poderia fornecer um exemplo de código de trabalho básico? Sem validação de dados, nonces, selecionadores de cores ... apenas uma caixa de texto mínima, adicionada à página Adicionar taxonomia / Editar taxonomia.

Atualização: Enquanto isso, fiz algumas variações desse snippet de código:

Adicione o meta campo de termo à categoria :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Adicione o meta campo do termo à Tag Post :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Adicione o meta campo do termo à taxonomia personalizada :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Adicione vários meta-campos de termos à Taxonomia Personalizada :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

Manu
fonte
Publique seu snippet de código atual e como ele falha.
birgire
@ Birgire desculpe por não postar meu código original, mas ele já estava muito bagunçado, e eu prefiro começar com um exemplo limpo.
Manu

Respostas:

13

Isso adicionará um campo chamado 'TERM META TEXT' às suas categorias. Eu tirei o nonce, mas realmente acho que deveria voltar. Além disso, é melhor ter um pouco de higienização do que nenhum. Este exemplo inclui ganchos javascript e CSS dos quais você pode ou não precisar, mas pode ver rapidamente como todas as partes estão juntas.

Desfrutar!

// 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
fonte
Muito obrigado, isso é realmente útil! Mas, ao aplicar o código como está, encontro um problema: o campo TERM META TEXT é atualizado quando um termo é modificado, mas não é salvo quando um termo é criado.
Manu
Eu tentei em outro site de teste e vi o mesmo comportamento - tudo funcionava bem, exceto que, na criação do termo, o meta texto não foi salvo. Desativei a verificação do nonce dentro ___save_term_meta_text( $term_id )... e isso corrigiu o problema, o meta texto agora é salvo ao criar um novo termo! Portanto, estou aceitando sua resposta, pois ela fornece exatamente o que eu preciso para começar.
Manu
11
Acabei de entender o que causou o problema: o nonce não estava sendo definido na ___add_form_field_term_meta_text()função. Depois de adicioná-lo, tudo funciona como esperado.
Manu
11
Não há necessidade de poluir com nonces adicionais, pois o WP já colocou alguns. Basta fazer check_admin_referer( 'add-tag', '_wpnonce_add-tag' );e check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )em 'edit_category'e 'category_category'ações.
Z. Zlatev 9/10
É importante notar que, em sua ___register_term_meta_text()função, o terceiro parâmetro foi preterido e substituído por uma matriz. Você teria 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 );
Frits