Когда я перемещаю пользовательское меню параметров Wordpress на верхний уровень, оно перестает сохранять настройки ввода?

Этот код добавляет меню в раздел настроек администратора Wordpress.

Сейчас объявлено add_options_page, поэтому пользовательское меню появляется внутри Настройки.

Я изменил add_options_page на add_menu_page, чтобы вывести это меню на верхний уровень, но затем оно перестало работать (когда я нажимаю, пользовательское меню открывается, но не может сохранить настроек больше).

Какой оставшийся код мне нужно изменить, чтобы это заработало?

Заранее спасибо!

<?php

add_action('admin_menu', 'create_theme_options_page');
add_action('admin_init', 'register_and_build_fields');

function create_theme_options_page() {
   add_options_page('Theme Options', 'Theme Options', 'administrator', __FILE__, 'options_page_fn');
}

function register_and_build_fields() {
   register_setting('plugin_options', 'plugin_options', 'validate_setting');

   add_settings_section('main_section', 'Main Settings', 'section_cb', __FILE__);

   add_settings_field('color_scheme', 'Color Scheme:', 'color_scheme_setting', __FILE__, 'main_section');
   add_settings_field('logo', 'Logo:', 'logo_setting', __FILE__, 'main_section'); // LOGO
   add_settings_field('banner_heading', 'Banner Heading:', 'banner_heading_setting', __FILE__, 'main_section');
   add_settings_field('adverting_information', 'Advertising Info:', 'advertising_information_setting', __FILE__, 'main_section');

   add_settings_field('ad_one', 'Ad:', 'ad_setting_one', __FILE__, 'main_section'); // Ad1
   add_settings_field('ad_two', 'Second Ad:', 'ad_setting_two', __FILE__, 'main_section'); // Ad2
}

function options_page_fn() {
?>
<div id="theme-options-wrap" class="widefat">
<div class="icon32" id="icon-tools"></div>

<h2>My Theme Options</h2>
<p>Take control of your theme, by overriding the default settings with your own specific preferences.</p>

<form method="post" action="options.php" enctype="multipart/form-data">
<?php settings_fields('plugin_options'); ?>
<?php do_settings_sections(__FILE__); ?>
<p class="submit">
<input name="Submit" type="submit" class="button-primary" value="<?php esc_attr_e('Save Changes'); ?>" />
</p>
</form>
</div>
<?php
}

// Banner Heading
function banner_heading_setting() {
   $options = get_option('plugin_options');
   echo "<input name='plugin_options[banner_heading]' type='text' value='{$options['banner_heading']}' />";
}

// Color Scheme
function color_scheme_setting() {
   $options = get_option('plugin_options');
   $items = array("White", "Black", "#DDDDDD", "#444444");

   echo "<select name='plugin_options[color_scheme]'>";
   foreach ($items as $item) {
      $selected = ( $options['color_scheme'] === $item ) ? 'selected = "selected"' : '';
      echo "<option value='$item' $selected>$item</option>";
   }
   echo "</select>";
}

// Advertising info
function advertising_information_setting() {
   $options = get_option('plugin_options');
   echo "<textarea name='plugin_options[advertising_information]' rows='10' cols='60' type='textarea'>{$options['advertising_information']}</textarea>";
}

// Ad one
function ad_setting_one() {
   echo '<input type="file" name="ad_one" />';
}

// Ad two
function ad_setting_two() {
   echo '<input type="file" name="ad_two" />';
}

// Logo
function logo_setting() {
   echo '<input type="file" name="logo" />';
}

function validate_setting($plugin_options) {
   $keys = array_keys($_FILES);
   $i = 0;

   foreach ($_FILES as $image) {
      // if a files was upload
      if ($image['size']) {
         // if it is an image
         if (preg_match('/(jpg|jpeg|png|gif)$/', $image['type'])) {
            $override = array('test_form' => false);
            $file = wp_handle_upload($image, $override);

            $plugin_options[$keys[$i]] = $file['url'];
         } else {
            $options = get_option('plugin_options');
            $plugin_options[$keys[$i]] = $options[$logo];
            wp_die('No image was uploaded.');
         }
      }

      // else, retain the image that's already on file.
      else {
         $options = get_option('plugin_options');
         $plugin_options[$keys[$i]] = $options[$keys[$i]];
      }
      $i++;
   }

   return $plugin_options;
}

function section_cb() {}

// Add stylesheet
add_action('admin_head', 'admin_register_head');

function admin_register_head() {
   $url = get_bloginfo('template_directory') . '/functions/options_page.css';
   echo "<link rel='stylesheet' href='$url' />\n";
}

person alexchenco    schedule 20.12.2010    source источник


Ответы (1)


Укажите правильный дескриптор при регистрации страницы меню (четвертый параметр).

Добавить пример меню

Добавить страницу меню верхнего уровня

add_menu_page( 'Theme Options', 'Theme Options', 'manage_options', 'my-theme-options', 'options_page_fn' );

Добавить пример подменю

Добавить страницу подменю на новую страницу верхнего уровня

add_submenu_page( 'my-theme-options', 'Theme Sub1', 'Theme Sub1', 'manage_options', 'my-theme-options-subpage1', 'my_callback_function' );

Надеюсь, это поможет..

И, пожалуйста, рассмотрите возможность публикации своих будущих вопросов по WordPress на WordPress Stack Exchange.

Однако, что касается вашей основной проблемы, попробуйте обновить вызов do_settings_section на..

<?php do_settings_sections( 'main_section' ); ?>
person t31os    schedule 20.12.2010
comment
@ t31os Я не знал о WordPress Stack Exchange. Спасибо! - person alexchenco; 20.12.2010
comment
Он еще молодой, но неуклонно растет.. :) - person t31os; 20.12.2010
comment
@ t31os Я попробовал код, который вы описали выше, и все еще не работает (я заменил add_options_page(... на ваш add_menu_page(... :(. - person alexchenco; 20.12.2010
comment
Должен ли я изменить все разделы add_settings_section на что-то вроде add_menu_section? - person alexchenco; 20.12.2010
comment
Ну, это, безусловно, сбило меня с толку, я давно не использовал функции add_settings_section и add_settings_field (есть ярлык, который вы можете использовать, но это для другой темы). Попробуйте это: wordpress.pastebin.com/bxE2vNrx - person t31os; 20.12.2010
comment
@ t31os Спасибо, все работает! Единственное, что сейчас, это то, что настройки сохранены. сообщение не появляется (но настройки сохраняются). - person alexchenco; 20.12.2010
comment
Поэтому добавьте небольшой код, чтобы увидеть, присутствует ли обновленный запрос. </php if( isset( $_GET['updated'] ) && ( 'true' == $_GET['updated'] ) ) : ?>Settings updated.<?php endif; ?> или аналогичный. Страница options.php, которую отправляет ваша форма, отправляет их в перенаправлении после сохранения (посмотрите URL-адрес своей страницы после сохранения настроек). - person t31os; 20.12.2010
comment
@ t31os Еще раз спасибо, еще один вопрос: где разместить код выше? (между тегами html или внутри функции?). Кстати URL-адрес после сохранения: localhost/wordpress/wp-admin/ - person alexchenco; 20.12.2010
comment
<?php if( isset( $_GET['updated'] ) && ( 'true' == $_GET['updated'] ) ) : ?><div class="updated">Settings saved.</div><?php endif; ?> вставьте это после заголовка (h2) на странице настроек.. - person t31os; 20.12.2010