Agregue múltiples campos personalizados a la página de configuración general

22

Lo que me gustaría hacer es agregar algunos campos personalizados a la configuración general. Este es el código que estoy usando. Funciona bien, pero no puedo entender cómo agregar más campos.

Me gustaría crear dos campos por ahora, uno para el número de teléfono y el segundo para la dirección:

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

La única forma en que logré que funcionara para múltiples campos fue duplicar todo.

Entonces se vería así:

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

Pero probablemente esta no sea la mejor manera de hacerlo, intenté crear un settings_sectionpero simplemente no funcionó o no se guardó, etc. Es muy confuso.

Richard Mišenčík
fuente

Respuestas:

26

Bueno, el segundo bit de código es técnicamente la forma correcta de hacerlo. Sin embargo, al final del add_settings_field()puede pasar argumentos.

Consulte la referencia de función Add_Settings_Field de WordPress . Esto lo ayudará a comprender mejor cómo add_settings_field()funciona realmente la función.

Ahora, dicho esto, puede usar una función 'compartida' para su devolución de llamada. Tal como lo hago en mi página de opciones cuando desarrollo temas.

Aquí hay un ejemplo de cómo lo hago.

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

}

Tomará un poco de personalización para satisfacer sus necesidades, pero hacer una función compartida para sus devoluciones de llamada ahorrará mucho espacio en términos de código. Aparte de eso, lo estás haciendo correctamente como está.

--Editar--

Ok, así es como debería ser para usted ... solo modifique el código según sea necesario, escribí esto sobre la marcha ... Lo probé para verificar, y funcionó. Solo necesita modificar los add_settings_fieldajustes para satisfacer sus necesidades. Si necesita agregar más, simplemente copie y pegue uno y edítelo. Asegúrese de register_settingque no 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
fuente
Entonces, lo que no entiendo es el 4to y 5to parámetro en add_settings_field (). Sé que el primero es el ID, el segundo es el nombre, el tercero es la devolución de llamada para mostrarlo, pero ¿para qué son los siguientes? Tienes ch_essentials_front_page_option para ambos, solo tengo 'general' en el mismo lugar, el siguiente está vacío y el último ahora es la matriz de argumentos. Entonces, en la devolución de llamada, tiene get_option con ese valor, pero no sé qué poner allí en mi caso.
Richard Mišenčík
2
Se ha realizado la edición, eso debería ayudarlo al 100% Avíseme si tiene algún problema o pregunta. Lo comenté mucho.
MrJustin
@ MrJusting Muchas gracias. De hecho, lo hice funcionar mirando tu perfil y comprobando una pregunta que respondiste, "Implementing-tabs-on-custom-menu-page". Estaba muy bien comentado, así que comparé mi código y finalmente entendí cómo funciona. Para mí, los parámetros de página y sección eran confusos, aunque era como la sección de la página y no la sección de configuración. Así que ahora combiné ambos juntos y agregué otro valor a $ args, así que primero es la identificación del campo y el segundo es la descripción, y luego agregué otra línea a la función de devolución de llamada para hacer eco de la descripción con args [1] :)
Richard Mišenčík
Genial, me alegra que lo hayas resuelto, si tienes alguna pregunta, házmelo saber.
MrJustin
Creo que ahora intentaré crear una página de menú separada y agregar las opciones allí, porque en general y en la parte inferior está un poco perdida. Te diré cómo te fue
Richard Mišenčík
0

Mejor manera es usar un complemento de opciones de WordPress. Uno de los mejores son los campos personalizados avanzados.

http://www.advancedcustomfields.com/

Si compra un complemento de página de opciones, puede crear una página de opciones ilimitada con muchas características. Por favor, qué sale un video.

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

Complemento y complemento muy útil.

Foxsk8
fuente
3
Solo quiero agregar algunos campos, por lo que el complemento solo para esto sería una exageración para mí, pero gracias.
Richard Mišenčík
8
Sin mencionar que esto no resuelve lo que el OP quería, que era agregar campos a la Configuración general. AFAIK, ACF no le permite agregar campos a la Configuración general.
NW Tech