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.