Процедура обновления: взаимодействие с пользовательским подтверждением

См. Также здесь, после второго, думаю, этот вопрос ориентирован на wp, поэтому я перемещаю его сюда.

Я пытаюсь разработать плагин wordpress, который можно обновлять плавно и, что более важно, я хочу, чтобы пользователь выбирал, обновлять или нет.

Я почти добрался туда, но мне нужно обновить страницу настроек плагинов вручную, чтобы увидеть, как обновление выполнено.

Чтобы сделать мой вопрос более ясным, давайте посмотрим следующий код:

<?php class myplugin_admin_setting_class { private $options; public function __construct() { add_action('admin_menu', array( $this, 'myplugin_admin_menu' )); add_action('admin_init', array( $this, 'myplugin_admin_init' )); } public function myplugin_admin_menu() { add_options_page('My Plugin Setting Page', 'MyPlugin', 'manage_options', 'myplugin', array( $this, 'myplugin_admin_page' )); } public function myplugin_admin_page() { $this->options = get_option('myplugin_options'); ?> <div class="wrap"> <form action='options.php', method='post'> <?php setting_fields('myplugin_admin_page'); do_settings_sections('myplugin_admin_page'); submit_button('Upgrade'); ?> </form> </div> <?php } public function myplugin_admin_init() { register_setting('myplugin_upgrade_page', 'myplugin_options'); add_settings_section('myplugin_version', //section id __('Version infomation', 'myplugin') , 'myplugin_upgrade_callback', 'myplugin_upgrade_page' //page ); add_settings_field('ver', 'Current Version:', array( $this, 'myplugin_upgrade_render' ) , 'myplugin_upgrade_page', //page 'myplugin_version', //section array( 'field' => 'ver' )); add_settings_field('upgrade_confirm', 'Upgrade?', array( $this, 'myplugin_upgrade_confirm_render' ) , 'myplugin_upgrade_page', //page 'myplugin_version', //section array( 'field' => 'upgrade_confirm' )); } public function myplugin_upgrade_render($args) { $this->options = get_option('myplugin_options'); $field = $args['field']; $value = $this->options['ver']; //we add the hidden filed to save 'ver' option echo "<input type='text' size='4' disabled='disabled' value='<?php echo $value; ?>'>"; echo "<input name='myplugin_options[<?php echo $field; ?>]' type='hidden' value='<?php echo $value; ?>'>"; } public function myplugin_upgrade_confirm_render($args) { $this->options = get_option('myplugin_options'); $field = $args['field']; $value = $this->options['upgrade_confirm']; ?> <input type="checkbox" name="myplugin_options[<?php echo $field; ?>]" id="<?php echo $field; ?>" <?php checked($value, true); ?> value="1" /> <?php } public function myplugin_upgrade_callback() { //check user option of upgrade true/false if ($this->options['upgrade_confirm']) { echo "Do upgrade!"; //the fake code $options = get_option('myplugin_options'); $options['upgrade_confirm'] = false; // No upgrade again $options['ver'] = 'new version'; //update the 'ver' filed update_option('myplugin_options', $options); //I want to add a function/action/filter here to refresh the setting page but failed. } } } 

В приведенном выше коде я добавляю административное меню MyPlugin, которое имеет страницу (называемую myplugin_admin_page ), сгенерированную функцией myplugin_admin_page() . Эта страница включает в себя раздел myplugin_version с filed called ver , реальный рендер этого myplugin_upgrade_render() выполняется myplugin_upgrade_render() . В add_settings_section() у нас есть обратный вызов myplugin_upgrade_callback() , который будет выполнять реальное обновление.

Проблема заключается в том, что, хотя база данных изменена после нажатия кнопки «Обновить», но кажется, что страница настроек не обновляется автоматически (я также отмечаю, что есть уведомление о том, что настройки сохранены, поэтому, возможно, перезагрузите?), Поскольку поле ver не меняется.

В приведенном выше коде есть некоторые ошибки зеркал, и я нахожу, что могу решить следующие проблемы. У меня есть пошаговый взгляд на прогресс отправки, и я нахожу, что мы можем помещать информацию в обратный вызов секции и добавлять все необходимые обновления для обновления после этого раздела, тогда это сработает.

Полный код:

 <?php class myplugin_admin_setting_class { private $options; public function __construct() { add_action('admin_menu', array( $this, 'myplugin_admin_menu' )); add_action('admin_init', array( $this, 'myplugin_admin_init' )); } public function myplugin_admin_menu() { add_options_page('My Plugin Setting Page', 'MyPlugin', 'manage_options', 'myplugin', array( $this, 'myplugin_admin_page' )); } public function myplugin_admin_page() { $this->options = get_option('myplugin_options'); ?> <div class="wrap"> <h2> Settings </h2> <form action='options.php', method='post'> <?php @settings_fields('myplugin_upgrade_page'); @do_settings_sections('myplugin_admin_page'); submit_button('Upgrade'); ?> </form> </div> <?php } public function myplugin_admin_init() { register_setting('myplugin_upgrade_page', 'myplugin_options'); $this->options = get_option('myplugin_options'); $this->options['ver']='old version'; update_option('myplugin_options', $this->options); add_settings_section('myplugin_version', //section id __('Version infomation', 'myplugin') , array( $this, 'myplugin_upgrade_callback'), 'myplugin_admin_page' //page ); add_settings_field('ver', 'Current Version:', array( $this, 'myplugin_upgrade_render' ) , 'myplugin_admin_page', //page 'myplugin_version', //section array( 'field' => 'ver' )); add_settings_field('upgrade_confirm', 'Upgrade?', array( $this, 'myplugin_upgrade_confirm_render' ) , 'myplugin_admin_page', //page 'myplugin_version', //section array( 'field' => 'upgrade_confirm' )); } public function myplugin_upgrade_render($args) { $this->options = get_option('myplugin_options'); $field = $args['field']; $value = $this->options[$field]; //we add the hidden filed to save 'ver' option echo "<input type='text' size='4' disabled='disabled' value='". $value ."'>"; echo "<input name='myplugin_options[". $field ."]' type='text' value='".$value."'>"; } public function myplugin_upgrade_confirm_render($args) { $this->options = get_option('myplugin_options'); $field = $args['field']; $value = $this->options[$field]; ?> <input type="checkbox" name="myplugin_options[<?php echo $field; ?>]" id="<?php echo $field; ?>" <?php checked($value, true); ?> value="1" /> <?php } public function myplugin_upgrade_callback() { //check user option of upgrade true/false $this->options = get_option('myplugin_options'); if ($this->options['upgrade_confirm']) { echo "Do upgrade!"; //the fake code $options = get_option('myplugin_options'); $options['upgrade_confirm'] = false; // No upgrade again $options['ver'] = 'new version'; //update the 'ver' filed update_option('myplugin_options', $options); }else{ echo "Please check the upgrade field<br>"; if($this->options['ver']!='new version') { echo "display upgrade details"; } } } }