web-dev-qa-db-ja.com

Settings APIが私のオプションの配列を保存していないのはなぜですか

標準のWordPressメニューのサブメニューからアクセスできるオプションページを簡単に作成するための一連のクラスと、そのメニューのオプションを簡単に作成する方法を書いています。私が配線している方法は、あなたが設定を渡す設定クラスを経由することであり、メニュー、設定ページを作成し、オプションを単一のオプションにきちんと格納するためにサブメニュークラスと一緒に動作させるつもりです。オプションはデータベースに作成されています - しかし、オプションには何も格納されていません。誰かが私を正しい方向に導くことができますか?これが私のコードです:

設定クラス

class settings_page {
    public function __construct($args){
        foreach($args['sections'] as $section){
            $section_name = $section['section_name'];
            $section_id = $section['section_id'];
            if( false == get_option( $section_id ) ) {     
                add_option( $section_id );  
            } 
            $options = get_option($section_id);
            $section_text = $section['section_text'];
            $page = $section['page'];
            add_settings_section($section_id, $section_name, function(){return $section_text;}, $page);
            foreach($section['items'] as $item) {
                $type = $item['type'];
                $id = $item['id'];
                $description = $item['description'];
                $title = $item['title'];
                $choices = $item['choices'];
                if ($description) $title = $title . '<br /><small class="italic">' . $description . '</small>';
                switch($type){
                    case "checkbox":
                        add_settings_field($id, $title, 
                                function ($section) use ($options) {
                                    $id = $section[0];
                                    $html = '<input type="checkbox" id="' . $id . '" name="' . $id . '" value="1" ' . checked(1, $options[$id], false) . '/>';  
                                    echo $html;  
                                },
                        $page, $section_id, array($id));
                    break;
                    case "text":
                        add_settings_field($id, $title, 
                                function ($section) use ($options) {
                                    $id = $section[0];
                                    unset($html);
                                    $html .= '<input type="text" id="' . $id . '" name="' . $id . '" value="' . $options[$id] . '" />';  
                                    echo $html;  
                                },
                        $page, $section_id, array($id));
                    break;
                    case "textarea":
                        add_settings_field($id, $title, 
                                function ($section) use ($options) {
                                    $id = $section[0];
                                    unset($html);
                                    $html .= '<textarea class="large-text" cols="50" rows="10" type="text" id="' . $id . '" name="' . $id . '">' . $options[$id] . '</textarea>';  
                                    echo $html;  
                                },
                        $page, $section_id, array($id));
                    break;
                    case "pulldown":
                        add_settings_field($id, $title, 
                                function ($section) use ($options) {
                                    $id = $section[0];
                                    $choices = $section[1];
                                    $value = $options[$id];
                                    unset($html);
                                    $html = '<select id="' . $id . '" name="' . $id . '">';
                                    $html .= '<option value=""> - Select - </option>';
                                    foreach($choices as $key=>$val){
                                        $selected = '';
                                        if ($value== $key) $selected = ' selected="selected" ';
                                        $html .= '<option value="' . $key . '"' . $selected . '>'.$val.'</option>';
                                    }
                                    $html .= '</select>';

                                    echo $html;  
                                },
                        $page, $section_id, array($id, $choices));
                    break;                  
                }

            }
            register_setting($page, $section_id);
        }

        new submenu(array(
            "parent" => $args['parent'],
            "title"=>$args['title'],
            "text"=>$args['text'],
            "capability"=>$args['capability'],
            "slug"=>$args['slug']

        ));

    }
}

サブメニュークラス

<?php

class submenu {

    function __construct($args=""){
            $parent = strtolower($args['parent']);
            $title = $args['title'];
            $text = $args['text'];
            $capability = $args['capability'];
            $slug = $args['slug'];

            switch($parent){
                case 'dashboard': 
                    $name = "index.php";
                    break;
                case 'posts':
                    $name = 'edit.php';
                    break;
                case 'media':
                    $name='upload.php';
                    break;
                case 'links':
                    $name='link-manager.php';
                    break;
                case 'pages':
                    $name='edit.php?post_type=page';
                    break;
                case 'comments':
                    $name='edit-comments.php';
                    break;
                case 'appearance':
                    $name='themes.php';
                    break;
                case 'plugins':
                    $name='plugins.php';
                    break;  
                case 'users':
                    $name='users.php';
                    break;  
                case 'tools':
                    $name='tools.php';
                    break;  
                case 'settings':
                    $name='options-general.php';
                    break;  
                default:
                    $name='options-general.php';
                    break;  
            }
            add_action('admin_menu', function() use ($name, $title, $text, $capability, $slug) {

                    add_submenu_page(  
                        $name,                  
                        $title,          
                        $text,                  
                        $capability,            
                        $slug, function() use  ($name, $title, $text, $capability, $slug) {
                       ?>
                            <div class="wrap">  


                                <div id="icon-themes" class="icon32"></div>  
                                <h2><?php echo $title; ?></h2>  
                                <form method="post" action="options.php">  
                                    <?php settings_fields( $slug ); ?>  
                                    <?php do_settings_sections( $slug );?>    
                                    <?php submit_button(); ?>  
                                </form>  

                            </div>

                       <?php
                        }

                    );
                }
            );



        }
    }

これが私が実際にクラス/メソッドを呼んでいるところです

add_action('admin_menu', 
    function() {
        $options['parent'] = "settings";
        $options['title'] = "My Settings";
        $options['text'] = "My Settings";
        $options['capability'] = "manage_options";
        $options['slug'] = "my_settings";

        $settings['section_name'] = "General Section";
        $settings['section_id'] = "general_section";
        $settings['section_text'] = "This be General Section Test";
        $settings['page'] = "my_settings";
        $settings['items'] = array(
            array(
                'type' => 'checkbox',
                'id' => 'show_header',
                'title' => 'The title, to show header',
                'description' => 'show the header now please',
                ),
            array(
                'type' => 'textarea',
                'id' => 'show_footer',
                'title' => 'The title, to show footer',
                'description' => 'show the footer now please',
                ),  
            array(
                'type' => 'text',
                'id' => 'text_item',
                'title' => 'Enter anything here',
                'description' => '',
                ),          
            array(
                'type' => 'pulldown',
                'id' => 'which_one',
                'title'=>'Who\'s on First?',
                'description'=>'',
                'choices'=>array(
                        '1'=>'Who',
                        '2'=>'What',
                        '3'=>'Why',
                    )
                ),
            );
        $settings2['section_name'] = "Second Section";
        $settings2['section_id'] = "second_section";
        $settings2['section_text'] = "More Settings";
        $settings2['page'] = "my_settings";
        $settings2['items'] = array(
            array(
                'type' => 'checkbox',
                'id' => 'show_header_2',
                'description' => 'Show Second Header',
                'title' => 'Show the Second Header?',
                ),
            array(
                'type' => 'textarea',
                'id' => 'show_footer_2',
                'description' => 'Tell me a story',
                'title' => 'It can be about anything!',
                ),  
            );

        $options['sections'][] = $settings;
        $options['sections'][] = $settings2;
        new settings_page($options);
    }, 1);

何が動作します:

$ options [$ id]get_option($ id)に変更しても動作しますが、これはそれぞれの設定をそれぞれ独自に保存しますデータベース内の個々の設定は非常に非効率的です。 register_settingを呼び出す直前に$ page、$ section_idをerror_loggedしました。

うまくいかないこと:これらの設定を直列化された配列に保存する:)

あなたが私を助けるのを助けることができる何か他のものを提供させていただきます。

ありがとう。

1
setterGetter

Nameパラメータを "$ id"に設定しています。これは、それらが "show_header_2"のようなものになることを意味します。実際には、それらを "second_section [show_header_2]"にし、代わりに似たものにしたいので、設定の配列がフォームから返されるものになります。

6
Otto