2018-06-06 10:58:57 +00:00
< ? php
/**
* Beta Tester plugin Version Picker class
*
* @ package WC_Beta_Tester
*/
defined ( 'ABSPATH' ) || exit ;
/**
* Settings Class .
*/
class WC_Beta_Tester_Version_Picker {
/**
2018-06-06 12:30:25 +00:00
* Currently installed version of WooCommerce plugin .
*
* @ var string
2018-06-06 10:58:57 +00:00
*/
2018-06-06 12:30:25 +00:00
protected $current_version = '' ;
2018-06-06 10:58:57 +00:00
/**
* Constructor
*/
public function __construct () {
add_action ( 'admin_menu' , array ( $this , 'add_to_menus' ) );
2018-06-08 10:31:40 +00:00
add_action ( 'admin_init' , array ( $this , 'handle_version_switch' ) );
}
/**
* Handler for the version switch button .
2018-06-25 15:04:30 +00:00
*
* @ throws Exception On update error .
2018-06-08 10:31:40 +00:00
*/
public function handle_version_switch () {
2018-06-25 11:43:47 +00:00
if ( ! isset ( $_GET [ 'wcbt_switch_to_version' ], $_GET [ '_wpnonce' ] ) ) { // WPCS: Input var ok.
2018-06-08 10:31:40 +00:00
return ;
}
2018-06-25 11:43:47 +00:00
if ( ! wp_verify_nonce ( wp_unslash ( $_GET [ '_wpnonce' ] ), 'wcbt_switch_version_nonce' ) ) { // WPCS: Input var ok, sanitization ok.
wp_die ( esc_html__ ( 'Action failed. Please refresh the page and retry.' , 'woocommerce-beta-tester' ) );
}
$version = isset ( $_GET [ 'wcbt_switch_to_version' ] ) ? sanitize_text_field ( wp_unslash ( $_GET [ 'wcbt_switch_to_version' ] ) ) : '' ; // WPCS: Input var ok, sanitization ok.
if ( empty ( $version ) ) {
return ;
2018-06-08 10:31:40 +00:00
}
2018-06-25 15:04:30 +00:00
try {
include dirname ( __FILE__ ) . '/class-wc-beta-tester-plugin-upgrader.php' ;
$plugin_name = 'woocommerce' ;
$plugin = 'woocommerce/woocommerce.php' ;
$skin_args = array (
'type' => 'web' ,
'url' => 'plugins.php?page=wc-beta-tester-version-picker' ,
'title' => 'Version switch result' ,
'plugin' => $plugin_name ,
'version' => $version ,
'nonce' => wp_unslash ( $_GET [ '_wpnonce' ] ), // WPCS: Input var ok, sanitization ok.
);
$skin = new Automatic_Upgrader_Skin ( $skin_args );
$upgrader = new WC_Beta_Tester_Plugin_Upgrader ( $skin );
$result = $upgrader -> switch_version ( $plugin );
// Try to reactivate.
activate_plugin ( $plugin , '' , is_network_admin (), true );
2018-06-08 15:35:16 +00:00
2018-06-25 15:04:30 +00:00
if ( is_wp_error ( $skin -> result ) ) {
throw new Exception ( $skin -> result -> get_error_message () );
} elseif ( false === $result ) {
throw new Exception ( __ ( 'Update failed' , 'woocommerce-beta-tester' ) );
}
2018-06-08 15:35:16 +00:00
2018-06-25 15:04:30 +00:00
wp_safe_redirect ( admin_url ( 'plugins.php?page=wc-beta-tester-version-picker&switched=' . rawurlencode ( $version ) ) );
exit ;
} catch ( Exception $e ) {
if ( class_exists ( 'WC_Admin_Notices' ) ) {
WC_Admin_Notices :: add_custom_notice (
$plugin . '_update_error' ,
sprintf (
// translators: 1: plugin name, 2: error message.
__ ( '%1$s could not be updated (%2$s).' , 'woocommerce-beta-tester' ),
$plugin ,
$e -> getMessage ()
)
);
wp_safe_redirect ( admin_url ( 'plugins.php?page=wc-beta-tester-version-picker' ) );
exit ;
} else {
wp_die ( esc_html ( $e -> getMessage () ) );
}
2018-06-08 15:35:16 +00:00
}
2018-06-06 10:58:57 +00:00
}
/**
2018-06-06 12:30:25 +00:00
* Add options page to menu .
2018-06-06 10:58:57 +00:00
*
* @ return void
*/
public function add_to_menus () {
2019-03-13 19:54:47 +00:00
add_submenu_page (
'plugins.php' ,
2018-06-25 11:35:57 +00:00
__ ( 'WooCommerce Version Switch' , 'woocommerce-beta-tester' ),
__ ( 'WooCommerce Version Switch' , 'woocommerce-beta-tester' ),
2018-06-06 10:58:57 +00:00
'install_plugins' ,
'wc-beta-tester-version-picker' ,
2018-06-25 11:35:57 +00:00
array ( $this , 'select_versions_form_html' )
);
2018-06-06 10:58:57 +00:00
}
/**
* Return HTML code representation of list of WooCommerce versions for the selected channel .
*
* @ param string $channel Filter versions by channel : all | beta | rc | stable .
* @ return string
*/
public function get_versions_html ( $channel ) {
$tags = WC_Beta_Tester :: instance () -> get_tags ( $channel );
if ( ! $tags ) {
return '' ;
}
usort ( $tags , 'version_compare' );
2018-06-11 10:14:39 +00:00
$tags = array_reverse ( $tags );
$versions_html = '' ;
2018-06-06 10:58:57 +00:00
2018-06-25 11:43:47 +00:00
if ( ! empty ( $_GET [ 'switched' ] ) ) { // WPCS: input var ok, CSRF ok.
2018-06-11 10:14:39 +00:00
/* translators: %s: WooCoomerce version */
2018-06-25 13:35:10 +00:00
$versions_html .= '<div class="notice notice-success"><p>' . sprintf ( esc_html__ ( 'Successfully switched version to %s.' , 'woocommerce-beta-tester' ), esc_html ( sanitize_text_field ( wp_unslash ( $_GET [ 'switched' ] ) ) ) ) . '</p></div>' ; // WPCS: input var ok, CSRF ok.
2018-06-08 10:31:40 +00:00
}
$versions_html .= '<ul class="wcbt-version-list">' ;
2018-06-06 10:58:57 +00:00
$plugin_data = WC_Beta_Tester :: instance () -> get_plugin_data ();
$this -> current_version = $plugin_data [ 'Version' ];
// Loop through versions and output in a radio list.
foreach ( $tags as $tag_version ) {
$versions_html .= '<li class="wcbt-version-li">' ;
2021-11-18 12:49:46 +00:00
$versions_html .= '<label><input type="radio" ' . checked ( strtolower ( $tag_version ), strtolower ( $this -> current_version ), false ) . ' value="' . esc_attr ( $tag_version ) . '" name="wcbt_switch_to_version">' . $tag_version ;
2018-06-06 10:58:57 +00:00
// Is this the current version?
2021-11-18 12:49:46 +00:00
if ( strcasecmp ( $tag_version , $this -> current_version ) === 0 ) {
$versions_html .= '<span class="wcbt-current-version"><strong>' . esc_html__ ( ' Installed Version' , 'woocommerce-beta-tester' ) . '</strong></span>' ;
2018-06-06 10:58:57 +00:00
}
$versions_html .= '</label>' ;
$versions_html .= '</li>' ;
}
$versions_html .= '</ul>' ;
return $versions_html ;
}
/**
* Echo HTML form to switch WooCommerce versions , filtered for the selected channel .
*/
public function select_versions_form_html () {
if ( ! current_user_can ( 'install_plugins' ) ) {
return ;
}
2018-06-06 21:20:40 +00:00
$settings = WC_Beta_Tester :: get_settings ();
2018-06-25 11:35:57 +00:00
$channel = $settings -> channel ;
2018-06-06 10:58:57 +00:00
?>
< div class = " wrap " >
< div class = " wcbt-content-wrap " >
2018-06-25 11:35:57 +00:00
< h1 >< ? php esc_html_e ( 'Available WooCommerce Releases' , 'woocommerce-beta-tester' ); ?> </h1>
2018-06-08 15:35:16 +00:00
< form name = " wcbt-select-version " class = " wcbt-select-version-form " action = " <?php echo esc_attr( admin_url( '/tools.php' ) ); ?> " >
2018-06-06 10:58:57 +00:00
< div class = " wcbt-versions-wrap " >
< ? php echo $this -> get_versions_html ( $channel ); // WPCS: XSS ok. ?>
</ div >
< div class = " wcbt-submit-wrap " >
2018-06-06 16:26:48 +00:00
< a href = " #wcbt-modal-version-switch-confirm " class = " button-primary " id = " wcbt-modal-version-switch-confirm " >< ? php esc_html_e ( 'Switch version' , 'woocommerce-beta-tester' ); ?> </a>
2018-06-06 10:58:57 +00:00
</ div >
< ? php wp_nonce_field ( 'wcbt_switch_version_nonce' ); ?>
2018-06-08 15:35:16 +00:00
< input type = " hidden " name = " noheader " value = " 1 " >
< input type = " hidden " name = " page " value = " wc-beta-tester-version-picker " >
2018-06-06 10:58:57 +00:00
2018-06-06 16:26:48 +00:00
< script type = " text/template " id = " tmpl-wcbt-version-switch-confirm " >
2018-06-06 13:52:26 +00:00
< div class = " wc-backbone-modal wc-backbone-modal-beta-tester-version-info " >
< div class = " wc-backbone-modal-content " >
< section class = " wc-backbone-modal-main " role = " main " >
< header class = " wc-backbone-modal-header " >
< h1 >
< ? php
esc_html_e ( 'Are you sure you want to switch the version of WooCommerce plugin?' , 'woocommerce-beta-tester' );
?>
</ h1 >
< button class = " modal-close modal-close-link dashicons dashicons-no-alt " >
< span class = " screen-reader-text " >< ? php esc_html_e ( 'Close modal panel' , 'woocommerce-beta-tester' ); ?> </span>
</ button >
</ header >
< article >
2018-06-25 11:35:57 +00:00
< table class = " wcbt-widefat widefat " >
2018-06-06 13:52:26 +00:00
< tbody >
< tr class = " alternate " >
< td class = " row-title " >
< label for = " tablecell " >< ? php esc_html_e ( 'Installed Version:' , 'woocommerce-beta-tester' ); ?> </label>
</ td >
< td >< span class = " wcbt-installed-version " >< ? php echo esc_html ( $this -> current_version ); ?> </span></td>
</ tr >
< tr >
< td class = " row-title " >
< label for = " tablecell " >< ? php esc_html_e ( 'New Version:' , 'woocommerce-beta-tester' ); ?> </label>
</ td >
< td >< span class = " wcbt-new-version " > {{ data . new_version }} </ span ></ td >
</ tr >
</ tbody >
</ table >
2018-06-25 11:35:57 +00:00
< p class = " wcbt-notice " >< ? php esc_html_e ( 'Notice: We strongly recommend you perform the test on a staging site and create a complete backup of your WordPress files and database prior to performing a version switch. We are not responsible for any misuse, deletions, white screens, fatal errors, or any other issue arising from using this plugin.' , 'woocommerce-beta-tester' ); ?> </p>
2018-06-07 11:12:53 +00:00
</ article >
< footer >
2018-06-25 11:43:47 +00:00
< input type = " submit " value = " <?php esc_attr_e( 'Switch version', 'woocommerce-beta-tester' ); ?> " class = " button-primary wcbt-go " id = " wcbt-submit-version-switch " />& nbsp ;
2018-06-06 13:52:26 +00:00
< a href = " # " class = " modal-close modal-close-link " >< ? php esc_attr_e ( 'Cancel' , 'woocommerce-beta-tester' ); ?> </a>
2018-06-07 11:12:53 +00:00
</ footer >
2018-06-06 13:52:26 +00:00
</ section >
2018-06-06 10:58:57 +00:00
</ div >
</ div >
2018-06-06 13:52:26 +00:00
< div class = " wc-backbone-modal-backdrop modal-close " ></ div >
</ script >
2018-06-06 10:58:57 +00:00
</ form >
</ div >
</ div >
< ? php
}
}
new WC_Beta_Tester_Version_Picker ();