已激活加载项插件测试

时间:2013-03-08 作者:urok93

我正在创建一个插件,它也将有一些插件。我正在为插件添加设置选项卡,但我想在主插件中进行条件检查,以防止这些选项卡在插件未激活时显示。

有一个函数is\\u plugin\\u active(),可以很容易地用于此检查,但如果用户决定更改插件的文件夹名称,该怎么办?那么检查将无法正常工作?我是否应该实现某种其他更健壮的检查?

2 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

有一个函数is\\u plugin\\u active(),可以很容易地用于此检查,但如果用户决定更改插件的文件夹名称,该怎么办?

简单地说,你做错了。

如果您正在为插件进行扩展,那么您应该在“父”插件中提供挂钩,以便这些插件挂钩并更改内容。以选项卡为例,您可以使用过滤器。

<?php
$tabs = apply_filters(\'myplugin_options_tabs\', array(
    \'some_tab\'  => __(\'The Tab Label\', \'your-textdomain\'),
    \'a_tab\'     => __(\'Another Label\', \'your-textdomain\'),
));

foreach ($tabs as $tab => $label) {
   printf(\'<a href="#%s">%s</a>\', esc_attr($tab), esc_html($label));
}

// some where further on where the tab content is supposed to display:
do_action(\'myplugin_tab_\' . some_function_that_gets_the_current_tab() . \'_display\');
这样做意味着您不必在父插件中进行任何检查。附加组件可以简单地连接并完成它们的工作。更加优雅,更加灵活。

也就是说,如果你真的想检查是否存在另一个插件,最好的办法就是plugins_loaded 并检查插件的类、函数和/或常量是否存在。

<?php
add_action(\'plugins_loaded\', \'wpse89926_load\');
function wpse89926_load()
{
   if (class_exists(\'Other_Plugins_Class\')) {
       // do stuff, the other plugin is in installed
   }

   if (function_exists(\'a_function_in_the_other_plugin\')) {
       // do stuff, the other plugin is in installed
   }

   if (defined(\'A_CONSTANT_IN_THE_OTHER_PLUGIN\')) {
       // do stuff, the other plugin is in installed
   }
}

SO网友:Wyck

chrisguitarguy的解决方案是可行的。

当插件激活时,文件夹/名称存储在get_option, 所以使用

 get_option( \'active_plugins\', array());
即使更改了文件夹/名称,仍将存储它们。如果更改活动插件上的文件夹或插件名称,插件将被取消激活,因此需要激活并存储正确的文件夹/名称。

虽然如果你这样做,一些插件会损坏,因此不会被激活,所以这不在你的考虑范围之内。

结束

相关推荐

如何防止options.php从数据库中删除有效的现有数据

我正在设置一个插件,并首次使用设置API在设置中创建表单。默认情况下,当插件被激活并以序列化格式存储在数据库中时,最初会创建插件的数据。今天,我添加了验证回调函数,它可以很好地进行验证。但是,当任何字段验证失败并且函数返回false(我也尝试返回NULL)时,数据库中现有的有效数据将被删除。问题是事情是怎么发生的,还是我在做傻事?在这种情况下,我原本预计数据库中现有的有效数据将保持不变,直到用户提供了一组有效数据来修改它为止。感谢您的任何建议。