Потрібен простий, але повний приклад додавання метабокса до таксономії


18

Тепер, коли WordPress 4.4 вийшов, ми можемо почати використовувати нові дивовижні мета-функції!

Але, мабуть, не існує простого підручника про те, як додати базове текстове поле до систематики. Я спробував адаптувати цей дивовижний підручник Джастіном Тадлоком до моїх потреб, видаливши весь код, що стосується вибору кольору, і замінивши його простим полем для введення тексту ..., але це не працює.

Чи може хтось надати зразок робочого коду з голими кістками? Без перевірки даних, жодних значень, підбирачів кольорів ... лише мінімальне текстове поле, додане на сторінку Додати таксономію / Редагувати таксономію.

Оновлення. Тим часом я зробив кілька варіантів цього фрагмента коду:

Додати мета-поле терміна до категорії :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Додайте метаполе терміна до тегу допису :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Додайте метаполе терміна до спеціальної таксономії :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Додайте кілька метапольових термінів до спеціальної таксономії :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc


Будь ласка, опублікуйте свій поточний фрагмент коду та спосіб його відмови.
birgire

@birgire вибачте за те, що не опублікував свій початковий код, але він уже надто заплутався, і я скоріше почну з чистого прикладу.
Ману

Відповіді:


13

Це додасть поле під назвою "ТЕРМІН МЕТИ ТЕКСТУ" до ваших категорій. Я все-таки вийняв це, але я дійсно думаю, що це повинно повернутися. Крім того, просто краще провести санітарію проти жодної. Цей приклад включає гачки javascript та CSS, які можуть вам або не знадобляться, але ви можете швидко побачити, як всі частини поєднуються.

Насолоджуйтесь!

// 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
Я просто зрозумів, що викликало проблему: поняття не було визначено у ___add_form_field_term_meta_text()функції. Після його додавання все працює як очікувалося.
Ману

1
Не потрібно забруднювати додаткові можливості, оскільки WP вже розмістив їх. Просто роби check_admin_referer( 'add-tag', '_wpnonce_add-tag' );і check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )в, 'edit_category'і 'category_category'дії.
З. Златев

Варто зауважити, що у вашій ___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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.