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

9 ene 2014, 23:18:46
Vistas: 59.1K
Votos: 32

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 logro descubrir 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">'.__('Mi Campo' , '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 duplicando 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">'.__('Mi Campo' , '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">'.__('Mi Campo' , '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_section pero simplemente no funcionó o no guardaba, etc. Es muy confuso.

0
Todas las respuestas a la pregunta 2
9
46

Bueno, el segundo fragmento de código es técnicamente la forma correcta de hacerlo. Sin embargo, al final de la función add_settings_field() puedes pasar argumentos.

Por favor, revisa la referencia de la función Add_Settings_Field de WordPress. Esto te ayudará a entender mejor cómo funciona realmente la función add_settings_field().

Dicho esto, podrías usar una función 'compartida' para tu callback. Como hago yo en mi página de opciones cuando desarrollo temas.

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

// Mis campos de ejemplo
add_settings_field(  
    'tutorial_display_count',                      
    'Cantidad de tutoriales a mostrar',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'tutorial_display_count' // $args para el callback
    ) 
);
add_settings_field(  
    'blog_display_count',                      
    'Cantidad de entradas de blog a mostrar',               
    'ch_essentials_textbox_callback',   
    'ch_essentials_front_page_option',                     
    'ch_essentials_front_page',
    array(
        'blog_display_count'  // $args para el callback
    ) 
);

// Mi función callback compartida
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] . ''] . '">';
 
}

Necesitarás personalizarlo un poco para adaptarlo a tus necesidades, pero usar una función compartida para tus callbacks te ahorrará mucho espacio en términos de código. Aparte de eso, lo estás haciendo correctamente tal como está.

--Edición--

Ok, así es como debería ser para ti... solo modifica el código según sea necesario, lo escribí sobre la marcha... Lo probé para verificar y funcionó. Solo necesitas modificar los add_settings_field(s) para adaptarlos a tus necesidades. Si necesitas agregar más, simplemente copia y pega uno y edítalo. Asegúrate de usar register_setting o no funcionará.

add_action('admin_init', 'my_general_section');  
function my_general_section() {  
    add_settings_section(  
        'my_settings_section', // ID de la sección 
        'Título de Mis Opciones', // Título de la sección
        'my_section_options_callback', // Callback
        'general' // ¿En qué página? Esto hace que la sección aparezca en la página de Configuración General
    );
    
    add_settings_field( // Opción 1
        'option_1', // ID de la opción
        'Opción 1', // Etiqueta
        'my_textbox_callback', // ¡importante! - Aquí es donde van los args
        'general', // Página donde se mostrará (Configuración General)
        'my_settings_section', // Nombre de nuestra sección
        array( // Los $args
            'option_1' // Debe coincidir con el ID de la opción
        )  
    ); 
    
    add_settings_field( // Opción 2
        'option_2', // ID de la opción
        'Opción 2', // Etiqueta
        'my_textbox_callback', // ¡importante! - Aquí es donde van los args
        'general', // Página donde se mostrará
        'my_settings_section', // Nombre de nuestra sección (Configuración General)
        array( // Los $args
            'option_2' // Debe coincidir con el ID de la opción
        )  
    ); 
    
    register_setting('general','option_1', 'esc_attr');
    register_setting('general','option_2', 'esc_attr');
}

function my_section_options_callback() { // Callback de la sección
    echo '<p>Un pequeño mensaje sobre la edición de información</p>';  
}

function my_textbox_callback($args) {  // Callback del cuadro de texto
    $option = get_option($args[0]);
    echo '<input type="text" id="'. $args[0] .'" name="'. $args[0] .'" value="' . $option . '" />';
}
10 ene 2014 02:11:21
Comentarios

Lo que no entiendo son el cuarto y quinto parámetro en add_settings_field(). Sé que el primero es el ID, el segundo es el nombre, el tercero es el callback para mostrarlo, pero ¿para qué sirven los siguientes?

Tienes ch_essentials_front_page_option para ambos, yo tengo solo 'general' en el mismo lugar, el siguiente está vacío y el último ahora es el array args.

Entonces en el callback usas get_option con ese valor, pero no sé qué poner ahí en mi caso.

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

Se hizo una edición, eso debería hacer que funcione al 100%. Avísame si tienes algún problema o pregunta. Lo comenté bastante.

MrJustin MrJustin
11 ene 2014 02:31:26

@MrJusting Muchas gracias. En realidad lo conseguí funcionar mirando tu perfil y revisando una pregunta que respondiste, "Implementing-tabs-on-custom-menu-page". Estaba muy bien comentada, 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, pensé que era como una sección de la página y no la sección de ajustes. Así que ahora combiné ambos y añadí otro valor a $args, el primero es el ID del campo y el segundo la descripción, y luego añadí otra línea a la función callback para mostrar la descripción con args[1] :)

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

Genial, me alegro de que lo hayas resuelto, si tienes alguna pregunta házmelo saber.

MrJustin MrJustin
13 ene 2014 17:38:52

Creo que ahora intentaré crear una página de menú separada y añadir las opciones allí, porque en general y al final queda un poco perdido. Te avisaré cómo me fue

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

Gracias @MrJustin. Solo un punto a tener en cuenta, sobre algo que no vi en la respuesta... para mostrar la opción en tu tema, simplemente usa la función get_option(). Ejemplo: <?php echo get_option('option_1') ;?>

NW Tech NW Tech
14 ene 2014 20:54:23

Esto funcionó perfectamente para mí.

Jake Jake
13 ene 2016 01:14:35

¡Esto es! ¡La mejor respuesta en internet! Busqué durante muchas horas una solución. Solo para señalar a todos los que lean este artículo, usa el comentario editado y agrega lo que necesites.

Mo Alsaedi Mo Alsaedi
23 sept 2016 19:54:11
Mostrar los 4 comentarios restantes
2
-2

Una mejor manera es usar un plugin de opciones para WordPress. Uno de los mejores es Advanced Custom Fields.

http://www.advancedcustomfields.com/

Si compras el complemento de página de opciones, entonces puedes crear páginas de opciones ilimitadas con muchas características. Por favor, mira este video.

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

Plugin y complemento muy útiles.

10 ene 2014 01:56:11
Comentarios

Solo quiero agregar algunos campos, así que un plugin solo para esto sería excesivo para mí, pero gracias.

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

Sin mencionar que esto no resuelve lo que el OP quería, que era agregar campos a la Configuración General. Que yo sepa, ACF no te permite añadir campos a la Configuración General.

NW Tech NW Tech
14 ene 2014 20:30:27