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<?php
foreach ( t_em_header_options() as $sub_header ) :
if ( $sub_header['extend'] != '' ) :
$selected_option = ( $t_em_theme_options['header-set'] == $sub_header['value'] ) ? 'selected-option' : '';
?>
<div id="<?php echo $sub_header['value']; ?>" class="sub-layout header-extend <?php echo $selected_option; ?>">
<?php echo $sub_header['extend']; ?>
</div>
<?php
endif;
endforeach;
?>
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<?php
/**
* Extend setting for header image option
*/
function t_em_header_image_callback(){
global $t_em_theme_options;
$extend_header = '';
$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>'; if ( get_header_image() ) :
$checked_option = checked( $t_em_theme_options['header-featured-image'], '1', false );
$extend_header .= '<figure><img src="'.get_header_image().'" width="500"></figure>';
$extend_header .= '<label class="description">';
$extend_header .= __( 'Display featured image in single posts and pages? ', 't_em' );
$extend_header .= '<input type="checkbox" name="t_em_theme_options[header-featured-image]" value="1" '. $checked_option .' />';
$extend_header .= '</label>';
else :
$extend_header .= '<p>'. __( 'Oops! No image choosen yet', 't_em' ) .'</p>';
endif;
return apply_filters( 't_em_header_image_callback', $extend_header );
}
?>
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<?php
/**
* Display header set depending of the Header Options
*/
function t_em_header_options_set(){
global $post,
$t_em_theme_options;
$header_options = $t_em_theme_options['header-set'];
if ( 'no-header-image' == $header_options ) :
return false;
elseif ( 'header-image' == $header_options ) :
get_template_part( 'header', 'image' );
elseif ( 'slider' == $header_options ) :
get_template_part( 'header', 'slider' );
endif;
}
?>
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.