Dodaj wiele pól niestandardowych do strony ustawień ogólnych


22

Chciałbym dodać kilka niestandardowych pól do ustawień ogólnych. To jest kod, którego używam. Działa dobrze, ale nie mogę wymyślić, jak dodać więcej pól.

Na razie chciałbym utworzyć dwa pola, jedno dla numeru telefonu i drugie dla adresu:

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');

Jedynym sposobem, w jaki udało mi się go uruchomić dla wielu pól, było powielenie wszystkiego.

Więc wyglądałoby to tak:

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');

Ale prawdopodobnie nie jest to najlepszy sposób, aby to zrobić, próbowałem utworzyć, settings_sectionale po prostu nie działało lub nie zapisało itp. Jest po prostu bardzo mylące.

Odpowiedzi:


26

Cóż, drugi kawałek kodu jest technicznie poprawnym sposobem na zrobienie tego. Jednak na końcu add_settings_field()możesz przekazać argumenty.

Proszę zapoznać się z instrukcją funkcji WordPress Add_Settings_Field . Pomoże to w jak najlepszym zrozumieniu, jak add_settings_field()naprawdę działa ta funkcja.

Powiedziawszy to, możesz użyć funkcji współdzielonej do oddzwonienia. Tak jak robię to na stronie opcji podczas tworzenia motywów.

Oto przykład tego, jak to robię.

// 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>';

}

Dostosowanie do potrzeb zajmie trochę czasu, ale wykonanie wspólnej funkcji dla wywołań zwrotnych pozwoli zaoszczędzić dużo miejsca pod względem kodu. Poza tym robisz to poprawnie tak, jak jest.

--Edytować--

Ok, tak to powinno wyglądać dla ciebie .. po prostu zmodyfikuj kod w razie potrzeby, napisałem to w locie .. Testowałem go, aby sprawdzić i działało. Musisz tylko zmodyfikować add_settings_field(y) w celu dostosowania do swoich potrzeb. Jeśli chcesz dodać więcej, po prostu skopiuj, wklej i edytuj. Upewnij się, register_settingże nie będzie działać.

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 . '" />';
}

Nie rozumiem więc czwartego i piątego parametru w add_settings_field (). Wiem, że pierwszy to identyfikator, drugi to nazwa, trzeci to oddzwanianie, aby je wyświetlić, ale po co są następne? Dla obu z nich masz opcję ch_essentials_front_page_option, mam tylko „ogólne” w tym samym miejscu, następne jest puste, a ostatnie jest teraz tablicą args. Więc teraz w wywołaniu zwrotnym masz get_option z tą wartością, ale nie wiem, co tam umieścić w moim przypadku.
Richard Mišenčík

2
Dokonano edycji, która powinna sprawić, że będziesz w 100% gotowy. Daj mi znać, jeśli masz jakieś problemy lub pytania. Mocno to skomentowałem.
MrJustin

@MrJusting Bardzo dziękuję. Naprawdę działam, patrząc na twój profil i sprawdzając pytania, na które odpowiedziałeś „Implementing-tabs-on-custom-menu-page”. Został bardzo dobrze skomentowany, więc porównałem mój kod i wreszcie zrozumiałem, jak to działa. Dla mnie parametry strony i sekcji były mylące, myślałem, że to jak sekcja strony, a nie sekcja ustawień. Więc teraz połączyłem oba razem i dodałem kolejną wartość do $ args, więc najpierw jest identyfikator pola, a drugi to opis, a następnie dodałem kolejny wiersz do funkcji wywołania zwrotnego, aby powtórzyć opis args [1] :)
Richard Mišenčík

Świetnie, cieszę się, że to rozgryzłeś, jeśli masz jakieś pytania, daj mi znać.
MrJustin

Myślę, że źle spróbuję teraz utworzyć osobną stronę menu i dodać tam opcje, ponieważ ogólnie i na dole jest to rodzaj zagubionego. Dam ci znać, jak poszło
Richard Mišenčík

0

Lepszym sposobem jest użycie wtyczek opcji wordpress. Jednym z najlepszych są zaawansowane pola niestandardowe.

http://www.advancedcustomfields.com/

Jeśli kupisz dodatek do strony opcji, możesz utworzyć nieograniczoną stronę opcji z wieloma funkcjami. Proszę, co tam wideo.

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

Bardzo przydatna wtyczka i dodatek.


3
Chcę tylko dodać kilka pól, więc wtyczka tylko dla tego byłaby dla mnie przesadą, ale dziękuję.
Richard Mišenčík

8
Nie wspominając o tym, nie rozwiązuje to, czego chciał OP, czyli dodanie pól do Ustawień ogólnych. AFAIK, ACF nie pozwala na dołączanie pól do Ustawień ogólnych.
NW Tech
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.