Perlu contoh sederhana namun lengkap untuk menambahkan metabox ke taksonomi

18

Sekarang WordPress 4.4 telah keluar, kita dapat mulai menggunakan fungsi meta istilah baru yang mengagumkan!

Namun, tampaknya tidak ada tutorial sederhana tentang cara menambahkan bidang teks dasar ke Taksonomi. Saya mencoba untuk menyesuaikan tutorial yang luar biasa ini oleh Justin Tadlock dengan kebutuhan saya, menghapus semua kode yang berkaitan dengan color picker dan menggantinya dengan bidang input teks sederhana ... tetapi tidak berfungsi.

Bisakah seseorang memberikan contoh kode kerja tanpa tulang? Tanpa validasi data, nonces, pemilih warna ... hanya kotak teks minimal, ditambahkan ke halaman Tambahkan taksonomi / Edit taksonomi.

Pembaruan: Sementara itu, saya membuat beberapa variasi potongan kode ini:

Tambahkan bidang meta istilah ke Kategori :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Tambahkan istilah meta field ke Posting Tag :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Tambahkan bidang meta istilah ke Taksonomi Kustom :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Tambahkan beberapa bidang meta istilah ke Taksonomi Khusus :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

Manu
sumber
Harap kirim cuplikan kode Anda saat ini dan bagaimana kegagalannya.
birgire
@ Borgire maaf karena tidak memposting kode asli saya, tetapi sudah terlalu kacau, dan saya lebih suka mulai dari contoh bersih.
Manu

Jawaban:

13

Ini akan menambahkan bidang yang disebut 'TERM META TEXT' ke kategori Anda. Saya memang mengambil nonce tapi saya benar-benar berpikir itu harus kembali. Juga, itu lebih baik untuk memiliki beberapa sanitasi vs tidak ada. Contoh ini termasuk javascript dan kait CSS yang mungkin Anda perlukan atau tidak tetapi Anda dapat dengan cepat melihat bagaimana semua bagian berjalan bersamaan.

Nikmati!

// 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
sumber
Terima kasih banyak, ini sangat membantu! Tetapi ketika menerapkan kode apa adanya, saya menghadapi satu masalah: bidang TERM META TEXT diperbarui ketika suatu istilah diubah, tetapi tidak disimpan ketika suatu istilah dibuat.
Manu
Saya mencoba di situs pengujian lain, dan melihat perilaku yang sama - semuanya bekerja dengan baik, kecuali bahwa pada saat pembuatan istilah, teks meta tidak disimpan. Saya menonaktifkan verifikasi nonce di dalam ___save_term_meta_text( $term_id )... dan ini memperbaiki masalahnya, meta text sekarang disimpan saat membuat istilah baru! Karena itu saya menerima jawaban Anda, karena memberikan apa yang saya butuhkan untuk memulai.
Manu
1
Saya baru saja mengerti apa yang menyebabkan masalah: ketidaksesuaian tidak didefinisikan dalam ___add_form_field_term_meta_text()fungsi. Setelah menambahkannya, semua berfungsi seperti yang diharapkan.
Manu
1
Tidak perlu mencemari dengan nonces tambahan karena WP telah menempatkan beberapa. Hanya melakukan check_admin_referer( 'add-tag', '_wpnonce_add-tag' );dan check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )dalam 'edit_category'dan 'category_category'tindakan.
Z. Zlatev
Perlu dicatat bahwa dalam ___register_term_meta_text()fungsi Anda , parameter ketiga telah ditinggalkan dan diganti dengan array. Anda harus menggunakan sesuatu seperti:$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