問題描述

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