問題描述

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