Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

[SOLUCIONADO] Las opciones no se guardan

Estas en el tema de Las opciones no se guardan en el foro de WordPress en Foros del Web. Estoy creando una pagina de opciones de un theme y por alguna razon, no se guardan las opciones. Cree unas opciones usando la setting api, ...
  #1 (permalink)  
Antiguo 16/04/2013, 02:36
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Las opciones no se guardan

Estoy creando una pagina de opciones de un theme y por alguna razon, no se guardan las opciones. Cree unas opciones usando la setting api, sin usar arrays y funcionaban bien, pero buscando una forma mas simple de hacerlo, rogertm me dejo esta forma de hacerlo con arrays en un post anterior. Llevo dias dandole vueltas pero no consigo que se guarde la opcion.

Este es el codigo que tengo:

Código PHP:
Ver original
  1. <?php
  2. add_action( 'admin_init', 'simplyColor_my_admin_init' );
  3. function simplyColor_my_admin_init() {
  4.     register_setting( 'opciones', 'general_option');
  5.     add_settings_section( 'general', 'Opciones generales', '__return_false', 'theme-options' );
  6.     add_settings_field( 'buttons', 'Opciones botones sociales', 'simplyColor_buttons', 'theme-options', 'general' );
  7. }
  8. function buttons_options () {
  9.     $buttons_options = array (
  10.         'facebook' => array (
  11.             'value' => '1',
  12.             'label' => 'Añadir boton de facebook',
  13.         ),
  14.         'twitter' => array (
  15.             'value' => '2',
  16.             'label' => 'Añadir boton de Twitter'
  17.         ),
  18.         'google' => array (
  19.             'value' => '3',
  20.             'label' => 'Añadir boton de Google+'
  21.         ),
  22.     );
  23.  
  24.     return apply_filters( 'buttons_options', $buttons_options );
  25.        
  26. }
  27.  
  28. function simplyColor_buttons ($args) {
  29.     global $general_option;
  30.     foreach ( buttons_options() as $buttons ) :
  31. ?>
  32.     <label class="description">
  33.         <input type="checkbox" name="general_option[buttons]" value="<?php echo $buttons['value'] ; ?>" <?php checked( $general_option['buttons'], $buttons['value'] ); ?> />
  34.         <span><?php echo $buttons['label']; ?></span>
  35.     </label>
  36. <?php
  37.      endforeach;
  38. }
  39.  
  40. function simplyColor_opciones_generales() {
  41. ?>
  42. <div class="wrap">
  43.     <h2>Opciones generales</h2>
  44.     <form method="POST" action="options.php">
  45.     <?php settings_fields( 'opciones' ); ?>
  46.     <?php do_settings_sections( 'theme-options' ); ?>
  47.     <?php submit_button(); ?>
  48.     </form>
  49. </div>
  50. <?php
  51. }
  52.  
  53. function simplyColor_option_menu(){
  54.     add_menu_page( 'Opciones Theme', 'Opciones Theme', 'manage_options', 'theme-options', 'simplyColor_opciones_generales' );    
  55. }
  56. add_action('admin_menu','simplyColor_option_menu');

Que estoy haciendo mal??

Última edición por rogertm; 17/04/2013 a las 07:31
  #2 (permalink)  
Antiguo 17/04/2013, 07:54
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 19 años, 5 meses
Puntos: 638
Respuesta: Las opciones no se guardan

Creo que es tan simple como que estás llamando una función que no existe en el tercer parámetro de la función add_setting_field(). Verifica a ver...

Código PHP:
Ver original
  1. add_settings_field( 'buttons', 'Opciones botones sociales', 'buttons_options', 'theme-options', 'general' );

También te falta una función para validar los datos en register_setting().

Luego iremos por parte, pues tengo un código para eso, pero te dejo pasar un poquito de trabajo y luego lo vamos solucionando paso a paso. Es la mejor manera de aprender...

Este es un tema realmente difícil en WordPress, por eso me esforzaré al máximo en ayudarte.

Saludos.
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
  #3 (permalink)  
Antiguo 17/04/2013, 14:43
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Las opciones no se guardan

Ante todo muchas gracias. No he entendido bien la primera parte de tu respuesta. Te refieres a la funcion simplyColor_buttons? Ya que esta definida en la linea 28.

Si la cambio por buttons_options, las opciones dejan de aparecer en la página del menu, ya que no llamo a la función que muestra el formulario.

Lo de la funcion para validar he encontrado algo buscando en google pero ando peleandome con ello aun.
  #4 (permalink)  
Antiguo 18/04/2013, 08:06
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 19 años, 5 meses
Puntos: 638
Respuesta: Las opciones no se guardan

Oops... Tienes toda la razón, por eso ahora he mirado tu código con más detenimiento. Mira en la función add_menu_page(), prueba cambiarle el tercer parámetro ($capability) a edit_theme_options.

Saludos.
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
  #5 (permalink)  
Antiguo 18/04/2013, 10:22
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Las opciones no se guardan

No funcionaba lo de edit_theme_options pero... finalmente lo he conseguido!

El problema es que faltaba llamar a las opciones guardadas en la variable $general_options, lo he modificado así:


Código PHP:
<?php 
function simplyColor_buttons ($args) {
        
        global 
$general_option;
        
        
$general_option get_option ('general_option');
        
        foreach ( 
buttons_options() as $buttons ) :
                
?>

                <input type="checkbox" name="general_option[buttons]" value="<?php echo $buttons['value']; ?><?php checked$general_option['buttons'], $buttons['value'] ); ?> />
                
                <span><?php echo $buttons['label']; ?></span>
  
        
        <?php
     
endforeach;
        
        }
?>
Aunque sigo teniendo un pequeño problema, que tiene que ver con los checkbox. Solo puedo marcar 1, no puedo elegir todos, es decir, se comportan como si fueran input radio en vez de input checkbox.

Me imagino que ocurre porque todos tienen el mismo name. Por eso he intentado crear otro parametro en los arrays facebook, twitter y google en el que guardar el name del campo del formulario pero no funciona (o lo hago mal). Aqui lo pongo:

Código PHP:
<?php 
function buttons_options () {
        
        
$buttons_options = array (
        
'facebook' => array (
        
'name'=>'button1',
            
'value' => '1',
            
'label' => 'Añadir boton de facebook'
        
),
        
'twitter' => array (
      
'name'=>'button2',
            
'value' => '2',
            
'label' => 'Añadir boton de Twitter'
        
),
        
'google' => array (
        
'name'=>'button3',
            
'value' => '3',
            
'label' => 'Añadir boton de Google+'
        
)
    );
 
    return 
apply_filters'buttons_options'$buttons_options );
        
    }


function 
simplyColor_buttons ($args) {
        
        global 
$general_option;
        
        
$general_option get_option ('general_option');
        
        foreach ( 
buttons_options() as $buttons ) :
                
?>

                <input type="checkbox" name="general_option[<?php echo $buttons['name']; ?>]" value="<?php echo $buttons['value']; ?><?php checked$general_option[' echo $buttons["name"]'], $buttons['value'] ); ?> />
                
                <span><?php echo $buttons['label']; ?></span>
  
        
        <?php
     
endforeach;
        
        }
?>

Muchas gracias por tu ayuda rogertm, por fin parece que veo la luz al final del tunel con esto de las settings jajaa

EDITO: No se comporta como un input radio, si no que se queda marcado el ultimo por orden del valor o de posicion no se, es decir si marco el primero y el ultimo, se queda marcado solo el ultimo, si marco el 1 y el 2 se queda el dos...

Última edición por laura_moreno14; 18/04/2013 a las 10:36
  #6 (permalink)  
Antiguo 18/04/2013, 13:16
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 19 años, 5 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
  #7 (permalink)  
Antiguo 19/04/2013, 01:30
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Las opciones no se guardan

Me funciona perfecto el código, pero hay un problema, y es que son campos de url y lo que estaba haciendo eran checkbox. Me viene bien, ya que también utilizare campos de url para otras opciones y ahora ya los tengo echos. Pero sigo sin hacer funcionar los checkbox.


Muchas gracias por ayudarme con esto, aunque hay muchos tutoriales de los que aprender, no me es suficiente y tu ayuda a sido más valiosa.
  #8 (permalink)  
Antiguo 19/04/2013, 06:41
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 19 años, 5 meses
Puntos: 638
Respuesta: Las opciones no se guardan

Un placer ayudar... Aquí hay un ejemplo que te puede servir http://themeshaper.com/2010/06/03/sample-theme-options/

Busca en el repositorio de themes de WordPress, hay uno que se llama Responsive, entre ese y Twenty Eleven hay códigos muy buenos y fáciles de entender...

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

Etiquetas: opciones, php, post, theme
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 12:01.