可以从一个插件中卸载另一个插件吗?

时间:2011-03-13 作者:Travis Northcutt

如果检测到某些插件(特别是Akismet和Hello Dolly),我希望能够通过编写另一个插件或通过我的主题功能自动卸载它们。php文件。这可能吗?

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

当然,只需调用delete\\u plugins()函数,可以在中找到wp-admin/includes/plugin.php - 您必须手动要求()它。

SO网友:TheDeadMedic

这将停用并卸载您在$to_deactivate$to_delete 阵列。

注意:由于WordPress激活插件的方式很古怪,我们不能使用激活挂钩来完成我们的工作。相反,我们检查选项是否存在,以确保每次激活只运行一次!

<?php

/**
 * Plugin Name: My Remove Plugins
 * Version: 0.1
 */

/**
 * Deactivate and/or delete plugins.
 */
function my_remove_plugins()
{
    $to_deactivate = array( \'Anti-Spam Email\' );
    $to_delete     = array( \'Akismet\' );

    $deactivate_stack =
    $delete_stack     = array();

    foreach ( get_plugins() as $plugin => $data ) {
        if ( in_array( $data[\'Name\'], $to_deactivate ) )
            $deactivate_stack[] = WP_PLUGIN_DIR . "/$plugin";

        elseif ( in_array( $data[\'Name\'], $to_delete ) )
            $delete_stack[] = WP_PLUGIN_DIR . "/$plugin";
    }

    if ( !empty($deactivate_stack) || !empty($delete_stack) )
        deactivate_plugins( array_merge( $deactivate_stack, $delete_stack ), true );

    if ( !empty($delete_stack) )
        $result = delete_plugins( array_map( \'plugin_basename\', $delete_stack ) );

    update_option( \'my_remove_plugins\', 1 );

    // refresh, otherwise deleted plugins will still show on first load
    wp_safe_redirect( $_SERVER[\'REQUEST_URI\'] );
    exit;
}

if ( is_admin() && !get_option( \'my_remove_plugins\' ) )
    add_action( \'admin_init\', \'my_remove_plugins\' );

/**
 * Clear out our option on deactivation.
 */
function my_remove_plugins_deactivate()
{
    delete_option( \'my_remove_plugins\' );
}
register_deactivation_hook( __FILE__, \'my_remove_plugins_deactivate\')
?>

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?