Soporte » WordPress Avanzado » Ayuda con el guardado de checkbox

  • Resuelto daschin2

    (@daschin2)


    Buenas noches/dias he estado trabajando en un proyecto de pluguin para activar y desactivar opciones de woocomerce desde el panel de administacion como lo es la aparicion del SKU.
    El problema que tengo es que no puedo guardar al activarlo en el escritorio

    este es el codigo del uso para generar el menu que aparece en el escritorio de wordpress

    <?php
    function Woosettings() {
    ?>
      <div class="wrap">
                <h2>Woosettings</h2>
                <h3>Desactivar / Activar SKU</h3>
            <form method="POST" action="Index.php">
              <?php 
                  settings_fields('SKUAD-content-settings-group');
                  do_settings_sections('SKUAD-content-settings-group');
              ?>
        <p><input type="checkbox", 
                  name="SKUAD_value",
                  id="SKUAD_value",
                  value="<?php echo get_option('SKUAD_value');?>" />SKU Desactivar</p>
              <?php submit_button();?>
        </form>
      </div>

    este es el codigo que se supone que debe guardar la accion

    function SKUAD_content_settings(){
    	register_setting(
    		'SKUAD-content-settings-group',
    		'SKUAD_value'
    	);
    }
    add_action('admin_int','SKUAD_content_settings');
Viendo 12 respuestas - 1 de 12 (de 12 total)
  • Buenas,

    No estás haciendo el uso correcto de register_setting ni la creación del form.

    Chequea el enlace que te paso para crear una página y guardar las opciones.

    https://codex.wordpress.org/Creating_Options_Pages

    Buenas adrián ya e estado viendo la pagina que comentaste y aqui esta el codigo de la pagina principal casi que calcado de la pagina

    <?php
    /*
    Plugin Name: Prueba
    Plugin URI: https://disortopedicos.com/
    Description: Convieret el bojeto que aparece como oferta a %
    Version:0.1
    Author:Daschin2
    Author URI:https://disortopedicos.com/
    License:GPL
    */
    
    add_action('admin_menu', 'menu_Woo_settings');
    function menu_Woo_settings() {
          add_menu_page('Woo_settings', 'Opciones', 'manage_options', 'WooSettings', 'Woosettings_page','',3);
          add_action( 'admin_init', 'register_SKUAD_settings' );
          defined( 'ABSPATH' ) or die( '¡Sin trampas!' );
    }
    function register_SKUAD_settings() {
          register_setting( 'WooSettings-settings-group', 'SKUAD' );
    }
    
    function Woosettings_page(){
    ?>
      <div class="wrap">
                <h2>Opciones</h2>
                    <form method="post" action="saves.php">                   
                       <?php settings_fields( 'WooSettings-settings-group' );?>
                       <?php do_settings_sections( 'WooSettings-settings-group' );?>
                      
                      <p><input type="checkbox", name="SKUAD", id="SKUAD",
                  value="<?php echo esc_attr( get_option('SKUAD') ); ?>" />SKU Desactivar</p>
    
              <?php submit_button(); ?>
    
          </form>
      </div>
    <?php }; ?>

    pero lo que me confunde es el guardado aqui esta el codigo de saves.php

    <?php 
    function wprincipiante_save_SKUAD(){
    global $options;
    foreach ($options as $value) {
        if (get_option($value['id']) === FALSE) {
            $$value['id'] = $value['FALSE'];
        }
        else {
            $$value['id'] = get_option( $value['id'] );
        }
    
    }
    
    	if (trim('WooSettings-settings-group') != "") 
    }
    
    ?>

    Se que el codigo de save.php esta mal pero no consigo corregirlo.
    Esta es mi primera «inmercion» por asi decirlo en el mundo de los pluguins nunca he usado PHP y estoy aprendiendo sobre marcha
    agradesco la ayuda

    Hola @daschin2

    El código que indicas no está tan calcado como dices. Sólo con la parte de código que sale debajo de «The below example uses the new Settings API to create and save your plugin options » y antes de «Example #2» ya puedes hacer lo que preguntas, no hace falta más código. El example 2 es lo mismo pero utilizando una clase PHP y el example 3 hace demasiadas cosas para que te fijes si estás aprendiendo.

    Te apunto varios detalles para que tengas en cuenta. Espero que encuentres la solución final 😉

    – El form debería apuntar a options.php para hacer uso del register_setting o a la misma página si quieres procesar tu el form mediante $_POST
    – En el input de SKUAD le debes poner algún value, o no ponerle ninguno y que el checkbox devuelva el valor 1 o true por defecto, si no siempre guardará el valor que le asignas al value que en este caso siempre es nada.
    – Para que el checkbox si está seleccionado se pinte correctamente deberás utilizar la función checked con el valor que tengas en bd y el value que le hayas dado al checkbox
    – Como pista intenta depurar tu código haciéndote var_dump($variable); donde dudes si el código llega correctamente.
    – El código que tienes en saves.php simplemente sirve para mostrar las options no para guardarlas.
    – Mira en la base de datos si en la tabla options estás llegando a guardar un registro con meta_key = «SKUAD_value»

    Espero haberte guiado un poco en los errores que estás cometiendo y que lo consigas. Ya comentarás en el foro cuando tengas resultados y marques el debate como resuelto.

    Buenos dias/noches ya he pogresado en el guardado con las checkbox lo he intentado con mil convinaciones para que se verifique con el checked en el archivo options.php pero no he encontrado forma para que haga su funcion de guardar al hacer el click en el guardar aqui esta el codigo con el que he podido guardar
    <input type="checkbox", id="SKUAD", name="SKUAD[SKU]"<?php checked( isset( $options['SKU'] ) ); ?>, value="SKU">

    y en general el archivo es:

    <?php
    /*
    Plugin Name: Prueba
    Plugin URI: https://disortopedicos.com/
    Description: Convieret el bojeto que aparece como oferta a %
    Version:0.1
    Author:Daschin2
    Author URI:https://disortopedicos.com/
    License:GPL
    */
    
    add_action('admin_menu', 'menu_Woo_settings');
    function menu_Woo_settings(){
          add_menu_page('Woo_settings', 'Opciones', 'manage_options', 'WooSettings', 'Woosettings_page','',3);
          defined( 'ABSPATH' ) or die( '¡Sin trampas!' );
          add_action( 'admin_init', 'register_SKUAD' );
          
    
    }
    function register_SKUAD() {
          register_setting( '$WooSettings_settings_group', 'SKUAD' );
    }
    function Woosettings_page(){
    
    ?>
    
      <div class="wrap">
    
          <h2>Opciones</h2>
    
    <form method="post" action="options.php">
                  
                  <?php settings_fields( '$WooSettings_settings_group' );?>
                  <?php do_settings_sections( '$WooSettings_settings_group' );?>
                  <?php $options = get_option( 'SKUAD' );?>
            <p><input type="checkbox", id="SKUAD", name="SKUAD[SKU]"<?php checked( isset( $options['SKU'] ) ); ?>, value="SKU">SKU Desactivar</p>
            <p><input type="checkbox", id="SKUAD",name="SKUAD[]", value="Prueba">Prueba</p>
                  <?php submit_button(); ?>
            </form>
      </div>
    <?php };?>

    me gustaria saber como se podria hacer que el codigo de guardado «checked» se ejecutara desde options.php he estado probando con este codigo

    global $options;
    function Woosettings_page(){
    /*Comprobar si existe*/
    if (isset($_POST['SKUAD'])) {
            /*remplazar*/
    	foreach ($_POST['SKUAD'] as $value){
    
    		checked( $_POST['SKUAD']);
    		return 'SKUAD';
    }
    }

    tambien he provado este que es hacer una array el codigo que falta el inicio es igual

    function Woosettings_page(){
    
    ?>
    
      <div class="wrap">
    
          <h2>Opciones</h2>
    
    <form method="post" action="options.php">
                  <?php $SKUAD = array();?>
                  <?php settings_fields( '$WooSettings_settings_group' );?>
                  <?php do_settings_sections( '$WooSettings_settings_group' );?>
                      
            <p><input type="checkbox", name="SKUAD[]", value="SKU">SKU Desactivar</p>
            <p><input type="checkbox", name="SKUAD[]", value="Prueba">Prueba</p>
    
                <?php submit_button(); ?>
            </form>
      </div>

    pero en esta forma me es imposible que se guarde

    Buenas,

    Cuando lo guardas, ¿que valor tienes en la base de datos? O sea el registro que tengas en XX_options > meta_value = ‘SKUAD’ ¿qué valor tiene?

    El checked mira bien la documentación, seguramente sería algo del estilo:
    checked( $options['SKUAD'], 'SKU' );

    lo que aparece en la base de datos es «SKUAD a:1:{s:3:»SKU»;s:3:»SKU»;}»

    al poner otra checkbox con
    <input type="checkbox", name="SKUAD[Prueba]"<?php checked( isset( $options['Prueba'] ) ); ?>, value="Prueba">
    no lo toma y voy a revisar en la base de datos y tampoco aparece estoy seguro porque no lo detecta como una array o algo parecido y me lansa un error

    Buenas,

    En base de datos está correcto el guardado como a:1:{s:3:»SKU»;s:3:»SKU»;} ya que es un array serializado. Haciendo un get_option(‘SKUAD’) te retornaría correctamente los valores.

    Igualmente haz lo siguiente:
    Borra el registro en base de datos y quitale que sea un array.
    Que sea solo:
    <input type="checkbox" name="SKUAD" <?php checked(get_option('SKUAD'),'yes'); ?>, value="yes">

    Espero que puedas hacer que funcione y, lo más importante, que entiendas como funciona.

    En base de

    Buenas muchas gracias ya tengo funcionando lo de las checkbox y ahora para hacer una accion con ellas tengo el siguiente codigo

    function remover_sku($enabled){
    	if (empty($_POST['SKUAD'])){
    			return $false;
    		}else{
    			return $enabled;
    		}
    }
    add_filter( 'wc_product_sku_enabled', 'remover_sku' );

    lo tengo linkeado por un include actulmente tengo un problema porque puedo activar por primera vez pero al desactivarlo no vuelven a aparecer las SKU del woocommerce.
    Creo que es algo que estoy haciendo mal con el empty o alguna clase de declarasion que me borre algun valor de la variable

    Hola @daschin2

    Abre otro hilo para esa consulta y da esta por terminada para no mezclar temas.
    Aunque sea el mismo proyecto para ti, una es asesoria de como hacer el guardado y esto es más una consulta con un filter.

    ok muchas gracias

Viendo 12 respuestas - 1 de 12 (de 12 total)
  • Debes estar registrado para responder a este debate.