Adicione vários campos personalizados à página de configurações gerais

22

O que eu gostaria de fazer é adicionar alguns campos personalizados às configurações gerais. Este é o código que estou usando. Funciona bem, mas não consigo descobrir como adicionar mais campos.

Gostaria de criar dois campos por enquanto, um para o número de telefone e o segundo para o endereço:

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

A única maneira de conseguir fazê-lo funcionar em vários campos era duplicar tudo.

Então, ficaria assim:

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

Mas esta provavelmente não é a melhor maneira de fazê-lo, tentei criar um settings_sectionmas simplesmente não funcionou ou não salvou etc. É apenas muito confuso.

Richard Mišenčík
fonte

Respostas:

26

Bem, o segundo bit de código é tecnicamente a maneira correta de fazer isso. No entanto, no final do processo, add_settings_field()você pode passar por discussões.

Por favor, veja a referência da função Add_Settings_Field do WordPress . Isso ajudará você a entender melhor como a add_settings_field()função realmente funciona.

Agora, com isso dito, você pode usar uma função 'compartilhada' para seu retorno de chamada. Como na página de opções, quando desenvolvo temas.

Aqui está um exemplo de como eu faço isso.

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

}

Demorará um pouco de personalização para atender às suas necessidades, mas a realização de uma função compartilhada para seus retornos de chamada economizará muito espaço em termos de código. Fora isso, você está fazendo corretamente como está.

--Editar--

Ok, é assim que deve ser para você .. apenas modifique o código conforme necessário, eu escrevi isso rapidamente ... Eu testei para verificar e funcionou. Você só precisa modificar o add_settings_field(s) para atender às suas necessidades. Se você precisar adicionar mais, basta copiar e colar um e editá-lo. Certifique-se de register_settingque não funcionará.

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 . '" />';
}
MrJustin
fonte
Então, o que eu não entendo é o 4º e 5º parâmetro no add_settings_field (). Eu sei que o primeiro é o ID, o segundo é o nome, o terceiro é o retorno de chamada para exibi-lo, mas quais são os próximos? Você tem ch_essentials_front_page_option para os dois, eu apenas 'general' no mesmo local, o próximo está vazio e o último agora é o array args. Agora, no retorno de chamada, você tem a opção get_option com esse valor, mas não sei o que colocar lá no meu caso.
Richard Mišenčík
2
Foi feita uma edição, que deve levá-lo a 100%. Entre em contato se tiver algum problema ou dúvida. Eu comentei pesadamente.
precisa saber é o seguinte
@ MrJusting Muito obrigado. Na verdade, consegui trabalhar olhando seu perfil e verificando uma pergunta que você respondeu: "Implementando guias na página de menu personalizada". Foi muito bem comentado, então comparei meu código e finalmente entendi como ele funciona. Para mim, os parâmetros de página e seção eram confusos, embora eu fosse como a seção da página e não a seção de configurações. Então agora eu combinei os dois e adicionei outro valor a $ args, então primeiro é o ID do campo e o segundo é a descrição, e depois adicionei outra linha à função de retorno de chamada para ecoar a descrição com args [1] :)
Richard Mišenčík
Ótimo, estou feliz que você tenha descoberto, se tiver alguma dúvida, me avise.
precisa saber é o seguinte
Eu acho que vou tentar agora criar uma página de menu separada e adicionar as opções lá, porque em geral e na parte inferior seu tipo de perda. Vou deixar que você sabe como foi isso
Richard Mišenčík
0

Melhor maneira é usar um plugins de opções wordpress. Um dos melhores é campos personalizados avançados.

http://www.advancedcustomfields.com/

Se você comprar um complemento da página de opções, poderá criar uma página de opções ilimitada com muitos recursos. Por favor, que tal um vídeo.

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

Plugin e addon muito úteis.

Foxsk8
fonte
3
Eu só quero adicionar alguns campos, então o plugin apenas para isso seria um exagero para mim, mas obrigado.
Richard Mišenčík
8
Sem mencionar que isso não resolve o que o OP queria, que era adicionar campos às Configurações Gerais. AFAIK, ACF não permite que você adicione campos às Configurações Gerais.
NW Tech