前提・実現したいこと
WordpressのSettings APIで 各カスタム投稿タイプ用の値を設定する設定画面 を作ろうとしています。
現時点でいくつかエラーが発生しており、原因がわからず投稿させていただきます。
発生している問題・エラーメッセージ
【問題1】「add_settings_field」のところで、フォームを2つ作りたいのですが、1つしかフォームが作成されません。
foreachで2つ分のフォーム設定が回されている事は確認したのですが、「add_settings_field」のところで、フォームが作成されず、下記画像のように、2番目のフォームだけ作成されます。
input_category_slug と input_post_ids の2つのフォームができてほしいです。
【問題2】1つだけ作成されたフォームに値を保存しても、データベースに保存されません。
作成されたフォームに「test」といれて保存ボタンを押したのですが、リロード後に値が入っておらず、保存されません。データベースにも保存されていない事を確認しました。
該当のソースコード
register_settingメソッドの値のサニタイズ用メソッドは、いったんコメントアウトで外しております。
<?php class CreateSettingsPage { private $options; private $post_type; private $settings = array(); public function __construct() { add_action('admin_menu', array($this, 'add_settings_page')); add_action('admin_init', array($this, 'settings_page_init')); $this->post_type = $_GET['post_type']; // var_dump($this->post_type); $this->settings = array( 'page' => 'post-type-settings-admin', 'page_title' => __('Post Type Settings', 'tcd-w'), 'page_slug' => 'post_type_top', 'option_name' => 'post_type_top', 'sections' => array( array( 'id_prefix' => 'post_type_settings', 'section_title' => __('Add Links to Post Type Top', 'tcd-w'), 'section_info' => __('Please input category page slug and post ids which are added to the post type top page', 'tcd-w'), 'fields' => array( // 2つ分のフォーム設定 array( 'field_id' => 'input_category_slug', 'field_title' => 'input_category_slug', 'type' => 'input', ), array( 'field_id' => 'input_post_ids', 'field_title' => 'input_post_ids', 'type' => 'input', ), ), ), // array(), ), ); } public function add_settings_page() { //put a menu within all custom types if apply $post_types = get_post_types(); foreach ($post_types as $post_type) { //check if there are any taxonomy for this post type $post_type_taxonomies = get_object_taxonomies($post_type); foreach ($post_type_taxonomies as $key => $taxonomy_name) { $taxonomy_info = get_taxonomy($taxonomy_name); if (empty($taxonomy_info->hierarchical) || $taxonomy_info->hierarchical !== TRUE) unset($post_type_taxonomies[$key]); } if (count($post_type_taxonomies) == 0) continue; if ($post_type == 'post') { add_submenu_page('edit.php', $this->settings['page_title'], $this->settings['page_title'], 'manage_options', $this->settings['page_slug'] . '_' . $post_type, array($this, 'create_admin_page')); } elseif ($post_type == 'attachment') { add_submenu_page('upload.php', $this->settings['page_title'], $this->settings['page_title'], 'manage_options', $this->settings['page_slug'] . '_' . $post_type, array($this, 'create_admin_page')); } else { add_submenu_page('edit.php?post_type=' . $post_type, $this->settings['page_title'], $this->settings['page_title'], 'manage_options', $this->settings['page_slug'] . '_' . $post_type, array($this, 'create_admin_page')); } } } public function create_admin_page() { $this->options = get_option($this->settings['sections']['option_name']); ?> <div class="wrap"> <h2><?php echo $this->settings['page_title']; ?></h2> <p></p> <?php settings_errors(); ?> <form method="post" action="options.php"> <?php settings_fields($this->settings['option_name'] . '_option_group'); do_settings_sections($this->settings['page']); submit_button(); ?> </form> </div> <?php } public function settings_page_init() { register_setting( $this->settings['option_name'] . '_option_group', // option_group $this->settings['sections']['option_name'] // , // option_name // array($this, 'sanitize') // sanitize_callback ); foreach ($this->settings['sections'] as $section) { add_settings_section( $section['id_prefix'] . '_section', // id $section['section_title'], // title array($this, 'section_info'), // callback $this->settings['page'] // page ); foreach ($section['fields'] as $field) { // フォームを複数作りたいのですが、上手くフォームが作成されません。 add_settings_field( $field['field_id_prefix'] . '_' . $this->post_type, // id $field['field_title'], // title array($this, $field['type']), // callback $this->settings['page'], // page $section['id_prefix'] . '_section', // section $field ); } } } public function sanitize($input) { return $input; } public function section_info() { echo $section['section_info']; } public function input($field) { printf( '<input class="regular-text" type="text" name="%s[%s]" id="%s" value="%s">', $this->settings['option_name'], $field['field_id'], $field['field_id'], isset($this->options[$field['field_id']]) ? esc_attr($this->options[$field['field_id']]) : '' ); } public function textarea($field) { printf( '<textarea class="large-text" rows="5" name="%s[%s]" id="%s">%s</textarea>', $this->settings['option_name'], $field['field_id'], $field['field_id'], isset($this->options[$field['field_id']]) ? esc_attr($this->options[$field['field_id']]) : '' ); } } if (is_admin()) $post_type_settings = new CreateSettingsPage();
何かエラー原因がわかる方ご教示頂ければ幸いです。何卒よろしくお願いいたします
あなたの回答
tips
プレビュー