Aggiungi più campi personalizzati alla pagina delle impostazioni generali


22

Quello che vorrei fare è aggiungere alcuni campi personalizzati alle impostazioni generali. Questo è il codice che sto usando. Funziona bene ma non riesco proprio a capire come aggiungere altri 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">'.__('My Field' , '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 sembrerebbe così:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('My Field' , '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">'.__('My Field' , '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 crearne uno settings_sectionma non ha funzionato o non ha salvato ecc. È solo molto confuso.

Risposte:


26

Bene, il secondo bit di codice è tecnicamente il modo corretto per farlo. Tuttavia, alla fine add_settings_field()è possibile passare argomenti.

Si prega di visualizzare il riferimento della funzione Add_Settings_Field di WordPress . Questo ti aiuterà a ottenere la migliore comprensione di come add_settings_field()funziona davvero la funzione.

Ora, detto ciò, è possibile utilizzare una funzione "condivisa" per il callback. Come faccio nella mia pagina delle opzioni quando sviluppo temi.

Ecco un esempio di come lo faccio.

// My Example Fields
add_settings_field(  
    'tutorial_display_count',                      
    'Tutorial Display Count',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'tutorial_display_count' // $args for callback
    ) 
);
add_settings_field(  
    'blog_display_count',                      
    'Blog Display Count',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'blog_display_count'  // $args for callback
    ) 
);

// My Shared Callback
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] . ''] . '"></input>';

}

Ci vorrà un po 'di personalizzazione per adattarsi alle tue esigenze, ma fare una funzione condivisa per i tuoi callback farà risparmiare molto spazio in termini di codice. A parte questo, lo stai facendo correttamente così com'è.

--Modificare--

Ok, questo è come dovrebbe essere per te .. basta modificare il codice secondo necessità, l'ho scritto al volo .. L'ho provato per verificare, e ha funzionato. Hai solo bisogno di modificare il add_settings_field(i) in base alle proprie esigenze. Se è necessario aggiungerne altri, basta copiarne uno e incollarlo e modificarlo. Assicurati di register_settingo non funzionerà.

add_action('admin_init', 'my_general_section');  
function my_general_section() {  
    add_settings_section(  
        'my_settings_section', // Section ID 
        'My Options Title', // Section Title
        'my_section_options_callback', // Callback
        'general' // What Page?  This makes the section show up on the General Settings Page
    );

    add_settings_field( // Option 1
        'option_1', // Option ID
        'Option 1', // Label
        'my_textbox_callback', // !important - This is where the args go!
        'general', // Page it will be displayed (General Settings)
        'my_settings_section', // Name of our section
        array( // The $args
            'option_1' // Should match Option ID
        )  
    ); 

    add_settings_field( // Option 2
        'option_2', // Option ID
        'Option 2', // Label
        'my_textbox_callback', // !important - This is where the args go!
        'general', // Page it will be displayed
        'my_settings_section', // Name of our section (General Settings)
        array( // The $args
            'option_2' // Should match Option ID
        )  
    ); 

    register_setting('general','option_1', 'esc_attr');
    register_setting('general','option_2', 'esc_attr');
}

function my_section_options_callback() { // Section Callback
    echo '<p>A little message on editing info</p>';  
}

function my_textbox_callback($args) {  // Textbox Callback
    $option = get_option($args[0]);
    echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}

Quindi quello che non capisco è il quarto e il quinto 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 prossimi? Hai ch_essentials_front_page_option per entrambi, 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 mettere lì nel mio caso.
Richard Mišenčík,

2
La modifica è stata fatta, questo dovrebbe farti andare al 100%. Fammi sapere se hai problemi o domande. L'ho commentato pesantemente.
MrJustin

@MrJusting Grazie mille. In realtà ho funzionato guardando il tuo profilo e controllando un questioin a cui hai risposto, "Implementare-tab-su-menu-personalizzato-pagina". È stato molto ben commentato, quindi ho confrontato il mio codice e finalmente ho capito come funziona. Per me i parametri della pagina e della sezione erano confusi, anche se era come la sezione della pagina e non la sezione delle impostazioni. Quindi ora ho combinato entrambi insieme e ho aggiunto un altro valore a $ args, quindi prima è l'id del campo e il secondo è la descrizione, quindi ho aggiunto un'altra riga alla funzione di callback per fare eco alla descrizione con args [1] :)
Richard Mišenčík

Fantastico, sono contento che tu l'abbia capito, se hai qualche domanda fammi sapere.
MrJustin,

Penso che ora proverò a creare una pagina di menu separata e aggiungere le opzioni lì, perché in generale e in fondo il suo tipo di perso. Ti farò sapere come è andata
Richard Mišenčík il

0

Il modo migliore è utilizzare un plugin di opzioni wordpress. Uno dei migliori è Advanced Custom Fields.

http://www.advancedcustomfields.com/

Se acquisti un componente aggiuntivo per la pagina delle opzioni, puoi creare una pagina delle opzioni illimitata con molte funzionalità. Per favore, cosa esce un video.

http://www.advancedcustomfields.com/add-ons/options-page/

Plugin e addon molto utili.


3
Voglio solo aggiungere alcuni campi, quindi il plugin solo per questo sarebbe eccessivo per me, ma grazie.
Richard Mišenčík,

8
Per non parlare di ciò, ciò non risolve ciò che l'OP voleva, ovvero aggiungere campi alle Impostazioni generali. AFAIK, ACF non consente di aggiungere campi alle Impostazioni generali.
NW Tech
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.