操作发生后自行停用插件

时间:2018-12-09 作者:user9741470

我正在开发WordPress插件。

我想从服务器下载一个文件,然后在插件激活后解压缩并将其放在WordPress的主目录中。下载和解压文件的过程运行正常,在这个过程完成后,我很难停用插件。我怎样才能修复它?

class WP_X_Plugin{

public function __construct(){
    register_activation_hook( __FILE__, array( $this , \'activate\' ) );

    $url = "http://mysitedomain.com/script/dist.zip";
    file_put_contents("dist.zip", file_get_contents($url));

    $plugin_zip = new ZipArchive;

    $plugin_zip->open(\'dist.zip\');
    $plugin_zip->extractTo(ABSPATH);
    $plugin_zip->close();

    rename(\'dist.php\', ABSPATH.\'/wp-script.php\');
    if( unlink(\'dist.zip\') ){
      // if i call the deactivate_plugins() function of wordpress, I will have an error logged in console PHP Fatal error:  Uncaught Error: Call to undefined function deactivate_plugins().
      deactivate_plugins( plugin_basename(__FILE__) );
      header(\'Location: wp-script.php\');
    }
}

}

$wp_x = new WP_X_Plugin;

UPDATE

我通过要求plugin.php 位于wp-admin/includes 文件夹在阅读了一些与同一问题相关的问题后,我使用了这个解决方案。据我所知,只有当wp已经在运行时加载了这个文件时,插件函数才可用。

1 个回复
SO网友:Greg Winiarski

deactivate\\u plugins()函数只有在执行admin\\u init操作后才可用,您需要注册“admin\\u init”过滤器并在那里运行deactivate\\u plugins()函数,或者手动包含wp admin/includes/plugin。PHP文件。

我用下面的第二个解决方案更新了您的代码。

class WP_X_Plugin{

    public function __construct(){
        register_activation_hook( __FILE__, array( $this , \'activate\' ) );

        $url = "http://localhost/dist.zip";
        file_put_contents("dist.zip", file_get_contents($url));

        $plugin_zip = new ZipArchive;

        $plugin_zip->open(\'dist.zip\');
        $plugin_zip->extractTo(ABSPATH);
        $plugin_zip->close();

        rename(\'dist.php\', ABSPATH.\'/wp-script.php\');
        if( unlink(\'dist.zip\') ){
            include_once ABSPATH . \'/wp-admin/includes/plugin.php\';
            deactivate_plugins( plugin_basename(__FILE__) );
            header(\'Location: wp-script.php\');
        }
    }  

    public function activate() {

    }
}

$wp_x = new WP_X_Plugin;
顺便说一句,您可以考虑使用wp\\u redirect()函数代替header()函数,或者至少添加“exit;”在header()调用之后。

此外,现在您的代码将在每个页面加载(包括WP\\u X\\u插件激活)上运行,并将自身禁用,因此重定向可能会被忽略。