Ver Mensaje Individual
  #6 (permalink)  
Antiguo 18/04/2013, 13:16
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: Las opciones no se guardan

Bien por ti, a ver si acabamos de pulir esto, te voy a pasar el código que tengo e intentaré explicarte cada cosa...

En mi proyecto tengo estas mismas opciones, osea, el usuario podrá agregar su perfil de redes sociales. Entonces lo que vamos a guardar en la BD son las URLs del usuario. Para eso creamos una función que guarde valores por defecto. Por ejemplo, si tengo una función para la cabecera, como hemos visto, quiero tener una opción por defecto, para cuando cargue el theme ya esté activada esta opción, algo así: 'header-set' => 'no-header-image' ... Pero como en este caso vamos a guardar URLs, no necesitamos valores por defecto, así que pasamos valores vacíos:
Código PHP:
Ver original
  1. /**
  2.  * Return the default options for Twenty'em
  3.  */
  4. function t_em_default_theme_options(){
  5.     $default_theme_options = array (
  6.         'twitter-set'       => '',
  7.         'facebook-set'      => '',
  8.         'googlepluss-set'   => '',
  9.     );
  10.  
  11.     return apply_filters( 't_em_default_theme_options', $default_theme_options );
  12. }
Yo tengo creada una función, que guarda los valores por defecto una vez cargado el theme, es decir, cuando activas el theme, no hay nada en la BD, pero necesito esos valores para que comience a funcionar:
Código PHP:
Ver original
  1. /**
  2.  * Return an array of variables we need
  3.  * to access to the database
  4.  */
  5. function t_em_set_globals(){
  6.     global  $t_em_theme_options;
  7.  
  8.     $t_em_theme_options             = t_em_get_theme_options();
  9.  
  10.     // If options are empties, we load default settings.
  11.     if ( empty( $t_em_theme_options ) )
  12.         update_option( 't_em_theme_options', t_em_default_theme_options() );
  13. }

Luego la función que nos devuelve los valores de la BD:
Código PHP:
Ver original
  1. /**
  2.  * Return an array of social network options for Twenty'em
  3.  */
  4. function t_em_social_network_options(){
  5.     global $socialnetwork_options;
  6.     $socialnetwork_options = array (
  7.         'twitter-set' => array (
  8.             'value' => '',
  9.             'name' => 'twitter-set',
  10.             'label' => __( 'Twitter URL', 't_em' ),
  11.             'item' => __( 'Twitter', 't_em' ),
  12.         ),
  13.         'facebook-set' => array (
  14.             'value' => '',
  15.             'name' => 'facebook-set',
  16.             'label' => __( 'Facebook URL', 't_em' ),
  17.             'item' => __( 'Facebook', 't_em' ),
  18.         ),
  19.     );
  20.  
  21.     return apply_filters( 't_em_social_network_options', $socialnetwork_options );
  22. }
Fíjate aquí, que es donde estás errando, el value está vacío, porque al inicio no tenemos nada, el name es el nombre del item del array que se guarda en la BD y cuando le asignemos un valor quedará algo así 'facebook-set' => 'http://facebook.com/nombre-del-usuario'... label e item son para el formulario en el admin y mostrar el menú en el front, respectivamente.

Luego creamos los campos para el formulario:
Código PHP:
Ver original
  1. /**
  2.  * Render the Socialnetwork setting field
  3.  */
  4. function t_em_settings_field_socialnetwork_set(){
  5.     global $t_em_theme_options;
  6.     foreach ( t_em_social_network_options() as $social ) :
  7. ?>
  8.     <div class="layout text-option social">
  9.         <label>
  10.             <span><?php echo $social['label'];?></span>
  11.             <input type="url" class="regular-text" name="t_em_theme_options[<?php echo $social['name']; ?>]" value="<?php echo esc_url( $t_em_theme_options[$social['name']] ); ?>" />
  12.         </label>
  13.     </div>
  14. <?php
  15.     endforeach;
  16. }

Y finalmente la validación de los datos:
Código PHP:
Ver original
  1. /**
  2.  * Sanitize and validate input. Accepts an array, return a sanitized array.
  3.  */
  4. function t_em_theme_options_validate( $input ){
  5.     // Validate all url (input[type="url"]) options
  6.     foreach ( array (
  7.         'twitter-set',
  8.         'facebook-set',
  9.         'googlepluss-set',
  10.     ) as $url ) :
  11.         $input[$url] = esc_url_raw( $input[$url] );
  12.     endforeach;
  13. }

Fíjate que usé type="url" en el formulario, pues eso es lo que vamos a guardar.

La función que finalmente crea el formulario es como la tienes, y la función de validación tienes que pasarla como tercer parámetro en register_setting().

Uffff.... creo que ahora puedes navegar sola por estas turbulentas aguas ... Yo estaré aquí, esperando a que me invites a un par de cervezas

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