問題描述

我使用的是 WordPress 3.0.5,並已經使用 3.1rc4 進行了測試。在我的外掛的主要 PHP 檔案中,當我嘗試呼叫 is_plugin_active 時,我得到 Call to undefined function is_plugin_active()。我可以呼叫 add_action 和 add_filter 。我該怎麼檢查/更改來解決這個問題?

這是在外掛頁面上的管理員內部發生的。在我的主要外掛檔案的頂部,我有,if (function_exists('is_plugin_active')) { 總是返回 false 。

我也看不到其他外掛中的主要外掛檔案的功能 (如果這有幫助的話) 。

最佳解決方案

這是因為在載入外掛後,只能載入管理員中的 is_plugin_active() 的檔案–wp-admin/includes/plugin.php

因此,您只能在’admin_init’ 觸發之後呼叫它:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );

次佳解決方案

您可以在模板和使用者頁面中呼叫 is_plugin_active(),這對於相關的外掛 (即需要外掛’xyz’ 來操作我的新外掛) 可能很有用。您需要手動新增 plugin.php 檔案,如在食典中的 is_plugin_active() 檔案中所述。

這是一個在我的高階 add-on 包中使用的功能示例,以確保在呼叫 add-on 物件之前,可用的基本外掛是活動的。它需要一些鉤子過濾器在基本外掛中可用,否則將崩潰。

include_once(ABSPATH.'wp-admin/includes/plugin.php');
if (!function_exists('is_plugin_active') || !is_plugin_active('store-locator-le/store-locator-le.php')) {
   return;
}

除此之外,如果您在活動的管理員登入中遇到了 is_plugin_active() 問題,可能是因為您在 admin_init 觸發之前進行測試。 admin_menu 在 admin_init 之前觸發,並在 admin_menu 中進行測試,之前已經有”bitten” 我。自從 admin_menu 已經執行以來,我的名字”admin_init” 似乎是 counter-intuitive 。我認為 init 是 「執行的第一件事」… 可能 admin_kinda_init() 會更好。 🙂

第三種解決方案

快速而骯髒的解決方法是手動複製功能:

function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

它很簡短,所以在你自己的程式碼中實現一個解決方法不是太難了。

參考文獻

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