Potrzebujesz prostego, ale kompletnego przykładu dodania metaboksu do taksonomii

18

Teraz, gdy WordPress 4.4 jest już dostępny, możemy zacząć korzystać z nowych niesamowitych funkcji meta!

Wydaje się jednak, że nie ma prostego samouczka na temat dodawania podstawowego pola tekstowego do taksonomii. Próbowałem dostosować ten niesamowity samouczek Justina Tadlocka do moich potrzeb, usuwając cały kod związany z próbnikiem kolorów i zastępując go prostym polem wprowadzania tekstu ... ale to nie działa.

Czy ktoś może dostarczyć próbkę działającego kodu od podstaw? Bez sprawdzania poprawności danych, nonces, selektory kolorów ... tylko minimalne pole tekstowe, dodane do strony Dodaj taksonomię / Edytuj taksonomię.

Aktualizacja: w międzyczasie wprowadziłem kilka odmian tego fragmentu kodu:

Dodaj pole meta terminu do kategorii :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Dodaj pole meta terminu do tagu post :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Dodaj pole meta terminu do niestandardowej taksonomii :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Dodaj kilka terminowych pól meta do niestandardowej taksonomii :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

Manu
źródło
Prześlij swój aktualny fragment kodu i informacje o jego awarii.
birgire,
@birgire przepraszam, że nie opublikowałem mojego oryginalnego kodu, ale był już zbyt popsuty i wolałbym zacząć od czystego przykładu.
Manu,

Odpowiedzi:

13

Spowoduje to dodanie pola o nazwie „TERM META TEXT” do twoich kategorii. Wyciągnąłem ten nonce, ale naprawdę myślę, że powinien wrócić. Poza tym lepiej jest mieć pewne warunki sanitarne niż żadne. Ten przykład zawiera haczyki javascript i CSS, których możesz potrzebować lub nie, ale możesz szybko zobaczyć, jak wszystkie części idą w parze.

Cieszyć się!

// 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
źródło
Wielkie dzięki, to jest naprawdę pomocne! Ale przy stosowaniu obecnego kodu napotykam jeden problem: pole TERM META TEXT jest aktualizowane po zmodyfikowaniu terminu, ale nie jest zapisywane po utworzeniu terminu.
Manu,
Próbowałem na innej stronie testowej i zobaczyłem to samo zachowanie - wszystko działało dobrze, z wyjątkiem tego, że po utworzeniu terminu metatekst nie został zapisany. Wyłączyłem weryfikację nonce wewnątrz ___save_term_meta_text( $term_id )... i to rozwiązało problem, metatekst jest teraz zapisywany podczas tworzenia nowego terminu! Dlatego akceptuję twoją odpowiedź, ponieważ zawiera dokładnie to, czego potrzebuję, aby zacząć.
Manu,
1
Właśnie zrozumiałem, co spowodowało problem: nonce nie został zdefiniowany w ___add_form_field_term_meta_text()funkcji. Po dodaniu wszystko działa zgodnie z oczekiwaniami.
Manu,
1
Nie ma potrzeby zanieczyszczania dodatkowymi nonces, ponieważ WP już je umieściło. Wystarczy zrobić check_admin_referer( 'add-tag', '_wpnonce_add-tag' );i check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )się 'edit_category'i 'category_category'działania.
Z. Zlatev
Warto zauważyć, że w twojej ___register_term_meta_text()funkcji trzeci parametr został uznany za przestarzały i zastąpiony tablicą. Będziesz musiał użyć czegoś takiego:$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