web-dev-qa-db-fra.com

WordPress: update_option, ne savez-vous pas quelles sont les options?

Comment ferais-je pour ne pas laisser des données vides dans 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;
?>
2
Keith Donegan

Plus important encore, vous ne devez pas laisser * de données _POST * non approuvées et non sécurisées dans WordPress.

Mais je pense que le problème est que vous mettez à jour l'option avec toutes les données $ _POST, au lieu de la clé de tableau appropriée:

update_option('eirepanel_inline_ads_options', $_POST);

Devrait probablement être quelque chose comme:

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

Les options de votre plugin sont-elles discrètes (une entrée de base de données par option) ou un tableau d’options?

EDIT

Puisque vous utilisez un tableau d’options, la bonne approche serait:

  1. Définir un tableau pour contenir les données $_POST ($input = array())
  2. Définir un tableau pour obtenir les paramètres actuels de la base de données ($valid_input = array())
  3. Désinfectez les données $_POST
  4. Mettre à jour le tableau $valid_data avec le tableau $input désinfecté
  5. Remettez le $valid_data mis à jour dans la base de données

par exemple.

$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 );

Juste rapide et sale, mais devrait vous donner une idée.

De plus, l'utilisation de l'API Settings serait particulièrement utile ici.

4
Chip Bennett

Suite à votre réponse aux suggestions de @ Chip, je vous conseillerais de nommer vos entrées de la manière suivante;

<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]" />

Puis dans votre code;

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

$options ne contiendra plus que les clés explicites passées à shortcode_atts(), les données de $_POST remplaçant les valeurs par défaut.

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

Vous verrez que j’utilise les noms de tableaux d’entrée , afin d’espacer les noms de vos données $_POST (par boucle sur eux et retirez-le avant de sauvegarder).

Remarque: Ceci ne supprime que les clés dont nous ne voulons pas . Vous voudrez probablement aller plus loin et assainir les valeurs individuelles, en fonction de leur type de données. S'ils sont tous identiques, vous pouvez mapper un rappel sur le tableau et en avoir terminé.

Par exemple, ce sont tous des champs de texte brut;

$options = array_map( 'wp_strip_all_tags', $options );
1
TheDeadMedic