我正在使用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调用函数吗?

激活插件后,我在wp-admin / plugins.php上看到错误。我已经检查了一些作为动作挂钩的方法,并且可以在其中运行。似乎与包含顺序有关。

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

#1 楼

这是因为定义了is_plugin_active()的文件-wp-admin/includes/plugin.php-仅在插件加载后才在admin中加载。 br />
function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );


评论


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

–卡尔
2011-02-15 14:03

查看最新答案。

–抄写员
11年4月30日在0:06

#2 楼

您也可以在模板中以及在用户页面中调用is_plugin_active(),这对于相关的插件很有用(即,要求插件“ xyz”才能操作我的新插件)。您需要按照Codex上is_plugin_active()文档中的说明手动包含plugin.php文件。在调用附加对象之前处于活动状态。它需要某些插件和过滤器才能在基本插件中使用,否则它将崩溃。一个活动的管理员登录,这很可能是因为您在admin_init触发之前进行了测试。 admin_menu在admin_init之前触发,并且在admin_menu中进行测试之前已经“咬伤”了我。因为已经运行了admin_menu,所以名称“ admin_init”对我来说似乎违反直觉。我认为init是“要运行的第一件事” ...也许admin_kinda_init()会更好。 :)

评论


添加include_once(ABSPATH.'wp-admin / includes / plugin.php');为我做了把戏。谢谢!

–戴夫
'18 Apr 12在0:42



#3 楼

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

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


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

#4 楼

我更喜欢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将触发错误。

–克里斯·斯普拉格(Chris Sprague)
'18 Sep 9'在10:54

#5 楼

简单容易。取自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' ) ) {

   }


的任何实例获取功能检查。所以没有更多的错误。

评论


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

– Phill Healey
17 Mar 23 '17 at 20:07



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

– Spencer Labadie
19年2月19日在18:06

#6 楼

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

另外,您的主插件文件是否使用Wordpress文件头?加载上述plugin.php文件后,是否包含您的插件?

评论


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

–卡尔
2011-02-15 14:02



#7 楼

要调试活动的插件:

var_dump(get_option(...));


要检查特定的插件:

in_array(get_option(...));


调用该动作“ active_plugins” IIRC。

#8 楼

如果您正在使用elementor且仅在前端遇到问题并且它在编辑器视图中起作用。
if ( \Elementor\Plugin::$instance->editor->is_edit_mode() && is_plugin_active('some-plugin.php') ) {
    return true;
} else {
    return false;
}


#9 楼

您可以检查插件是否处于活动状态,如下所示:
/**
 * Check if Some Plugin is active
 **/
if ( in_array( 'some-plugin/some-plugin.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Put your plugin code here
}


#10 楼

这些解决方案都不适合我,但这确实可行:

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


我在codebangers.com上找到了此解决方案