WordPress: update_option, ¿no actualiza las opciones vacías?

2

¿Cómo podría evitar que los datos vacíos ingresen a wordpress?

<?php 
foreach($_POST['eirepanel_inline_ads_options_name'] as  $post_eirepanel_inline_ads_options_name):
if(empty($post_eirepanel_inline_ads_options_name)): 
    echo 'empty';
else: 
    update_option('eirepanel_inline_ads_options', $_POST);
    $eirepanel_inline_ads_options = get_option('eirepanel_inline_ads_options');
endif; 
endforeach;
?>
    
pregunta Keith Donegan 15.06.2011 - 15:27

2 respuestas

4

Y lo que es más importante, no debes permitir que * no se confíe, los datos de $ _POST no sin autorización * en WordPress.

Pero creo que el problema es que estás actualizando la opción con todos los datos de $ _POST, en lugar de la clave de matriz adecuada:

update_option('eirepanel_inline_ads_options', $_POST);

Probablemente debería ser algo como:

update_option('eirepanel_inline_ads_options', $_POST['eirepanel_inline_ads_options_name']);

¿Sus opciones de complemento son discretas (una entrada de base de datos por opción) o una matriz de opciones?

EDIT

Ya que estás usando una matriz de opciones, el enfoque correcto sería:

  1. Defina una matriz para contener los datos $_POST ( $input = array() )
  2. Defina una matriz para obtener la configuración actual de la base de datos ( $valid_input = array() )
  3. Desinfecte los datos $_POST
  4. Actualice la matriz $valid_data con la matriz sanitized $input
  5. Pase el $valid_data actualizado a la base de datos

por ejemplo

$input = ( isset( $_POST ) ? $_POST : false );
$valid_input = get_option( 'eirepanel_inline_ads_options' );

foreach ( $input as $key ) {
   // sanitize data here
}

$valid_input = array_merge( $valid_input, $input );

update_option( 'eirepanel_inline_ads_options', $valid_input );

Solo rápido y sucio, pero debería darte una idea.

También: utilizar la API de configuración sería especialmente útil aquí.

    
respondido por el Chip Bennett 15.06.2011 - 16:16
1

Siguiendo con su respuesta a las sugerencias de @ Chip, le aconsejo que nombre sus entradas como tal;

<input type="text" name="eire[option_key_name]" value="hello world" />
<input type="text" name="eire[option_key_another]" />
<input type="text" name="eire[nasty_key_possibility]" />

Luego en tu código;

$options = shortcode_atts( array(
    'option_key_name' => 'default value',
    'option_key_another' => 'foobar'
), ( array ) $_POST['eire'] );

$options ahora solo contendrá las claves explícitas pasadas a shortcode_atts() , con los datos de $_POST anulando los valores predeterminados.

Array (
    option_key_name => hello world,
    option_key_another' => foobar
)

Verá que he usado nombres de matriz de entrada , para hacer un espacio de nombres en sus datos $_POST (a diferencia del espacio de nombre en cada nombre de entrada de opción, luego tener que recorrerlos y eliminarlos antes de guardarlos).

Nota: Esto solo elimina las claves que no queremos . Probablemente querrá ir más allá y sanear los valores individuales, dependiendo de su tipo de datos. Si todos son iguales, podría asignar una devolución de llamada a la matriz y haber terminado con ella.

Por ejemplo, todos son campos de texto sin formato;

$options = array_map( 'wp_strip_all_tags', $options );
    
respondido por el TheDeadMedic 15.06.2011 - 17:35

Lea otras preguntas en las etiquetas