問題描述

我注意到,一些插件,如 Contact-form-7Nextgen-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)

有一些似乎合法的原因有兩個原因 (為什麼它們是錯誤的):

  1. (不太可能) 插件作者試圖優化腳本,只需要在需要時註冊短碼。在這種情況下,作者沒有認為在 Ajax 請求中可能會使用短碼。錯誤原因:此優化不能提供任何性能增益。它只是向全局”registered shortcodes” 數組添加一個值。

  2. (這是更可能的一個) 插件作者有意地禁用對 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 將不會使用它。這給你另一個確認,沒有理由不在管理員註冊短碼:即使是核心開發人員正在處理需要管理員可用的短碼的東西。

也就是説,你必須有可能:

  1. 聯繫插件作者,看看他們是否可以修復這種行為

  2. 嘗試自己找一個解決方案

關於#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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。