Как реализовать add_settings_error на страницах пользовательских меню?

8

В книге « Профессиональная разработка плагинов для WordPress» подробно объясняется, как правильно использовать API настроек, а также демонстрируется, как добавлять меню и подменю, но, к сожалению, в ней не содержится никаких объединенных примеров этого. Несмотря на то, что мне удалось заставить работать большую часть этого, я не могу понять, как правильно реализовать add_settings_error на пользовательских страницах меню. Вот мой код:

function settings_main_validate( $input ) {
$valid['text_string'] = preg_replace( '/[^a-zA-Z]/', '', $input['text_string'] );

if ( $valid['text_string'] != $input['text_string'] ) {
    //add_setting_error: $title, $id, $error_message, $class
    add_settings_error( 'fields_main_input', 'texterror', 'Incorrect value entered!', 'error' );
}   

return $valid;
}                  

Приведенная выше проверка будет отлично работать при настройке визуализации с использованием add_options_page, но не будет отображать ошибки настроек на страницах, отображаемых с add_menu_page.

jnthnclrk
источник

Ответы:

8

Существует несколько компонентов для создания ошибки / уведомления и процесса отображения:

  1. add_settings_error()вызов для добавления элемента в стек (глобальная $wp_settings_errorsпеременная).
  2. settings_errors переходный процесс, который сохраняет ошибки, чтобы они выживали перемещаться со страницы на страницу.
  3. settings_errors()функция get_settings_errors()для извлечения ошибок из памяти или переходных процессов, а затем отображает их.

Они работают как прелесть для настроек API, но, к сожалению, они не настроены для общего использования. С другой стороны, обойти это тривиально.

Крючок settings_errors()для admin_noticesна странице вашего плагина, передать код ошибки к нему , так что только показывает свои вещи.

Вручную сохраняйте ошибки для settings_errorsпереходного процесса (просто вставьте в него глобальную переменную).

Поскольку get_settings_errors()в GET-параметрах ( $_GET['settings-updated']) ожидается подсказка о том, что он должен проверять переходные процессы вместо памяти, вы можете либо предоставить это, либо получить ошибки от переходных процессов самостоятельно и сохранить их обратно в глобальную переменную перед вашим settings_errors()вызовом.

Обновить

Вы превращаете это в беспорядок с несколькими вопросами, поэтому я постараюсь решить ваши проблемы здесь.

Настройки API делает работу с администратором страницами, которые не используют раздел Настройки в качестве базы. Ваша настоящая проблема в том, что в этом случае сообщение об ошибке / уведомлении не работает.

Сначала вот что происходит, когда вы публикуете форму, настроенную с помощью API настроек:

  1. Данные размещаются на специальной options.phpстранице.
  2. Там данные очищаются / проверяются с помощью обратного вызова.
  3. Любые ошибки / уведомления, появившиеся во время очистки / проверки, собираются и сохраняются в переходном процессе.
  4. Вы перенаправлены обратно туда, откуда пришли .

Теперь, когда вы загружаете страницу администратора, она проверяет , относится ли эта страница к разделу «Настройки», и содержит ли этот options-head.phpфайл крошечный файл, который занимается поиском и отображением уведомлений об ошибках.

Таким образом, единственное, что «не работает» на других страницах, - это последний шаг, который тривиально выполнить самостоятельно с обзором связанной функции выше (я, вероятно, углубился в подробности переходного процесса, вам это не понадобится для базового случая).

Rarst
источник
Вы говорите, что API настроек на самом деле не предназначен для использования в меню и экранах администратора?
jnthnclrk
@trnsfrmr хорошо, я не могу сказать, был ли он разработан или не был спроектирован , но он определенно не настроен для этого изначально.
Первый
Черт, тогда я все понял неправильно. Итак, API настроек предназначен только для экранов, которые живут под пунктом меню «Настройки»? Оглядываясь назад, это объясняет, почему использовать его в пользовательских меню было так сложно.
jnthnclrk
Кажется позором, что все интересные функции API настроек недоступны для плагинов, использующих пользовательские меню.
jnthnclrk
@trnsfrmr хорошо, вы все еще можете попробовать и использовать это, просто требует дополнительных усилий
Rarst
0

Немного поздно, но я только что прошел через это. Основываясь на коде OP, лучшее решение, которое я нашел, состоит в том, чтобы вставить этот код:

function your_admin_notices_action() {
    settings_errors( 'fields_main_input' );
}
add_action( 'admin_notices', 'your_admin_notices_action' );

Это добавит отображение уведомления администратора на страницы администратора, отображаемые с помощью add_menu_page

Бев
источник
-1

Просто добавив

include_once 'options-head.php'; 

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

Джеймс Смартт
источник