Come Aggiungere Campi Personalizzati alle Tassonomie Personalizzate in WordPress in Modo PULITO

27 giu 2012, 21:27:42
Visualizzazioni: 26.1K
Voti: 5

Salvare campi extra che sono stati aggiunti a una tassonomia. Voglio il modo più corretto ed efficiente per farlo. Dove dovrei salvare i nuovi campi?

2 possibili soluzioni sono:

1) Utilizzare la tabella delle opzioni di WordPress come descritto qui... Aggiungere Campi Personalizzati alle Tassonomie Personalizzate. Questo è ammettamente "non pulito" e si presume non sia la risposta corretta.

// Una funzione di callback per salvare i nostri campi personalizzati della tassonomia
function save_taxonomy_custom_fields( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
    $t_id = $term_id;
    $term_meta = get_option( "taxonomy_term_$t_id" );
    $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ){
        if ( isset( $_POST['term_meta'][$key] ) ){
            $term_meta[$key] = $_POST['term_meta'][$key];
        }
    }
    //salva l'array delle opzioni
    update_option( "taxonomy_term_$t_id", $term_meta );
}
}

2) Aggiungere una nuova tabella come descritto qui Tassonomie Personalizzate in WordPress che segue la convenzione di denominazione di 'wp_' + chiave_tassonomia_personalizzata + 'meta'.

3) Qualche altra opzione

0
Tutte le risposte alla domanda 5
1
14

Puoi salvare l'ID dell'allegato nella tabella delle opzioni e recuperarlo per visualizzare quell'allegato

Ci sono tre funzioni principali per aggiungere il meta box per la tassonomia. Queste vengono invocate tramite i seguenti hook:

  1. {taxonomy_name}_add_form_fields
  2. {taxonomy_name}_edit_form_fields
  3. edited_{taxonomy_name}
  4. create_{taxonomy_name}

Qui puoi sostituire taxonomy_name con qualsiasi tassonomia predefinita o personalizzata. Sto utilizzando la "Tassonomia dei prodotti Woocommerce" e ho creato un plugin per questo. Per favore, rivedi le seguenti funzioni per aggiungere un campo personalizzato:

{taxonomy_name}_add_form_fields aggiunge un nuovo campo personalizzato al modulo di aggiunta nuovo termine. Qui sto creando un campo per aggiungere una Classe al termine.

Aggiungi il seguente codice nel file functions.php del tuo tema

public function mj_taxonomy_add_custom_meta_field() {
            ?>
            <div class="form-field">
                <label for="term_meta[class_term_meta]"><?php _e( 'Aggiungi Classe', 'MJ' ); ?></label>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="">
                <p class="description"><?php _e( 'Inserisci un valore per questo campo','MJ' ); ?></p>
            </div>
        <?php
        }
    add_action( 'product_cat_add_form_fields', 'mj_taxonomy_add_custom_meta_field', 10, 2 );

{taxonomy_name}_edit_form_fields aggiunge un campo nella pagina di modifica del termine

public function mj_taxonomy_edit_custom_meta_field($term) {

        $t_id = $term->term_id;
        $term_meta = get_option( "taxonomy_$t_id" ); 
       ?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[class_term_meta]"><?php _e( 'Aggiungi Classe', 'MJ' ); ?></label></th>
            <td>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="<?php echo esc_attr( $term_meta['class_term_meta'] ) ? esc_attr( $term_meta['class_term_meta'] ) : ''; ?>">
                <p class="description"><?php _e( 'Inserisci un valore per questo campo','MJ' ); ?></p>
            </td>
        </tr>
    <?php
    }

add_action( 'product_cat_edit_form_fields','mj_taxonomy_edit_custom_meta_field', 10, 2 );

public function mj_save_taxonomy_custom_meta_field( $term_id ) {
        if ( isset( $_POST['term_meta'] ) ) {

            $t_id = $term_id;
            $term_meta = get_option( "taxonomy_$t_id" );
            $cat_keys = array_keys( $_POST['term_meta'] );
            foreach ( $cat_keys as $key ) {
                if ( isset ( $_POST['term_meta'][$key] ) ) {
                    $term_meta[$key] = $_POST['term_meta'][$key];
                }
            }
            // Salva l'array delle opzioni
            update_option( "taxonomy_$t_id", $term_meta );
        }

    }  
add_action( 'edited_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );  
add_action( 'create_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );
8 feb 2017 19:33:28
Commenti

Grazie per le tue risposte! Potresti per favore modificare le tue risposte e aggiungere qualche informazione su cosa fa questo codice e come risolve il problema originale?

Howdy_McGee Howdy_McGee
8 feb 2017 20:43:48
1

L'opzione 2 è il metodo più pulito - che ho utilizzato anche io diverse volte. Sfortunatamente, non esiste ancora una tabella term_metadata predefinita in WordPress. Questo articolo copre lo stesso approccio, http://shibashake.com/wordpress-theme/add-term-or-taxonomy-meta-data

E naturalmente, esiste anche un plugin per questo :) http://wordpress.org/extend/plugins/taxonomy-metadata/

27 giu 2012 23:41:19
Commenti

Ottimo tutorial. Così semplice! Grazie. (ovviamente volevo creare la mia soluzione, dato che i plugin sono una soluzione troppo facile!)

csi csi
28 giu 2012 18:38:37
0

1) Tabella predefinita wp_options

Davvero non capisco perché alcuni propongano

update_option( "taxonomy_term_$t_id", $term_meta );

quando possiamo avere una singola opzione, i cui indici sono l'ID del Termine e i campi personalizzati come valori

$options = get_option( 'taxonomy_term_meta' );
$options[$t_id] = $term_meta;
update_option( 'taxonomy_term_meta', $options );

e poi semplicemente recuperare l'opzione e ottenere il valore memorizzato per un dato ID Termine

$options = get_option( 'taxonomy_term_meta' );
echo $options[$tax->term_id];

2) Tabella personalizzata wp_taxonomymeta

Questo è ciò che fa il plugin Taxonomy Metadata, linkato da James. Ed è piuttosto semplice: una volta creata questa tabella, le funzioni add_, get_, update_ e delete_<b>metadata</b> inizieranno a funzionare con 'taxonomy'. In questo modo:

function add_term_meta($term_id, $meta_key, $meta_value, $unique = false) {
    return add_metadata('taxonomy', $term_id, $meta_key, $meta_value, $unique);
}

function delete_term_meta($term_id, $meta_key, $meta_value = '') {
    return delete_metadata('taxonomy', $term_id, $meta_key, $meta_value);
}

function get_term_meta($term_id, $key, $single = false) {
    return get_metadata('taxonomy', $term_id, $key, $single);
}

function update_term_meta($term_id, $meta_key, $meta_value, $prev_value = '') {
    return update_metadata('taxonomy', $term_id, $meta_key, $meta_value, $prev_value);
}

3) Tipo di post Helper

Come descritto nella risposta di Matthew Boynes (penso che qualcuno lo menzioni anche nel ticket #10142).

4) Pensiero Laterale

Nel codice del plugin, c'è un link al Core Ticket #10142 che discute tutto questo. È un ticket di 4 anni fa, (closed)(maybelater), molti sviluppatori sono intervenuti, ma non si è raggiunta alcuna conclusione.

Alla fine, abbiamo questa perla (il mio enfasi):

paco pepe
Avendo bisogno di questo regolarmente, ho creato la mia soluzione: Utilizza impropriamente il campo "description" come contenitore di storage per un array serializzato. L'unica cosa un po' complicata era mostrare la descrizione normale nell'interfaccia di amministrazione. Comunque questa sarebbe la soluzione che speravo: Convertire semplicemente il campo description invece di aggiungere una serie di nuovi campi. Se c'è bisogno, vedremo i casi d'uso dopo averlo ottenuto e procederemo con una soluzione ricercabile in una versione successiva.

Davvero intelligente.

21 ott 2013 23:26:42
2

La risposta migliore è (3) Qualche altra opzione.

È un po' non convenzionale, ma scala meglio, sfrutta al massimo il core e non richiede l'aggiunta di una tabella nel database: Aggiungi un tipo di post nascosto per la tassonomia. Ogni termine nella tassonomia ottiene il proprio post nel tipo di post. Con questa struttura, i meta dei termini possono essere memorizzati come meta dei post. Ecco un esempio di utilizzo di questo approccio.

I principali problemi con qualsiasi altro approccio (inclusa l'opzione "usa il campo descrizione del termine per memorizzare dati serializzati") sono la scalabilità, le prestazioni e la compatibilità.

22 ott 2013 00:14:59
Commenti

Ben ricordato, cambierò la mia numerazione.

brasofilo brasofilo
22 ott 2013 00:21:25

Non solo con un custom post type nascosto. Se un termine risulta essere associato a un singolo post, un post o un page type. Allora la term meta può memorizzare l'ID di quel post e possiamo creare molti campi personalizzati per quel post che esistono per avere una relazione con un termine nella nostra tassonomia personalizzata. Qualunque sia il tuo approccio. Consiglio vivamente di creare una protezione dall'eliminazione di termini personalizzati se contengono così tanti meta e sono collegati a post. Lo sto facendo ora in WP e-Customers perché eliminare un termine potrebbe creare il caos se i meta del termine sono necessari e in uso.

Ryan Bayne Ryan Bayne
3 feb 2014 01:33:43
0

https://wordpress.org/plugins/taxonomy-metadata/

Puoi personalizzare attraverso il plugin sopra menzionato..

18 gen 2017 22:01:20