woocommerce/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-live-b...

184 lines
5.0 KiB
PHP

<?php
/**
* Beta Tester Plugin Live Branches feature class.
*
* @package WC_Beta_Tester
*/
defined( 'ABSPATH' ) || exit;
require_once ABSPATH . 'wp-admin/includes/plugin.php';
const LIVE_BRANCH_PLUGIN_PREFIX = 'wc_beta_tester_live_branch';
/**
* WC_Beta_Tester Live Branches Installer Class.
*/
class WC_Beta_Tester_Live_Branches_Installer {
/**
* Keep an instance of the WP Filesystem API.
*
* @var Object The WP_Filesystem API instance
*/
private $file_system;
/**
* Constructor.
*/
public function __construct() {
$this->file_system = $this->init_filesystem();
}
/**
* Initialize the WP_Filesystem API
*/
private function init_filesystem() {
require_once ABSPATH . 'wp-admin/includes/file.php';
$creds = request_filesystem_credentials( site_url() . '/wp-admin/', '', false, false, array() );
if ( ! WP_Filesystem( $creds ) ) {
return new WP_Error( 'fs_api_error', __( 'WooCommerce Beta Tester: No File System access', 'woocommerce-beta-tester' ) ); // @codingStandardsIgnoreLine.
}
global $wp_filesystem;
return $wp_filesystem;
}
/**
* Get the download url of a WooCommerce plugin version from the manifest.
*
* @param string $branch The name of the branch.
*/
public function get_branch_info_from_manifest( $branch ) {
$response = wp_remote_get( 'https://betadownload.jetpack.me/woocommerce-branches.json' );
$body = wp_remote_retrieve_body( $response );
$obj = json_decode( $body );
if ( $obj->master->branch === $branch ) {
return $obj->master;
}
foreach ( $obj->pr as $key => $value ) {
if ( $value->branch === $branch ) {
return $value;
}
}
return false;
}
/**
* Install a WooCommerce plugin version by download url.
*
* @param string $download_url The download url of the plugin version.
* @param string $pr_name The name of the associated PR.
* @param string $version The version of the plugin.
*/
public function install( $download_url, $pr_name, $version ) {
// Download the plugin.
$tmp_dir = download_url( $download_url );
if ( is_wp_error( $tmp_dir ) ) {
return new WP_Error(
'download_error',
sprintf( __( 'Error Downloading: <a href="%1$s">%1$s</a> - Error: %2$s', 'woocommerce-beta-tester' ), $download_url, $tmp_dir->get_error_message() ) // @codingStandardsIgnoreLine.
);
}
// Unzip the plugin.
$plugin_dir = str_replace( ABSPATH, $this->file_system->abspath(), WP_PLUGIN_DIR );
$plugin_path = $plugin_dir . '/' . LIVE_BRANCH_PLUGIN_PREFIX . "_$version";
$unzip_path = $plugin_dir . "/woocommerce-$version";
$unzip = unzip_file( $tmp_dir, $unzip_path );
// The plugin is nested under woocommerce-dev, so we need to move it up one level.
$this->file_system->mkdir( $plugin_path );
$this->move( $unzip_path . '/woocommerce-dev', $plugin_path );
if ( is_wp_error( $unzip ) ) {
return new WP_Error( 'unzip_error', sprintf( __( 'Error Unzipping file: Error: %1$s', 'woocommerce-beta-tester' ), $result->get_error_message() ) ); // @codingStandardsIgnoreLine.
}
// Delete the downloaded zip file.
unlink( $tmp_dir );
return true;
}
/**
* Move all files from one folder to another.
*
* @param string $from The folder to move files from.
* @param string $to The folder to move files to.
*/
private function move( $from, $to ) {
$files = scandir( $from );
$oldfolder = "$from/";
$newfolder = "$to/";
foreach ( $files as $fname ) {
if ( '.' !== $fname && '..' !== $fname ) {
$this->file_system->move( $oldfolder . $fname, $newfolder . $fname );
}
}
}
/**
* Deactivate all currently active WooCommerce plugins.
*/
public function deactivate_woocommerce() {
// First check is the regular woo plugin active.
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
deactivate_plugins( 'woocommerce/woocommerce.php' );
}
// Check if any beta tester installed plugins are active.
$active_plugins = get_option( 'active_plugins' );
$active_woo_plugins = array_filter(
$active_plugins,
function( $plugin ) {
return str_contains( $plugin, LIVE_BRANCH_PLUGIN_PREFIX );
}
);
if ( ! empty( $active_woo_plugins ) ) {
deactivate_plugins( $active_woo_plugins );
}
}
/**
* Activate a beta tester installed WooCommerce plugin
*
* @param string $version The version of the plugin to activate.
*/
public function activate( $version ) {
if ( ! is_plugin_active( LIVE_BRANCH_PLUGIN_PREFIX . "_$version/woocommerce.php" ) ) {
activate_plugin( LIVE_BRANCH_PLUGIN_PREFIX . "_$version/woocommerce.php" );
}
}
/**
* Check the install status of a plugin version.
*
* @param string $version The version of the plugin to check.
*/
public function check_install_status( $version ) {
$plugin_path = WP_PLUGIN_DIR . '/' . LIVE_BRANCH_PLUGIN_PREFIX . "_$version/woocommerce.php";
if ( ! file_exists( $plugin_path ) ) {
return 'not-installed';
}
if ( is_plugin_active( LIVE_BRANCH_PLUGIN_PREFIX . "_$version/woocommerce.php" ) ) {
return 'active';
}
return 'installed';
}
}