Benötigen Sie ein einfaches, aber vollständiges Beispiel für das Hinzufügen von Metabox zur Taxonomie

18

Jetzt, da WordPress 4.4 verfügbar ist, können wir die neuen fantastischen Term-Meta-Funktionen nutzen!

Es scheint jedoch kein einfaches Tutorial zum Hinzufügen eines einfachen Textfelds zu einer Taxonomie zu geben. Ich habe versucht, dieses großartige Tutorial von Justin Tadlock an meine Bedürfnisse anzupassen, indem ich den gesamten Code für den Farbwähler entfernt und durch ein einfaches Texteingabefeld ersetzt habe ... aber es funktioniert nicht.

Könnte jemand ein Bare-Bones-Arbeitscode-Beispiel bereitstellen? Ohne Datenvalidierung, Nonces, Farbauswahl ... nur ein minimales Textfeld, das der Seite Taxonomie hinzufügen / Taxonomie bearbeiten hinzugefügt wurde.

Update: In der Zwischenzeit habe ich einige Variationen dieses Code-Snippets gemacht:

Fügen Sie das Begriff-Metafeld zur Kategorie hinzu :
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

Fügen Sie das Begriff-Metafeld zum Post-Tag hinzu :
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

Fügen Sie der benutzerdefinierten Taxonomie ein Begriff- Metafeld hinzu :
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

Fügen Sie der benutzerdefinierten Taxonomie mehrere Term- Metafelder hinzu :
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

Manu
quelle
Bitte posten Sie Ihr aktuelles Code-Snippet und wie es fehlschlägt.
Birgire
@birgire Entschuldigung, dass ich meinen Originalcode nicht gepostet habe, aber er war bereits zu durcheinander und ich würde lieber von einem sauberen Beispiel ausgehen.
Manu

Antworten:

13

Dadurch wird ein Feld mit dem Namen "TERM META TEXT" zu Ihren Kategorien hinzugefügt. Ich habe das Nonce herausgenommen, aber ich denke wirklich, dass es wieder rein gehen sollte. Außerdem ist es einfach besser, etwas Desinfektion gegen keine zu haben. Dieses Beispiel enthält Javascript- und CSS-Hooks, die Sie möglicherweise benötigen oder nicht, aber Sie können schnell sehen, wie alle Teile zusammenpassen.

Genießen!

// 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
quelle
Vielen Dank, das ist wirklich hilfreich! Bei der Anwendung des Codes im Ist-Zustand tritt jedoch ein Problem auf: Das Feld TERM META TEXT wird aktualisiert, wenn ein Begriff geändert wird, aber nicht gespeichert, wenn ein Begriff erstellt wird.
Manu
Ich habe es auf einer anderen Test-Site versucht und das gleiche Verhalten festgestellt - alles hat gut funktioniert, außer dass der Metatext beim Erstellen des Terms nicht gespeichert wurde. Ich habe die Nonce-Überprüfung im Inneren deaktiviert ___save_term_meta_text( $term_id )... und dies hat das Problem behoben. Der Metatext wird jetzt beim Erstellen eines neuen Begriffs gespeichert! Ich akzeptiere daher Ihre Antwort, da sie genau das bietet, was ich brauche, um loszulegen.
Manu
1
Ich habe nur verstanden, was das Problem verursacht hat: Die Nonce wurde in der ___add_form_field_term_meta_text()Funktion nicht definiert . Nach dem Hinzufügen funktioniert alles wie erwartet.
Manu
1
Keine Notwendigkeit, mit zusätzlichen Nonces zu verschmutzen, da WP bereits einige platziert hat. Mach einfach check_admin_referer( 'add-tag', '_wpnonce_add-tag' );und check_admin_referer( 'update-tag_' . (int) $_POST['tag_ID'] )in 'edit_category'und 'category_category'Handlungen.
Z. Zlatev
Es ist erwähnenswert, dass in Ihrer ___register_term_meta_text()Funktion der dritte Parameter veraltet ist und stattdessen durch ein Array ersetzt wurde. Sie müssten etwa Folgendes verwenden:$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