is_plugin_active函数不存在


17

我正在使用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。

我也看不到其他插件的主插件文件中的功能(如果有帮助的话)。


从您的描述中我不确定-如果是激活的插件是否有此问题,或者您是在激活时还是在其他特定条件下尝试执行某些操作?
拉斯特

我发现function_exists('is_plugin_active')如果在方法外部从主插件文件调用时为false,但在为activated_plugin操作调用的方法内部调用时为true 。
卡尔,

您在哪一页上看到错误?插件页面(wp-admin / plugins.php)?这是在激活相关插件之前还是之后?腊斯特有一个好处。您知道在什么时候用wordpress调用函数吗?
Jonnybojangles

激活插件后,我在wp-admin / plugins.php上看到错误。我已经检查了作为动作挂钩的某些方法,并且该方法在这里起作用。似乎与包含顺序有关。
卡尔,

插件按字母顺序加载,因此可能仅仅是因为您的插件未得到足够的早期处理。尝试重命名您的插件以字母a(例如a_myplugin-name)开头,以便它可以更早加载。但是,最好的选择是从加载插件后运行的函数中调用function_exists块。您可以在WP Codex上看到粗略的运行顺序:codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Answers:


29

这是因为在其中定义了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' );

如果我已经在管理员中,是否有可能配置错误的东西使我无法访问此文件?
卡尔,

1
查看最新答案。
scribu 2011年

10

您也可以在模板中以及在用户页面中调用is_plugin_active(),这对于相关的插件很有用(例如,需要插件“ xyz”才能操作我的新插件)。您需要按照Codex的is_plugin_active()文档中的说明手动添加plugin.php文件。

这是我在高级附加组件包中使用的一个功能示例,以确保在调用附加对象之前,免费基本插件处于活动状态。它要求某些插件和过滤器在基本插件中可用,否则它将崩溃。

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;
}

顺便说一句,如果您在活动admin登录中遇到is_plugin_active()问题,则可能是因为您在admin_init触发之前进行了测试。admin_menu在admin_init之前触发,并且在admin_menu中进行测试之前已经“咬伤”了我。名称“ admin_init”对我来说似乎违反直觉,因为admin_menu已经运行。我认为init是“要运行的第一件事” ...也许admin_kinda_init()会更好。:)


添加include_once(ABSPATH.'wp-admin/includes/plugin.php');对我有用。谢谢!
戴夫

8

一个快速而肮脏的解决方法是手动复制该功能:

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

它很短,因此在您自己的代码中作为解决方法应该不太困难。


4

简单容易。取自WP

if ( ! function_exists( 'is_plugin_active' ) )
     require_once( ABSPATH . '/wp-admin/includes/plugin.php' );

然后是

 if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {

   }

获得功能检查。所以没有更多的错误。


1
如果您正在使用requireonce,则可能不需要检查功能...?
Phill Healey

这样做是为了确保在尝试使用插件之前已定义了该插件,否则可能会遇到麻烦。
斯宾塞·拉巴迪

3

我更喜欢Tom Auger的答案,即如何定义自己的is_plugin_active函数,而不是包括plugin.php。但是,使用相同的函数名称导致我的管理区域崩溃。使用不同的函数名称可以解决该问题:

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

我同意。尽管您可以在函数声明中检查冲突,但WP不会,因此您的WP将触发错误。
克里斯·斯普拉格

1

您是is_plugin_active在管理员内部还是在前端内部使用?我很确定那is_plugin_active只是wp-admin / includes / plugin.php中的管理功能。

此外,您的主插件文件是否使用了Wordpress File Header?加载上述plugin.php文件之后,是否包含您的插件?


这是在“插件”页面上的管理员内部进行的。该插件确实具有建议的WP文件头。如何检查plugin.php之后是否包含该插件?
卡尔,

1

要调试活动插件:

var_dump(get_option(...));

要检查特定的插件:

in_array(get_option(...));

该动作称为“ active_plugins” IIRC。


0

这些解决方案都不适合我,但这确实做到了:

include_once('wp-admin/includes/plugin.php');

我在codebangers.com找到了这个解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.