Aggiungere più campi personalizzati alla pagina delle impostazioni generali
Quello che vorrei fare è aggiungere alcuni campi personalizzati alle impostazioni generali. Questo è il codice che sto utilizzando. Funziona bene ma non riesco a capire come aggiungere più campi.
Vorrei creare due campi per ora, uno per il numero di telefono e il secondo per l'indirizzo:
function register_fields()
{
register_setting('general', 'my_first_field', 'esc_attr');
add_settings_field('my_first_field', '<label for="my_first_field">'.__('Il Mio Campo' , 'my_first_field' ).'</label>' , 'print_custom_field', 'general');
}
function print_custom_field()
{
$value = get_option( 'my_first_field', '' );
echo '<input type="text" id="my_first_field" name="my_first_field" value="' . $value . '" />';
}
add_filter('admin_init', 'register_fields');
L'unico modo in cui sono riuscito a farlo funzionare per più campi è stato duplicare tutto.
Quindi apparirebbe così:
function register_fields()
{
register_setting('general', 'my_first_field', 'esc_attr');
add_settings_field('my_first_field', '<label for="my_first_field">'.__('Il Mio Campo' , 'my_first_field' ).'</label>' , 'print_first_field', 'general');
register_setting('general', 'my_second_field', 'esc_attr');
add_settings_field('my_second_field', '<label for="my_second_field">'.__('Il Mio Campo' , 'my_second_field' ).'</label>' , 'print_second_field', 'general');
}
function print_first_field()
{
$value = get_option( 'my_first_field', '' );
echo '<input type="text" id="my_first_field" name="my_first_field" value="' . $value . '" />';
}
function print_second_field()
{
$value = get_option( 'my_second_field', '' );
echo '<input type="text" id="my_second_field" name="my_second_field" value="' . $value . '" />';
}
add_filter('admin_init', 'register_fields');
Ma questo probabilmente non è il modo migliore per farlo, ho provato a creare una settings_section
ma semplicemente non funzionava o non salvava ecc. È molto confuso.

Bene, il secondo frammento di codice è tecnicamente il modo corretto per farlo. Tuttavia, alla fine della funzione add_settings_field()
puoi passare degli argomenti.
Consulta il riferimento alla funzione WordPress Add_Settings_Field. Questo ti aiuterà a comprendere meglio come funziona realmente la funzione add_settings_field()
.
Detto questo, potresti utilizzare una funzione 'condivisa' per il tuo callback. Come faccio io nella pagina delle opzioni quando sviluppo temi.
Ecco un esempio di come lo faccio.
// I miei campi di esempio
add_settings_field(
'tutorial_display_count',
'Conteggio Visualizzazione Tutorial',
'ch_essentials_textbox_callback',
'ch_essentials_front_page_option',
'ch_essentials_front_page',
array(
'tutorial_display_count' // $args per il callback
)
);
add_settings_field(
'blog_display_count',
'Conteggio Visualizzazione Blog',
'ch_essentials_textbox_callback',
'ch_essentials_front_page_option',
'ch_essentials_front_page',
array(
'blog_display_count' // $args per il callback
)
);
// Il mio Callback Condiviso
function ch_essentials_textbox_callback($args) {
$options = get_option('ch_essentials_front_page_option');
echo '<input type="text" id="' . $args[0] . '" name="ch_essentials_front_page_option[' . $args[0] . ']" value="' . $options['' . $args[0] . ''] . '">';
}
Richiederà un po' di personalizzazione per adattarsi alle tue esigenze, ma utilizzare una funzione condivisa per i callback ti farà risparmiare molto spazio in termini di codice. A parte questo, lo stai facendo correttamente così come è.
--Modifica--
Ok, ecco come dovrebbe essere per te... basta modificare il codice come necessario, l'ho scritto al volo... l'ho testato per verificare e funziona. Devi solo modificare le add_settings_field
per adattarle alle tue esigenze. Se hai bisogno di aggiungerne altre, basta copiare e incollarne una e modificarla. Assicurati di usare register_setting
altrimenti non funzionerà.
add_action('admin_init', 'my_general_section');
function my_general_section() {
add_settings_section(
'my_settings_section', // ID Sezione
'Titolo delle mie Opzioni', // Titolo Sezione
'my_section_options_callback', // Callback
'general' // Su quale Pagina? Fa apparire la sezione nella pagina delle Impostazioni Generali
);
add_settings_field( // Opzione 1
'option_1', // ID Opzione
'Opzione 1', // Etichetta
'my_textbox_callback', // !importante - Qui vanno gli args!
'general', // Pagina in cui verrà visualizzata (Impostazioni Generali)
'my_settings_section', // Nome della nostra sezione
array( // Gli $args
'option_1' // Deve corrispondere all'ID Opzione
)
);
add_settings_field( // Opzione 2
'option_2', // ID Opzione
'Opzione 2', // Etichetta
'my_textbox_callback', // !importante - Qui vanno gli args!
'general', // Pagina in cui verrà visualizzata
'my_settings_section', // Nome della nostra sezione (Impostazioni Generali)
array( // Gli $args
'option_2' // Deve corrispondere all'ID Opzione
)
);
register_setting('general','option_1', 'esc_attr');
register_setting('general','option_2', 'esc_attr');
}
function my_section_options_callback() { // Callback Sezione
echo '<p>Un piccolo messaggio sulla modifica delle informazioni</p>';
}
function my_textbox_callback($args) { // Callback Textbox
$option = get_option($args[0]);
echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}

Quindi quello che non capisco sono il 4° e 5° parametro in add_settings_field(). So che il primo è l'ID, il secondo è il nome, il terzo è il callback per visualizzarlo, ma a cosa servono i successivi?
Tu hai ch_essentials_front_page_option per entrambi, io ho solo 'general' nello stesso posto, il prossimo è vuoto e l'ultimo è ora l'array args.
Quindi ora nel callback hai get_option con quel valore, ma non so cosa metterci nel mio caso.

Ho fatto una modifica, ora dovresti essere al 100% operativo. Fammi sapere se hai problemi o domande. L'ho commentato abbondantemente.

@MrJusting Grazie mille. In realtà sono riuscito a farlo funzionare guardando il tuo profilo e controllando una domanda a cui avevi risposto, "Implementing-tabs-on-custom-menu-page". Era molto ben commentata, quindi ho confrontato il mio codice e alla fine ho capito come funziona. Per me i parametri page e section erano confusi, pensavo fosse come una sezione della pagina e non la sezione delle impostazioni. Quindi ora li ho combinati insieme e ho aggiunto un altro valore a $args, quindi il primo è l'ID del campo e il secondo è la descrizione, e poi ho aggiunto un'altra riga alla funzione callback per visualizzare la descrizione con args[1] :)

Ottimo, sono contento che tu abbia risolto. Se hai domande fammelo sapere.

Penso che proverò ora a creare una pagina di menu separata e aggiungere le opzioni lì, perché in generale e in fondo si perde un po'. Ti farò sapere come è andata.

Il codice in questo è ok? http://wordpress.stackexchange.com/questions/127493/wordpress-settings-api-implementing-tabs-on-custom-menu-page

Grazie @MrJustin. Solo un appunto, su qualcosa che non ho visto nella risposta...per visualizzare l'opzione nel tuo tema, usa semplicemente la funzione get_option()
. Esempio: <?php echo get_option('option_1') ;?>

Un modo migliore è utilizzare un plugin per le opzioni di WordPress. Uno dei migliori è Advanced Custom Fields.
http://www.advancedcustomfields.com/
Se acquisti l'addon per la pagina delle opzioni, potrai creare una pagina di opzioni illimitata con molte funzionalità. Guarda questo video.
http://www.advancedcustomfields.com/add-ons/options-page/
Plugin e addon molto utili.

Voglio solo aggiungere qualche campo, quindi un plugin apposito sarebbe eccessivo per me, ma grazie.
