web-dev-qa-db-fra.com

API de paramètres - Comment mettre à jour plusieurs options manuellement?

Je stocke toutes mes options à l'aide de l'API de paramètres:

function registerSettings() {

register_setting('XX_theme_settings', 'XX_theme_settings', 'setting_validate' );

add_settings_section('theme_options', 'Theme Options', 'theme_options_generate', 'page1' ); 
add_settings_field( 'XX_Option1', 'Option 1', 'text_input', 'page1', 'theme_options', 'XX_Option1' );
add_settings_field( 'XX_Option2', 'Option 2', 'text_input', 'page1', 'theme_options', 'XX_Option2' ); 

};

add_action('admin_init', 'registerSettings');

Supposons que je veuille mettre à jour toutes les options manuellement (sans utiliser de formulaires, mais via PHP), comment dois-je procéder?

Voici à quoi cette mise à jour ressemble pour un paramètre:

$my_options= get_option('XX_theme_settings');//retrieve all options
$my_options['XX_Option2'] = 'my new value'; //amend value in array(s)
update_option('XX_theme_settings', $my_options); //update option array

Je ne sais absolument pas comment le faire fonctionner pour plusieurs champs (au départ, j'ai plus de 50).

J'ai essayé de cette façon:

$current_options = get_option('XX_theme_settings');
$imported_options = array_merge($current_options , array_intersect_key($_POST["import"], $current_options ));
// $imported_options = $_POST["import"]; - simplified
update_option('XX_theme_settings', $imported_options);

Et cela ne fonctionne pas, bien sûr "importer" n'est pas une chaîne mais un tableau.

Voici une question connexe (la mienne): Paramètres API - Comment mettre à jour les options manuellement?

Je suppose que j’ai toujours besoin de créer une boucle PHP pour chaque boucle et de parcourir tous les paramètres, puis de les répertorier, dix ajoutent-les tous via update_option? Comment? Serait-ce lent, parce que ça en a l'air?

UPDATE

Ce code ne semble pas mettre à jour les paramètres:

$current_options = get_option( 'XX_theme_settings', array() );
$desired_options = array("existing_field" => "new value");
// $desired_options = array("XX_theme_settings" => array("existing_field" => "new value")); tried this one, but also no luck
$merged_options = wp_parse_args( $current_options, $desired_options );
update_option( 'XX_theme_settings', $merged_options );

UPDATE II

C'est encore plus étrange.

Je mets le code ci-dessus à page.php (juste pour des raisons de test):

    $current_options = get_option( 'XX_theme_settings', array() );
    $desired_options = array("existing_field" => "new value");
    $merged_options = wp_parse_args( $current_options, $desired_options );
    update_option( 'XX_theme_settings', $merged_options );

Je rafraîchit une des pages. Rien ne se passe. Puis je change le code en ceci:

    $current_options = get_option( 'XX_theme_settings', array() );
    $desired_options = array("existing_field" => "new value");
    $merged_options[] = wp_parse_args( $current_options, $desired_options ); //here's the change
    update_option( 'XX_theme_settings', $merged_options );

Une autre actualisation, "existing_field" est maintenant vide.

Ensuite, je colle à nouveau le premier code et actualise pour la troisième fois et cela fonctionne.

Astuce: je devrais peut-être supprimer la valeur des champs avant de les mettre à jour?

1
Wordpressor
  1. Récupérez les options actuelles et assurez-vous de renvoyer un tableau s'il est vide:

    $current_options = get_option( 'option_name', array() );
    
  2. Assurez-vous que les options souhaitées sont dans un tableau:

    $desired_options = array( /* whatever you need goes here */ );
    
  3. Fusionnez-les en utilisant [wp_parse_args()] 1 :

    $merged_options = wp_parse_args( $current_options, $desired_options );
    
  4. Mettre à jour

    update_option( 'option_name', $merged_options );
    

Bien sûr, le truc pour vous est de vous assurer que vous avez affaire à un tableau contenant les options souhaitées. Peut-être faire quelque chose comme ça:

$desired_options = array( $_POST['import'] );

(P.S. veuillez effectuer une sorte de nettoyage. Les données $_POST sont intrinsèquement indignes de confiance .)

Modifier

J'ai environ 30 options, entrées, booléens, textareas. Ils sont tous stockés sous XX_theme_settings et l’un d’eux s'appelle existing_field

Suivez simplement le processus décrit ci-dessus:

  1. Récupérez les options actuelles et assurez-vous de renvoyer un tableau s'il est vide:

    $current_options = get_option( 'XX_theme_settings', array() );
    
  2. Assurez-vous que les options souhaitées sont dans un tableau:

    $desired_options = array( 'existing_field' => 'your string here' );
    
  3. Fusionnez-les en utilisant [wp_parse_args()] 1 :

    $merged_options = wp_parse_args( $current_options, $desired_options );
    
  4. Mettre à jour

    update_option( 'XX_theme_settings', $merged_options );
    
4
Chip Bennett