標準の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しました。
うまくいかないこと:これらの設定を直列化された配列に保存する:)
あなたが私を助けるのを助けることができる何か他のものを提供させていただきます。
ありがとう。
Nameパラメータを "$ id"に設定しています。これは、それらが "show_header_2"のようなものになることを意味します。実際には、それらを "second_section [show_header_2]"にし、代わりに似たものにしたいので、設定の配列がフォームから返されるものになります。