Adăugați câmpuri personalizate multiple în pagina de setări generale

9 ian. 2014, 23:18:46
Vizualizări: 59.1K
Voturi: 32

Ceea ce doresc să fac este să adaug câteva câmpuri personalizate la setările generale. Acesta este codul pe care îl folosesc. Funcționează bine, dar nu-mi dau seama cum să adaug mai multe câmpuri.

Aș dori să creez două câmpuri deocamdată, unul pentru numărul de telefon și al doilea pentru adresă:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('Câmpul Meu' , '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');

Singura modalitate prin care am reușit să îl fac să funcționeze pentru câmpuri multiple a fost să duplic totul.

Așa că arată în felul următor:

function register_fields()
{
    register_setting('general', 'my_first_field', 'esc_attr');
    add_settings_field('my_first_field', '<label for="my_first_field">'.__('Câmpul Meu' , '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">'.__('Câmpul Meu' , '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');

Dar aceasta probabil nu este cea mai bună modalitate de a o face, am încercat să creez un settings_section dar pur și simplu nu a funcționat sau nu s-a salvat etc. Este foarte confuz.

0
Toate răspunsurile la întrebare 2
9
46

A doua bucată de cod este tehnic modul corect de a face acest lucru. Cu toate acestea, la sfârșitul funcției add_settings_field() puteți pasa argumente.

Vă rugăm să consultați referința funcției WordPress Add_Settings_Field. Acest lucru vă va ajuta să înțelegeți mai bine cum funcționează cu adevărat funcția add_settings_field().

Acum, având în vedere acest lucru, ați putea folosi o funcție 'partajată' pentru callback-ul dvs. Așa procedez și eu în pagina de opțiuni atunci când dezvolt teme.

Iată un exemplu despre cum procedez.

// Câmpurile mele exemplu
add_settings_field(  
    'tutorial_display_count',                      
    'Număr afișare tutoriale',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'tutorial_display_count' // $args pentru callback
    ) 
);
add_settings_field(  
    'blog_display_count',                      
    'Număr afișare articole',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'blog_display_count'  // $args pentru callback
    ) 
);

// Callback-ul partajat
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] . ''] . '">';
 
}

Va trebui să faceți puțină personalizare pentru a se potrivi nevoilor dumneavoastră, dar utilizarea unei funcții partajate pentru callback-uri vă va economisi mult spațiu în ceea ce privește codul. În afară de asta, procedați corect așa cum faceți acum.

--Editare--

Ok, iată cum ar trebui să arate pentru dumneavoastră... doar modificați codul după cum este necesar, l-am scris pe loc... l-am testat pentru a verifica și a funcționat. Trebuie doar să modificați add_settings_field(s) pentru a se potrivi nevoilor dumneavoastră. Dacă trebuie să adăugați mai multe, doar copiați și lipiți unul și editați-l. Asigurați-vă că utilizați register_setting altfel nu va funcționa.

add_action('admin_init', 'my_general_section');  
function my_general_section() {  
    add_settings_section(  
        'my_settings_section', // ID-ul secțiunii 
        'Titlul opțiunilor mele', // Titlul secțiunii
        'my_section_options_callback', // Callback
        'general' // Pe ce pagină? Acest lucru face ca secțiunea să apară pe pagina de Setări Generale
    );
    
    add_settings_field( // Opțiunea 1
        'option_1', // ID-ul opțiunii
        'Opțiunea 1', // Etichetă
        'my_textbox_callback', // !important - Aici merg argumentele!
        'general', // Pagina pe care va fi afișată (Setări Generale)
        'my_settings_section', // Numele secțiunii noastre
        array( // Argumentele $args
            'option_1' // Ar trebui să se potrivească cu ID-ul opțiunii
        )  
    ); 
    
    add_settings_field( // Opțiunea 2
        'option_2', // ID-ul opțiunii
        'Opțiunea 2', // Etichetă
        'my_textbox_callback', // !important - Aici merg argumentele!
        'general', // Pagina pe care va fi afișată
        'my_settings_section', // Numele secțiunii noastre (Setări Generale)
        array( // Argumentele $args
            'option_2' // Ar trebui să se potrivească cu ID-ul opțiunii
        )  
    ); 
    
    register_setting('general','option_1', 'esc_attr');
    register_setting('general','option_2', 'esc_attr');
}

function my_section_options_callback() { // Callback-ul secțiunii
    echo '<p>Un mic mesaj despre editarea informațiilor</p>';  
}

function my_textbox_callback($args) {  // Callback-ul casetei de text
    $option = get_option($args[0]);
    echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}
10 ian. 2014 02:11:21
Comentarii

Deci ceea ce nu înțeleg sunt parametrii 4 și 5 din add_settings_field(). Știu că primul este ID-ul, al doilea este numele, al treilea este callback-ul pentru afișare, dar pentru ce sunt următorii?

Tu ai ch_essentials_front_page_option pentru amândoi, eu am doar 'general' în același loc, următorul este gol și ultimul este acum array-ul args.

Deci acum în callback ai get_option cu acea valoare, dar nu știu ce să pun acolo în cazul meu.

Richard Mišenčík Richard Mišenčík
10 ian. 2014 13:30:18

Am făcut o modificare, asta ar trebui să te pună pe drumul cel bun 100%. Spune-mi dacă ai probleme sau întrebări. Am comentat destul de mult codul.

MrJustin MrJustin
11 ian. 2014 02:31:26

@MrJusting Mulțumesc mult. De fapt am reușit să îl fac să funcționeze uitându-mă la profilul tău și verificând o întrebare la care ai răspuns, "Implementing-tabs-on-custom-menu-page". Era foarte bine comentat, așa că am comparat codul meu și în sfârșit am înțeles cum funcționează. Pentru mine parametrii page și section erau confuzi, credeam că e vorba de secțiunea paginii și nu de secțiunea de setări. Acum i-am combinat pe amândouă și am adăugat o altă valoare la $args, prima este id-ul câmpului și a doua este descrierea, apoi am adăugat o altă linie la funcția callback pentru a afișa descrierea cu args[1] :)

Richard Mišenčík Richard Mišenčík
12 ian. 2014 23:04:32

Super, mă bucur că ai reușit să rezolvi. Dacă mai ai întrebări, spune-mi.

MrJustin MrJustin
13 ian. 2014 17:38:52

Cred că voi încerca acum să creez o pagină de meniu separată și să adaug opțiunile acolo, pentru că în general și la fund este cam pierdut. O să te anunț cum a mers.

Richard Mišenčík Richard Mišenčík
13 ian. 2014 18:20:45

Codul din acesta este în regulă? http://wordpress.stackexchange.com/questions/127493/wordpress-settings-api-implementing-tabs-on-custom-menu-page

Richard Mišenčík Richard Mišenčík
13 ian. 2014 18:26:29

Mulțumesc @MrJustin. Doar o observație, pentru ceva ce nu am văzut în răspuns...pentru a afișa opțiunea în tema ta, folosește funcția get_option(). Exemplu: <?php echo get_option('option_1') ;?>

NW Tech NW Tech
14 ian. 2014 20:54:23

A funcționat perfect pentru mine.

Jake Jake
13 ian. 2016 01:14:35

Asta este. Cel mai bun răspuns de pe internet! Am căutat ore întregi o soluție. Doar pentru a sublinia pentru toți cei care citesc acest articol, folosiți comentariul editat și adăugați orice aveți nevoie!

Mo Alsaedi Mo Alsaedi
23 sept. 2016 19:54:11
Arată celelalte 4 comentarii
2
-2

O metodă mai bună este utilizarea unui plugin pentru opțiuni în WordPress. Unul dintre cele mai bune este Advanced Custom Fields.

http://www.advancedcustomfields.com/

Dacă achiziționezi un addon pentru pagini de opțiuni, poți crea un număr nelimitat de pagini de opțiuni cu multe funcționalități. Te rugăm să urmărești un videoclip.

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

Plugin și addon foarte utile.

10 ian. 2014 01:56:11
Comentarii

Vreau doar să adaug câteva câmpuri, așa că un plugin doar pentru asta ar fi exagerat pentru mine, dar mulțumesc.

Richard Mišenčík Richard Mišenčík
10 ian. 2014 13:28:25

Ca să nu mai menționăm că aceasta nu rezolvă ceea ce dorea OP, adică să adauge câmpuri în Setările Generale. Din câte știu, ACF nu îți permite să adaugi câmpuri în Setările Generale.

NW Tech NW Tech
14 ian. 2014 20:30:27