Intereting Posts
Как группировать 2 переключателя в виджетах? Как удалить черновики страниц без влияния на опубликованную страницу Как включить последнее сообщение определенной категории на соответствующей странице Выбросить пользовательские поля в комментариях Пользовательский «метаконференц-переключатель» не сохраняется правильно Показать таблицу из данных, представленных формой от пользователя Категории и подкатегории Как reset_postdata восстанавливает пост основного цикла запроса? Использование изображений в WordPress – лучшие практики Как запросить таблицу wp_postmeta для любого конкретного meta_value? Настройка WordPress the_title с помощью add_filter Обработка форм с плагином Paypal Framework Отображать только текущий номер страницы и другую пронумерованную страницу в разбивке на страницы Встраивать shortcode в wordpress ajax request Как изменить цвет фона в поле контакта?

Где представлен массив $ _POST, хранящийся после отправки страницы с параметрами?

Что происходит, когда я нажимаю кнопку « Save Changes на странице параметров, которая была создана с помощью add_menu_page() ? Где хранятся данные перед передачей базы данных?

Функция print_r($_REQUEST) возвращает только две page параметров $_GET и settings-updated .

Я проверил руководство для add_settings_field и есть только следующий намек:

… сохранение будет выполнено за кулисами.

Задний план

Я хотел бы оптимизировать свой процесс создания страницы настроек плагина. Я уже вскочил на WP Settings API с add_settings_section и add_settings_field долгое время назад, но мне кажется неудобно создавать новую функцию обратного вызова каждый раз. Поэтому вместо того, чтобы создавать специальный код поля / раздела внутри обратного вызова, я хотел бы создать полную страницу настроек с Zend_View . Все поля ввода будут созданы с помощью Zend_Form и также прикреплены к представлению. В конце концов, обратный вызов add_menu_page() вернет визуализированный объект View-Object вместо обычного вывода HTML.

HTML хранится внутри View-Template, который находится в views/pages/admin/ (например, default.phtml ).

Основной принцип уже работает. Я очень доволен результатом. Из-за использования Zend_View , я должен сделать сохранение самостоятельно. Но WordPress, кажется, удаляет представленный массив $ _POST. Если я отлаживаю вывод после успешной отправки формы, устанавливаются только два параметра $_GET указанные выше.

Я также добавил вывод функции settings_fields() в представление, которое генерирует необходимые скрытые поля ( option_page , action , _wp_nonce ).

Есть идеи?

Solutions Collecting From Web of "Где представлен массив $ _POST, хранящийся после отправки страницы с параметрами?"

Вам нужна только одна функция обратного вызова, как определено в вашем вызове register_setting() ( Codex ref. ):

 register_setting( $option_group, $option_name, $sanitize_callback ); 

Таким образом, все параметры содержатся в массиве в одной записи базы данных $option_name .

Затем функции обратного вызова передается переменная $input которая содержит все данные, представленные в форме, функция обрабатывает / дезинформирует эти данные и возвращает обработанный результат:

 function mytheme_sanitize_callback( $input ) { // sanitization functions go here return $sanitized_output; } 

Итак: одна запись в базе данных, как массив параметров; и один обратный вызов санитарной обработки для предоставленных пользователем данных.

Для получения дополнительной справки вы можете обратиться к этому руководству .

Наконец-то я нашел свою ошибку.

«Проблема» с Zend_View и Zend_Form заключается в том, что вы должны сами проверить и сохранить предоставленные настройки. Но если вы зарегистрируете крючок sanitize с register_setting() , WordPress действительно не вернет массив $_POST и немедленно отправит данные в определенный параметр в базе данных.

Решение состояло в том, чтобы полностью удалить вызов register_setting() . Я также удалил вызов settings_field() и установил скрытые поля вручную в объекте Zend_Form .

 $form = new Zend_Form(); $form->setAction('options.php?page=' . $this->getMenuSlug()) ->setMethod('post'); $wpnonce = $form->createElement('hidden', '_wp_nonce'); $wpnonce->setValue(wp_create_nonce($this->getMenuSlug())); 

Метод $this->getMenuSlug() вернет идентификатор текущей страницы администратора, используемой в add_page_menu() .

Последняя часть должна была выполнить проверку формы перед повторением объекта Zend_View . Это делается в renderView() , который будет вызван как обратный вызов в add_menu_page() .

 public function renderView() { try { if($_POST['submit']) { // Check wp nonce if(!wp_verify_nonce($_POST['_wp_nonce'], $this->getMenuSlug())) { wp_die(__('Nonce incorrect!')); } else { if($this->_form->isValid($_POST)) { echo '<div id="message" class="updated fade"><p><strong>' . __('Settings saved.') . '</strong></p></div>'; foreach ($this->_form->getElements() as $element) { if(in_array($element->getName(), $this->_skipElements)) { continue; } Webeo_Option::getInstance()->setValue($element->getName(), $element->getValue()); } Webeo_Option::getInstance()->commit(); } else { echo '<div id="message" class="error fade"><p><strong>' . __('Errors occured.') . '</strong></p></div>'; } } } echo $this->_form->render($this->_view); //echo $this->_view->render($this->getViewTemplate()); } catch (Zend_View_Exception $e) { echo $e->getMessage(); } } 

Webeo_Option – это просто хранилище объектов и может быть заменено на update_option() .