問題描述
我注意到,一些外掛,如 Contact-form-7,Nextgen-gallery,可能是其他的,有一個有趣的 anti-feature 在 is_admin()是真的時沒有註冊他們的短碼。
有問題的是,如果要從 ajax 生成一些動態內容 (可能有短碼),並且使用”correct” wp 的方法,admin-ajax.php,不可能沒有 WP_ADMIN 為 true 。參見 admin-ajax.php 的第一行:
define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
define( 'WP_ADMIN', true );
}
現在,似乎有 PHP 擴充套件將讓你 un-set 一個定義的常量 (hacky),或者可能有一種方式來混淆無證 WP_Screen 系統和 $GLOBALS['current_screen']使 is_admin()函式返回 false?最有用的解決方法似乎是釋出到頁面或站點根目錄。
當 is_admin()為假時,外掛註冊簡訊是否常見?如果是這樣,我找不到任何檔案或理由,除了它可能是一個過早的最佳化。
最佳解決方案
我已經觀察到與 contact-form-7 一樣的問題。
但是請注意,根據 is_admin 註冊短碼是在做____ _ _ _ _ _ _ _ _ _ _ _ _(see gmazzap`s answer)
有一些似乎合法的原因有兩個原因 (為什麼它們是錯誤的):
-
(不太可能) 外掛作者試圖最佳化指令碼,只需要在需要時註冊短碼。在這種情況下,作者沒有認為在 Ajax 請求中可能會使用短碼。錯誤原因:此最佳化不能提供任何效能增益。它只是向全域性”registered shortcodes” 陣列新增一個值。
-
(這是更可能的一個) 外掛作者有意地停用對 Ajax 請求中的短程式碼的支援。使用 Contact-Form-7 可能是因為窗體可以設定為 「透過 Ajax 提交」 。但是,此功能需要表單載入其他 JavaScript 檔案,當透過 Ajax 解析短程式碼並且透過
enqueue_scripts()新增 JavaScript 時,不會載入該檔案。作者決定停用 Ajax 支援,以防止錯誤報告,如 「不要使用:窗體顯示,但單擊提交按鈕不起作用,浪費時間!」 所以使用者會看到一個 guaranteed-working 表單,或者根本沒有表單。錯誤是因為:檢查is_admin是不好的做法。條件應該檢查常數DOING_AJAX是否被定義為 true 。
雖然大多數外掛不使用這種情況,但是由於過去的問題,有限制的少數可能會有這樣的限制。
當一個短碼只是在頁面上做一些輸出時,沒有理由新增任何 admin-condition 。但是,當短碼也插入 js 或 css 檔案時,將使用限制為 non-admin /non-ajax 請求是有意義的。
次佳解決方案
實際上,沒有理由不在管理員上註冊短碼。
如果外掛作者想要停用 Ajax 外掛,他們應該做
if (defined('DOING_AJAX') && DOING_AJAX)
而不是檢查是管理員。
請注意,將來 Shortcake 可能嵌入到核心中,因為它是一個”Feature Plugin” 。
如果發生這種情況,未在 admin 中定義的 shortcode 將不會使用它。這給你另一個確認,沒有理由不在管理員註冊短碼:即使是核心開發人員正在處理需要管理員可用的短碼的東西。
也就是說,你必須有可能:
-
聯絡外掛作者,看看他們是否可以修復這種行為
-
嘗試自己找一個解決方案
關於#2,實際上存在可以強制 is_admin 為真的庫。他們是駭客,我永遠不會使用那些在生產中。
一個例子是 Patchwork 。
使用它可以覆蓋任何 PHP 自定義功能。
在 MU plugin 中,您可以 (完全未定義):
add_action('muplugins_loaded', function() {
if ( defined('DOING_AJAX') && DOING_AJAX ) {
require 'path/to/Patchwork.php';
Patchworkreplace("is_admin", function() {
return FALSE;
});
}
});
這將使 is_admin()在 ajax 請求上返回 false 。
但是,如上所述,這是非常糟糕的,並會影響其他外掛 (和核心) 行為與不可預測的效果。
您可以做的另一件事是在管理員請求上註冊外掛短程式碼處理程序。
例如。如果外掛程式碼是:
if (! is_admin()) {
add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}
那麼你可以編寫另一個外掛:
if (is_admin()) {
add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}
這兩種情況都會新增短碼。
根據其他外掛程式碼,這可能或不可以單獨工作,但是沒有一個一般的答案。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。