web-dev-qa-db-ja.com

管理者オプションページ。配列として保存

私はPHPが得意ではありません。 WordPressの管理者用オプションページを作成したところ、問題なく動作します。

// Admin Menu
add_action('admin_menu', 'my_cool_plugin_create_menu');
function my_cool_plugin_create_menu() {

    $parent_slug = 'test-slug';
    $capability = 'administrator';

    // sub menus
    add_submenu_page( $parent_slug, 'Test', 'Test', $capability, 'test', 'hp_settings_page');

    //call register settings function
    add_action( 'admin_init', 'cm_register_settings' );
}

function cm_register_settings() {

    // title
    register_setting( 
        'mytheme_group',                 // Option group 
        'mytheme_title',                 // Option name
        'admin_options_sanitize_text_1' //sanitize callback
    );

    // IDs
    register_setting( 
        'mytheme_group', 
        'mytheme_ids', 
        'admin_options_sanitize_text_2' 
    );   
}

// Admin Page
function hp_settings_page() { ?>

    <div class="wrap">

        <h2>Test</h2>

        <form method="post" action="options.php">
            <?php settings_fields( 'mytheme_group' ); ?>
            <?php do_settings_sections( 'mytheme_group' ); ?>
            <table class="form-table">                 
                <tr>
                    <th scope="row">Title</th>
                    <td>
                        <textarea name="mytheme_title" rows="10" cols="100"><?php echo get_option('mytheme_title'); ?></textarea>
                    </td>
                </tr>

                <tr>
                    <th scope="row">IDs</th>
                    <td>
                        <textarea name="mytheme_ids" rows="10" cols="100"><?php echo get_option('mytheme_ids'); ?></textarea>
                    </td>
                </tr>                   
            </table>

            <?php submit_button(); ?>

        </form>

    </div><?php 
}


// sanitize 1
function admin_options_sanitize_text_1($input) {    
    $new_input = sanitize_text_field( $input );     
    return $new_input;
}


// sanitize 2
function admin_options_sanitize_text_2($input) {    
    $new_input = preg_replace("/[^0-9\,]/", "", $input );       
    return $new_input;
}

これでデータベースに2つの行が作成され、次のように値を表示できます。

echo get_option('mytheme_ids');
echo get_option('mytheme_title');

データベース内の1行に配列として保存するために、このコードにどのような変更を加える必要がありますか?それで、値を次のように表示することができます。

$options = get_option('mytheme_options');
echo = $options['ids'];
echo = $options['title'];

任意の助けをいただければ幸いです。

1
Andy

1つの設定を登録してから、フォーム入力を変更して値を配列に保存するだけです。設定を登録する例です。

register_setting( 
    'mytheme_settings', 
    'mytheme_settings', 
    'admin_options_sanitize' 
);

$mytheme_settings = get_option( 'mytheme_settings' );

そしてフィールドマークアップ:

<textarea name="mytheme_settings[title]">
    <?php echo esc_textarea( $mytheme_settings['title'] ); ?>
</textarea>   

サニタイズ関数を組み合わせて、新しい配列の値で機能するように変更する必要もあります。

2
Dylan