ต้องการตัวอย่างที่เรียบง่าย แต่สมบูรณ์ของการเพิ่ม metabox ลงในอนุกรมวิธาน


18

ตอนนี้ WordPress 4.4 ออกมาแล้วเราสามารถเริ่มใช้ฟังก์ชัน meta คำใหม่ที่ยอดเยี่ยม!

ถึงกระนั้นก็ดูเหมือนว่าจะไม่มีการสอนวิธีการเพิ่มฟิลด์ข้อความพื้นฐานให้กับ Taxonomy ฉันพยายามที่จะดัดแปลงบทช่วยสอนที่น่าทึ่งนี้โดย Justin Tadlockตามความต้องการของฉันโดยลบโค้ดทั้งหมดที่เกี่ยวกับเครื่องมือเลือกสีและแทนที่ด้วยฟิลด์ป้อนข้อความแบบง่าย ... แต่มันก็ไม่ทำงาน

บางคนสามารถให้ตัวอย่างรหัสการทำงานที่เปลือยเปล่าได้หรือไม่ หากไม่มีการตรวจสอบความถูกต้องของข้อมูล nonces ตัวเลือกสี ... เพียงแค่กล่องข้อความเล็ก ๆ น้อย ๆ เพิ่มลงในหน้าเพิ่ม taxonomy / แก้ไข taxonomy

อัปเดต:ในระหว่างนี้ฉันสร้างตัวอย่างข้อมูลโค้ดนี้สองสามรูปแบบ:

เพิ่มคำว่า meta field ลงในหมวดหมู่ :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

เพิ่มเขตข้อมูลเมตาลงในโพสต์แท็ก :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

เพิ่มเขตข้อมูลเมตาลงในTaxonomy แบบกำหนดเอง :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

เพิ่มเขตข้อมูลเมตาหลายคำในTaxonomy ที่กำหนดเอง :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc


โปรดโพสต์ข้อมูลโค้ดปัจจุบันของคุณและความล้มเหลว
Birgire

@ Birgire ขอโทษที่ไม่ได้โพสต์รหัสเดิมของฉัน แต่มันก็ยุ่งเกินไปและฉันจะเริ่มจากตัวอย่างที่ชัดเจน
มนู

คำตอบ:


13

สิ่งนี้จะเพิ่มฟิลด์ชื่อ 'TERM META TEXT' ในหมวดหมู่ของคุณ ฉันเอาออกจาก nonce แต่ฉันคิดว่ามันควรจะกลับเข้าไปในนอกจากนี้มันจะดีกว่าที่จะมีการฆ่าเชื้อและไม่มี ตัวอย่างนี้รวมถึง javascript และ CSS hooks ซึ่งคุณอาจจะหรืออาจไม่ต้องการ แต่คุณสามารถดูว่าชิ้นส่วนทั้งหมดเข้าด้วยกันได้อย่างรวดเร็ว

สนุก!

// 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 }

ขอบคุณมากนี่เป็นประโยชน์จริงๆ! แต่เมื่อใช้รหัสตามที่เป็นอยู่ฉันพบปัญหาหนึ่ง: เขตข้อมูล TERM META TEXT จะได้รับการอัปเดตเมื่อมีการแก้ไขคำ แต่ไม่ได้รับการบันทึกเมื่อสร้างคำ
มนู

ฉันลองไซต์ทดสอบอื่นและเห็นพฤติกรรมแบบเดียวกัน - ทุกอย่างทำงานได้ดียกเว้นว่าเมื่อสร้างคำศัพท์ข้อความเมตาจะไม่ถูกบันทึก ฉันปิดใช้งานการตรวจสอบ nonce ภายใน___save_term_meta_text( $term_id )... และปัญหานี้ได้แก้ไขแล้วข้อความเมตาจะถูกบันทึกไว้เมื่อสร้างคำใหม่! ฉันยอมรับคำตอบของคุณเพราะมันให้สิ่งที่ฉันต้องการในการเริ่มต้น
มนู

1
ฉันเพิ่งเข้าใจสิ่งที่ทำให้เกิดปัญหา: nonce ไม่ได้ถูกกำหนดไว้ใน___add_form_field_term_meta_text()ฟังก์ชั่น หลังจากเพิ่มแล้วทำงานทั้งหมดตามที่คาดไว้
มนู

1
ไม่จำเป็นที่จะต้องสร้างมลพิษด้วย nonces เพิ่มเติมเนื่องจาก WP ได้วางบางส่วนไว้แล้ว เพียงแค่ทำcheck_admin_referer( 'add-tag', '_wpnonce_add-tag' );และcheck_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )ใน'edit_category'และ'category_category'การกระทำ
Z. Zlatev

เป็นที่น่าสังเกตว่าใน___register_term_meta_text()ฟังก์ชั่นของคุณพารามิเตอร์ที่สามเลิกใช้แล้วและแทนที่ด้วยอาเรย์แทน คุณจะต้องใช้สิ่งที่ชอบ:$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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.