Aggiungere campi personalizzati alla tassonomia durante la creazione di una nuova tassonomia
Modifica: Nota importante per WordPress v4.4 e versioni successive
Questa domanda utilizzava un ottimo workaround per la mancanza di meta dati reali dei termini nelle versioni precedenti di WordPress, ma dalla release di WordPress v4.4, sono stati introdotti i meta dati reali dei termini, e questo è decisamente l'approccio da seguire ora.
Ecco un articolo che sembra un buon punto di partenza per i meta dati dei termini in WordPress 4.4+
Lascio questa domanda perché potrebbe essere ancora utile per chi gestisce codice più vecchio, ma ho voluto aggiungere la nota sopra in modo che gli sviluppatori che iniziano nuove implementazioni di meta dati dei termini seguano la strada giusta.
Fine della modifica
Sono riuscito a sfruttare questo super tutorial di @Bainternet per aggiungere campi personalizzati alle tassonomie. Ho modificato il markup e aggiunto una callback separata per aggiungere campi alla pagina amministrativa "Aggiungi Nuova Categoria". Il mio codice è alla fine di questa domanda.
Ho però incontrato un problema; il campo personalizzato appare nella pagina di aggiunta nuova categoria, ma il campo non viene salvato.
Ho notato che la pagina di aggiunta nuova tassonomia usa ajax, e questo potrebbe essere parte del problema. Ho provato a disabilitare JS, ma ho ancora lo stesso problema. Ho cercato nel core alla ricerca di un hook, ma non riesco a trovarne uno. Ci sono vari tutorial in rete, ma sembrano tutti basarsi sulla schermata di modifica della tassonomia per funzionare.
Qualche idea su come farlo funzionare?
/**
* Funzioni di callback per aggiungere campi extra al form di modifica e aggiunta della tassonomia personalizzata
*/
// Pagina modifica tassonomia
function extra_edit_tax_fields($tag) {
// Controlla i meta della tassonomia esistenti per l'ID del termine
$t_id = $tag->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_Image_url"><?php _e( 'URL Immagine Navigazione Categoria' ); ?></label></th>
<td>
<input type="text" name="term_meta[img]" id="term_meta[img]" value="<?php echo esc_attr( $term_meta['img'] ) ? esc_attr( $term_meta['img'] ) : ''; ?>">
<p class="description"><?php _e( 'Inserisci l\'URL completo dell\'immagine di navigazione utilizzata per questa categoria.' ); ?></p>
</td>
</tr>
<?php
}
add_action( 'category_edit_form_fields', 'extra_edit_tax_fields', 10, 2 );
// Pagina aggiungi tassonomia
function extra_add_tax_fields( $tag ) {
// Controlla i meta della tassonomia esistenti per l'ID del termine
$t_id = $tag->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>
<div class="form-field">
<label for="cat_Image_url"><?php _e( 'URL Immagine Navigazione Categoria' ); ?></label>
<input type="text" name="term_meta[img]" id="term_meta[img]" value="<?php echo esc_attr( $term_meta['img'] ) ? esc_attr( $term_meta['img'] ) : ''; ?>">
<p class="description"><?php _e( 'Inserisci l\'URL completo dell\'immagine di navigazione utilizzata per questa categoria.' ); ?></p>
</div>
<?php
}
add_action( 'category_add_form_fields', 'extra_add_tax_fields', 10, 2 );
// Funzione di callback per salvare i campi extra della tassonomia
function save_extra_taxonomy_fields( $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_category', 'save_extra_taxonomy_fields', 10, 2 );
//add_action( '...Non riesco a trovare l'hook per abilitare il salvataggio dei campi personalizzati quando si aggiunge un nuovo termine

Risolto!
add_action( 'create_category', 'save_extra_taxonomy_fields', 10, 2 );
Grazie al plugin Category Meta. Ho scaricato vari plugin per i meta delle categorie dal repository di WordPress, e questo ha la capacità di aggiungere i meta dati nella schermata Aggiungi Nuovo. Ho esaminato il codice e ho trovato l'elusivo hook create_{term}.

Mi sono imbattuto nel tuo post nel tentativo di capire perché il mio codice non funziona come previsto - wordpress.stackexchange.com/questions/417562/…. Sto usando la maggior parte di quanto hai elencato, ma per qualche strana ragione, i meta dei termini non vengono salvati la prima volta, ma vengono salvati per ogni invio successivo. Apprezzerei se potessi indicarmi la direzione giusta.

Ciao @Motivated, il codice pubblicato qui è molto obsoleto e non dovrebbe più essere utilizzato. WP 4.4 ha introdotto la Term Meta API che dovrebbe essere usata invece. Ecco un articolo che spiega come può essere utilizzata: https://www.smashingmagazine.com/2015/12/how-to-use-term-meta-data-in-wordpress/

Penso che il tutorial a cui ti riferivi fosse ottimo e ho basato questo codice su di esso. Memorizza i meta per la tassonomia menu_category
nei moduli di aggiunta e modifica per quella tassonomia, e li visualizza nel modulo di modifica. La voce nella tabella delle opzioni sarebbe taxomomy_24_metas
per il termine con ID 24.
add_action('menu_category_edit_form_fields','menu_category_edit_form_fields');
add_action('menu_category_add_form_fields','menu_category_edit_form_fields');
add_action('edited_menu_category', 'menu_category_save_form_fields', 10, 2);
add_action('created_menu_category', 'menu_category_save_form_fields', 10, 2);
function menu_category_save_form_fields($term_id) {
$meta_name = 'order';
if ( isset( $_POST[$meta_name] ) ) {
$meta_value = $_POST[$meta_name];
// Questo è un array associativo con chiavi e valori:
// $term_metas = Array($meta_name => $meta_value, ...)
$term_metas = get_option("taxonomy_{$term_id}_metas");
if (!is_array($term_metas)) {
$term_metas = Array();
}
// Salva il valore meta
$term_metas[$meta_name] = $meta_value;
update_option( "taxonomy_{$term_id}_metas", $term_metas );
}
}
function menu_category_edit_form_fields ($term_obj) {
// Legge l'ordine dal database delle opzioni
$term_id = $term_obj->term_id;
$term_metas = get_option("taxonomy_{$term_id}_metas");
if ( isset($term_metas['order']) ) {
$order = $term_metas['order'];
} else {
$order = '0';
}
?>
<tr class="form-field">
<th valign="top" scope="row">
<label for="order"><?php _e('Ordine Categoria', ''); ?></label>
</th>
<td>
<input type="text" id="order" name="order" value="<?php echo $order; ?>"/>
</td>
</tr>
<?php
}

add_filter('created_term', 'aggiorna_campi_{custom_taxonomy}'); // puoi nominare la tua funzione di callback come preferisci
function aggiorna_campi_{custom_taxonomy}($term_id) {
if($_POST['taxonomy'] == '{custom_taxonomy}'): // un semplice controllo per verificare se è la tua tassonomia
//fai il tuo aggiornamento (preferisco nella tabella options, ma puoi farlo in qualsiasi modo tu preferisca)
endif;
}
se vuoi un hook più generico, puoi usare "created_term" (almeno dalla versione 3.4)

Puoi optare per il plugin Taxonomy Manager. Puoi aggiungere una nuova tassonomia e anche campi personalizzati alla tassonomia scelta (ad esempio un campo immagine).
