問題描述
我不斷地遇到同樣的煩惱,所以我想我會看到有沒有任何想法或經驗在那裡…
我建立了一個使用自己的管理頁面的外掛。它必須現在我整理了 WP_List_Table() 的東西,我必須說這是偉大的… 但….
自定義外掛頁面總是載入為 admin.php?page=...,除非我想直接從外掛目錄載入它們,我不這樣做。現在,如果我從該頁面執行’action’,我需要以某種方式處理,然後重定向到沒有 action 引數的頁面。不管我是做一個 GET 還是 POST,真的。
在所有內部頁面 WP WP 在同一頁面上,它會檢查是否有一個操作,如果是這樣處理它,然後重定向到自己沒有動作。這是可能的,因為在這些頁面上,尚未載入 admin-header 。
如果您嘗試在自己的頁面上執行此操作,那麼管理介面的一半已經被髮送到瀏覽器,所以重定向不再可能了。顯然,解決方案是將 POST /GET 直接傳送到另一個頁面,載入 WP 框架,進行處理,然後重定向到原始頁面… 但… 這有點煩人,因為… 我的原始頁面透過回撥載入,因此它在我的類的方法中執行。那好美麗。
如果我載入一個單獨的頁面,我必須手動包括 wp-load.php,並且在我的課外,這是惱人的,在我的特殊情況下,我特別是錯誤,因為我只是以匿名方式來組織我的外掛類,以便 no-one 可以訪問它外。
所以在這個漫長的故事之後… 有沒有人提出了一個很好的解決方案來載入另一個頁面透過回撥沒有整個管理介面已經設定在它周圍?
(我知道一個解決方法… 我可以掛起一個功能到 load-.... 檢查動作引數,並進行處理和重定向,但我想知道是否有更好的方法。)
謝謝。
最佳解決方案
作為經驗法則,您應該對大多數操作使用 POST 請求,以確保它們不是 executed by accident 。但是,POST 請求後重定向到正常頁面也是一個很好的做法,以防止使用者重新整理頁面時重複執行。
所以流程是這樣的:
-
您的 POST 表單的外掛頁面,提交給
-
一個處理請求的頁面,重定向到
-
您的外掛頁面,顯示操作的結果
中間頁面不一定是您的外掛頁面。這意味著您可以使用三年前提供的“generic POST handler”,admin.php 中的'admin_action_' . $_REQUEST['action']鉤子。
示例使用者是 the Akismet plugin 。如果您想要可靠地使用它,您必須直接提交給 admin.php,而不是提交給包含 admin.php 的另一個頁面。
這是一個非常基本的如何使用它的例子:
add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
// Do your stuff here
wp_redirect( $_SERVER['HTTP_REFERER'] );
exit();
}
add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}
function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
<input type="hidden" name="action" value="wpse10500" />
<input type="submit" value="Do it!" />
</form>
<?php
}
次佳解決方案
我透過簡單地新增 noheader = true 到使用者提交的頁面上的動作 URL 執行操作而略微不同
然後,我的處理程序執行操作 (即通常是新增,更新或刪除),然後使用 wp_redirect() 完成下一頁操作 (例如新增頁面 – > 編輯頁面,刪除頁面 – > 列表頁面,編輯頁面 – > 編輯頁面) 。我也在 URL 上傳遞一條訊息,以便我可以顯示一個狀態,例如更新成功或失敗。
這種方法保持所有的操作:列出,新增,編輯,刪除,bulk-delete 等在同一個類中,並使用相同的管理塊,這樣很容易維護和理解。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。