我想禁用特定FrontPage上的特定插件,但不是;禁用(&Q);它们在后端,即在DB中真正禁用它们。只是不要加载它们,就像它们没有安装一样。
代码中很早就通过mu插件实现了这一点:
function strposa($haystack, $needles=array(), $offset=0) { // Like strpos for an Array of needles
foreach($needles as $needle) {
if(strpos($haystack, $needle, $offset) !== false)
return true;
}
return false;
}
add_filter(\'option_active_plugins\', function ($plugins)
{
if(!wp_doing_ajax() && !wp_doing_cron() && !is_admin())
{
$remove_plugins_frontpage = array(\'duplicator-pro\',
\'block-specific-plugin-updates\',
\'delete-expired-transients\');
foreach($plugins as $key => $plug) {
if(strposa($plug, $remove_plugins_frontpage))
unset($plugins[ $key ]);
}
}
return $plugins;
});
例如,像不会安装复印机那样做,因为我不需要在前端执行所有前端操作。我只需要在后端和Cron调用期间使用复印机。
不幸的是,这也会在DB中禁用上面提到的插件。这意味着:当我转到后端时,那些插件被禁用,这非常糟糕。
有没有办法绕过这个问题?
非常感谢
SO网友:tim
我发现代码有问题:
代码很好,基本正常。
唯一的问题是:如果安装了特定的插件,它们会请求激活插件的选项,并将其写回数据库;“排序”;激活顺序。E、 g.WPML,需要/希望尽快激活。因此,如果使用上面的代码,如果使用WPML或类似的方法,基本上可以完全停用DB中的特定插件。
这就是为什么必须添加一项内容:仅当wp\\u get\\u active\\u and\\u valid\\u plugins()调用函数时,才检查是否应用过滤器:
function strposa($haystack, $needles=array(), $offset=0) { // Like strpos for an Array of needles
foreach($needles as $needle) {
if(strpos($haystack, $needle, $offset) !== false)
return true;
}
return false;
}
add_filter(\'option_active_plugins\', function ($plugins)
{
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 7); # Limit 7
$called_by = false;
foreach($trace as $entry) {
if(@$entry[\'function\'] == \'wp_get_active_and_valid_plugins\') {
$called_by = true;
break;
}
}
if(!$called_by)
return $plugins; # Only modify the option when called by wp_get_active_and_valid_plugins()
if(!wp_doing_ajax() && !wp_doing_cron() && !is_admin())
{
$remove_plugins_frontpage = array(\'duplicator-pro\',
\'block-specific-plugin-updates\',
\'delete-expired-transients\');
foreach($plugins as $key => $plug) {
if(strposa($plug, $remove_plugins_frontpage))
unset($plugins[ $key ]);
}
}
return $plugins;
});