web-dev-qa-db-ja.com

設定API - 複数のオプションを手動で更新する方法

Settings APIを使ってすべてのオプションを保存しています。

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

すべてのオプションを手動で(フォームを使用せず、PHP経由で)更新したいとしましょう。どうすればよいでしょうか。

このように、このアップデートは1つの設定に対してどのようになりますか。

$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

どのようにしてそれを複数の(元々50以上の)設定フィールドに対して機能させるかは私には全くわかりません。

私はこのようにしています:

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

そしてそれは動作しません、もちろん "import"は文字列ではなく配列です。

これが(私自身の)関連する質問です。 設定API - オプションを手動で更新する方法?

私はまだPHP foreachループを作成し、すべての設定をループし、それからそれらをリストし、update_optionを介して一つ一つ追加する必要があると思いますか?の仕方?それはそれのように聞こえるので、遅くなりますか?

UPDATE

このコードは設定を更新しないようです。

$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

これは見知らぬ人です。

上記のコードをpage.phpに置きます(テスト目的のためだけです)。

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

いずれかのページを更新します。何も起こりません。それでは、コードをこれに変更します。

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

もう1つの更新、 "existing_field"は空になっています。

それから私はもう一度最初のコードを貼り付けて3回目の更新をして、それはうまくいきます。

ヒント:更新する前にフィールド値を削除する必要があるでしょうか。

1
Wordpressor
  1. 現在のオプションを取得し、空の場合は必ず配列を返すようにします。

    $current_options = get_option( 'option_name', array() );
    
  2. 必要なオプションが配列になっていることを確認してください。

    $desired_options = array( /* whatever you need goes here */ );
    
  3. [wp_parse_args()] 1 を使用してそれらをマージします。

    $merged_options = wp_parse_args( $current_options, $desired_options );
    
  4. 更新

    update_option( 'option_name', $merged_options );
    

もちろん、あなたのためのトリックは、あなたがあなたが望むオプションで配列を扱っていることを確実にすることです。たぶんそのようなことをする:

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

(P.S:なんらかの消毒をしてください。$_POSTデータは本質的に信頼できませんです。)

編集する

私は約30の選択肢、入力、ブール値、テキスト領域を持っています。それらはすべてXX_theme_settingsの下に保管されており、そのうちの1つはexisting_fieldと呼ばれています

上記のプロセスに従ってください。

  1. 現在のオプションを取得し、空の場合は必ず配列を返すようにします。

    $current_options = get_option( 'XX_theme_settings', array() );
    
  2. 必要なオプションが配列になっていることを確認してください。

    $desired_options = array( 'existing_field' => 'your string here' );
    
  3. [wp_parse_args()] 1 を使用してそれらをマージします。

    $merged_options = wp_parse_args( $current_options, $desired_options );
    
  4. 更新

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