Cần một ví dụ đơn giản nhưng đầy đủ về việc thêm metabox vào phân loại


18

Bây giờ WordPress 4.4 đã ra mắt, chúng ta có thể bắt đầu sử dụng các hàm meta thuật ngữ mới tuyệt vời!

Tuy nhiên, dường như không có hướng dẫn đơn giản nào về cách thêm trường văn bản cơ bản vào Phân loại. Tôi đã cố gắng điều chỉnh hướng dẫn tuyệt vời này của Justin Tadlock theo nhu cầu của mình, xóa tất cả các mã liên quan đến bộ chọn màu và thay thế nó bằng một trường nhập văn bản đơn giản ... nhưng nó không hoạt động.

Ai đó có thể cung cấp một mẫu mã làm việc xương trần? Không có xác thực dữ liệu, nonces, bộ chọn màu ... chỉ là một hộp văn bản tối thiểu, được thêm vào trang Thêm phân loại / Chỉnh sửa phân loại.

Cập nhật: Trong thời gian chờ đợi, tôi đã thực hiện một vài biến thể của đoạn mã này:

Thêm trường meta hạn vào Danh mục :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Thêm trường meta hạn vào Thẻ bài :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Thêm trường meta hạn vào Phân loại tùy chỉnh :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Thêm một số trường meta hạn vào Phân loại tùy chỉnh :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc


Vui lòng gửi đoạn mã hiện tại của bạn và làm thế nào nó thất bại.
bạch dương

@birgire xin lỗi vì đã không đăng mã gốc của tôi, nhưng nó đã quá rối và tôi muốn bắt đầu từ một ví dụ rõ ràng.
Manu

Câu trả lời:


13

Điều này sẽ thêm một trường gọi là 'HẠN META TEXT' vào danh mục của bạn. Tôi đã loại bỏ nonce nhưng tôi thực sự nghĩ rằng nó nên quay trở lại. Ngoài ra, tốt hơn hết là nên vệ sinh so với không. Ví dụ này bao gồm các javascript và CSS hook mà bạn có thể cần hoặc không cần nhưng bạn có thể nhanh chóng xem tất cả các phần kết hợp với nhau như thế nào.

Thưởng thức!

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

Cảm ơn rất nhiều, điều này thực sự hữu ích! Nhưng khi áp dụng mã như hiện tại, tôi gặp phải một vấn đề: trường TATE META TEXT được cập nhật khi một thuật ngữ được sửa đổi, nhưng không được lưu khi thuật ngữ được tạo.
Manu

Tôi đã thử trên một trang web thử nghiệm khác và thấy hành vi tương tự - mọi thứ đều hoạt động tốt, ngoại trừ khi tạo thuật ngữ, văn bản meta không được lưu. Tôi đã vô hiệu hóa xác minh nonce bên trong ___save_term_meta_text( $term_id )... và điều này đã khắc phục vấn đề, văn bản meta hiện được lưu khi tạo một thuật ngữ mới! Do đó, tôi chấp nhận câu trả lời của bạn, vì nó cung cấp chính xác những gì tôi cần để bắt đầu.
Manu

1
Tôi chỉ hiểu những gì gây ra vấn đề: nonce đã không được xác định trong ___add_form_field_term_meta_text()hàm. Sau khi thêm nó, tất cả các công trình như mong đợi.
Manu

1
Không cần phải gây ô nhiễm với các lực lượng bổ sung vì WP đã đặt một số. Chỉ cần làm check_admin_referer( 'add-tag', '_wpnonce_add-tag' );check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )trong 'edit_category''category_category'hành động.
Z. Zlatev

Điều đáng chú ý là trong ___register_term_meta_text()chức năng của bạn , tham số thứ ba đã bị phản đối và thay thế bằng một mảng thay thế. Bạn sẽ phải sử dụng một cái gì đó như:$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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.