Ver Mensaje Individual
  #4 (permalink)  
Antiguo 16/04/2013, 07:54
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, 9 meses
Puntos: 638
Respuesta: Sobre la setting API de wordpress

Las funciones tipo callback son extensiones de la función natural, por decirlo de alguna manera. Si te fijas en la función que muestra el formulario, tengo un foreach al final, que verifica si el elemento extend del array no está vacío y en ese caso muestra la función callback.
Código PHP:
Ver original
  1. <?php
  2.     foreach ( t_em_header_options() as $sub_header ) :
  3.         if ( $sub_header['extend'] != '' ) :
  4.             $selected_option = ( $t_em_theme_options['header-set'] == $sub_header['value'] ) ? 'selected-option' : '';
  5. ?>
  6.         <div id="<?php echo $sub_header['value']; ?>" class="sub-layout header-extend <?php echo $selected_option; ?>">
  7.             <?php echo $sub_header['extend']; ?>
  8.         </div>
  9. <?php
  10.         endif;
  11.     endforeach;
  12. ?>

Te lo derrito un poco para que lo puedas entender mejor. En este ejemplo tenemos tres opciones.

1. No se muestra imagen de cabecera. Que como puedes deducir, no hace falta hacer nada en este caso, sencillamente obtenemos desde la BD que no hay nada en este campo y no hacemos nada.

2. Se muestra una imagen de cabecera, que además, tiene una opción (2.1): mostrar o no la imagen destacada de cada post en single.php, osea, cuando se está leyendo cada post. Como lo hace Twenty Eleven (Activa Twenty Eleven y crea un post con imagen destacada y acceder a él para que veas cómo funciona)

3. Mostrar un Slide Show en la cabecera, que en este caso hay varias opciones (3.n): Tamaño del thumbnail, categoría que se va a mostrar, cantidad de diapositivas, etc...

En los casos 2 y 3 necesitamos las funciones tipo callback, al menos esa fue la mejor manera que encontré para darle solución a mi problema.

Te pongo el ejemplo de la función callback de la imagen de cabecera para que puedas aclararte un poco más:
Código PHP:
Ver original
  1. <?php
  2. /**
  3.  * Extend setting for header image option
  4.  */
  5. function t_em_header_image_callback(){
  6.     global $t_em_theme_options;
  7.     $extend_header = '';
  8.     $extend_header .= '<p>'. sprintf( __( 'To manage your header image options <a href="%1$s" target="_blank">Click here</a>.', 't_em' ), admin_url( 'themes.php?page=custom-header' ) ) .'</p>';
  9.     if ( get_header_image() ) :
  10.         $checked_option = checked( $t_em_theme_options['header-featured-image'], '1', false );
  11.         $extend_header .= '<figure><img src="'.get_header_image().'" width="500"></figure>';
  12.         $extend_header .= '<label class="description">';
  13.         $extend_header .=     __( 'Display featured image in single posts and pages? ', 't_em' );
  14.         $extend_header .=    '<input type="checkbox" name="t_em_theme_options[header-featured-image]" value="1" '. $checked_option .' />';
  15.         $extend_header .= '</label>';
  16.     else :
  17.         $extend_header .= '<p>'. __( 'Oops! No image choosen yet', 't_em' ) .'</p>';
  18.     endif;
  19.  
  20.     return apply_filters( 't_em_header_image_callback', $extend_header );
  21. }
  22. ?>

Un Plus. A la hora de llamar todas estas funciones lo hago desde el archivo header.php por supuesto, y para no complicarme la existencia usé archivos por separado para cada opción:
Código PHP:
Ver original
  1. <?php
  2. /**
  3.  * Display header set depending of the Header Options
  4.  */
  5. function t_em_header_options_set(){
  6.     global    $post,
  7.             $t_em_theme_options;
  8.  
  9.     $header_options = $t_em_theme_options['header-set'];
  10.  
  11.     if ( 'no-header-image' == $header_options ) :
  12.         return false;
  13.     elseif ( 'header-image' == $header_options ) :
  14.         get_template_part( 'header', 'image' );
  15.     elseif ( 'slider' == $header_options ) :
  16.         get_template_part( 'header', 'slider' );
  17.     endif;
  18. }
  19. ?>

En la BD se guardan las opciones dentro de un array (key => value). Entonces, para la llave header-set, tenemos los valores no-header-image, header-image o slider, y se desplegará cada archivo dependiendo de la opción escogida.

En cuanto a la validación de los datos, necesitas una función para eso. Fíjate en la API que está detallado, igual hay muchos tutoriales por internet que te pueden servir.

Yo estudié esta API para un proyecto que estoy haciendo, que espero terminar pronto y al fin poder compartirlo con la comunidad, pues es algo personal, y me ayudó mucho fijarme en el theme Twenty Eleven. Intenta hacer algo en ese sentido y entonces es más fácil ayudarte.

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