問題描述

Professional WordPress Plugin Development 書籍詳細介紹瞭如何正確使用 Settings API,並且還演示瞭如何添加菜單和子菜單,但不幸的是,它不提供任何 joined-up 的示例。雖然我已經設法使大部分工作正常,但我無法弄清楚如何在自定義菜單頁面上正確實施 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 呈現的頁面上的設置錯誤。

最佳解決方案

錯誤/通知創建和顯示過程有幾個組件:

  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 與管理頁面配合使用,不會將 「設置」 部分用作基礎。你真正的問題是,在這種情況下,錯誤/通知報告不起作用。

首先,當您發佈表單時,使用 Settings API 設置會發生什麼:

  1. 數據發佈到特殊的 options.php 頁面。

  2. 有數據使用回調進行消毒/驗證。

  3. 在清理/驗證過程中出現的任何錯誤/通知都將被收集並保存在瞬時狀態。

  4. 你被重定向到你來的地方。

現在當您加載管理頁面時,它會檢查此頁面是否屬於 「設置」 部分,如果該情況包含微小的 options-head.php 文件,則會處理檢索和顯示錯誤通知。

所以”not working” 在其他頁面上唯一的事情是後一個步驟,這對你自己來説很簡單,上面介紹了相關的功能 (我可能會介紹過多的細節,你不需要這個基本的情況) 。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。