Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/04/2013, 08:46
Avatar de rogertm
rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 8 meses
Puntos: 638
Respuesta: Sobre la setting API de wordpress

Tal vez la Setting API no sea la manera más sencilla, pero si es la mejor, y cuando le coges la vuelta, te darás cuenta que no es complicado, de hecho te simplifica muchas cosas. Así que mi recomendación es usar esta API para este tipo de cosas.

En cuanto a la manera de implementar el código, pues eso depende mucho de tus conocimientos, que crecerán a medida que trabajes en ello, y las necesidades que tengas. Trataré aquí de mostrarte algo basándome en un proyecto en el que uso esta API.

Estoy creando un theme/framework donde tengo varias opciones, Generales, Cabecera, Layout, Social Networks Links, etc... Te mostraré a modo ejemplo cómo hago para las opciones de la cabecera, que son tres:

1. No mostrar imagen de cabecera
2. Mostrar imagen de cabecera
2.1. Mostrar o no imagen destacada en single.php si existe
3. Mostrar un slider con noticias de una categoría determinada
3.n El slider tiene varias opciones, como alinear el thumbnail (izq o der), tamaño del thumbnail, etc...

Entonces lo hago mediante arrays, para la opción 1. es simple, pero para las otras dos, que tienen sub-opciones lo que hago es llamar, en uno de los elementos del array, una función aparte. Vemos algo de código para entrar en materia;

Primero registramos las opciones:
Código PHP:
Ver original
  1. /**
  2.  * Register setting options
  3.  */
  4. add_action( 'admin_init', 't_em_register_setting_options_init' );
  5. function t_em_register_setting_options_init(){
  6.     // Based on Twentyeleven WordPress Theme
  7.     register_setting( 't_em_options', 't_em_theme_options', 't_em_theme_options_validate' );
  8.  
  9.     // Register our settings field group
  10.     add_settings_section( 'general', '', '__return_false', 'theme-options' );
  11.  
  12.     // Register our individual settings fields
  13.     add_settings_field( 't_em_general_set',    __( 'General Options', 't_em' ),        't_em_settings_field_general_options_set',    'theme-options',    'general' );
  14.     add_settings_field( 't_em_header_set',    __( 'Header Options', 't_em' ),            't_em_settings_field_header_set',            'theme-options',    'general' );
  15.     /** otras opciones */
  16. }

Luego la función:
Código PHP:
Ver original
  1. /**
  2.  * Return an array of header options for Twenty'em
  3.  */
  4. function t_em_header_options(){
  5.     $header_options = array (
  6.         'no-header-image' => array (
  7.             'value' => 'no-header-image',
  8.             'label' => __( 'No header image', 't_em' ),
  9.             'extend' => '',
  10.         ),
  11.         'header-image' => array (
  12.             'value' => 'header-image',
  13.             'label' => __( 'Header image', 't_em' ),
  14.             'extend' => t_em_header_image_callback(),
  15.         ),
  16.         'slider' => array (
  17.             'value' => 'slider',
  18.             'label' => __( 'Slider', 't_em' ),
  19.             'extend' => t_em_slider_callback(),
  20.         ),
  21.     );
  22.  
  23.     return apply_filters( 't_em_header_options', $header_options );
  24. }

Seguimos con las funciones tipo callback, en este caso las de la imagen de cabecera y el slider:
Código PHP:
Ver original
  1. /**
  2.  * Extend setting for header image option
  3.  */
  4. function t_em_header_image_callback(){
  5.     /** Tu código aquí... */
  6. }
  7.  
  8. /**
  9.  * Extend setting for slider option
  10.  */
  11. function t_em_slider_callback(){
  12.     /** Tu código aquí... */
  13. }

Al final muestro el formulario:
Código PHP:
Ver original
  1. /**
  2.  * Render the Header setting field
  3.  */
  4. function t_em_settings_field_header_set(){
  5.     global $t_em_theme_options;
  6. ?>
  7.     <div id="header-options">
  8. <?php
  9.     foreach ( t_em_header_options() as $header ) :
  10. ?>
  11.         <div class="layout radio-option header">
  12.             <label class="description">
  13.                 <input type="radio" name="t_em_theme_options[header-set]" class="head-radio-option" value="<?php echo esc_attr( $header['value'] ); ?>" <?php checked( $t_em_theme_options['header-set'], $header['value'] ); ?> />
  14.                 <span><?php echo $header['label']; ?></span>
  15.             </label>
  16.         </div>
  17. <?php
  18.     endforeach;
  19.  
  20.     foreach ( t_em_header_options() as $sub_header ) :
  21.         if ( $sub_header['extend'] != '' ) :
  22.             $selected_option = ( $t_em_theme_options['header-set'] == $sub_header['value'] ) ? 'selected-option' : '';
  23. ?>
  24.         <div id="<?php echo $sub_header['value']; ?>" class="sub-layout header-extend <?php echo $selected_option; ?>">
  25.             <?php echo $sub_header['extend']; ?>
  26.         </div>
  27. <?php
  28.         endif;
  29.     endforeach;
  30. ?>
  31.     </div><!-- #header-options -->
  32. <?php
  33. }

Me limité a no poner las funciones callback para ahorrar espacio en el post, pero aquí puedes ver algo más de este mismo código.

Espero te sirva de ejemplo lo que te doy aquí. A veces por querer ahorrar código terminamos enredando el trabajo y tal ves tengamos un scrip mas corto, pero que demora más.

En este ejemplo tengo un archivo de 827 lineas, con todas las opciones, validaciones, valores por defecto y algo de comentarios

También te recomiendo mires en el theme Twentyeleven que trae buenos ejemplos de esto mismo...

Saludos.
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose