2018-06-05 08:37:08 +00:00
< ? php
/**
* Beta Tester Admin Menus class
*
* @ package WC_Beta_Tester
*/
defined ( 'ABSPATH' ) || exit ;
/**
* WC_Beta_Tester_Admin_Menus Main Class .
*/
class WC_Beta_Tester_Admin_Menus {
/**
* Constructor
*/
public function __construct () {
2019-03-13 17:41:26 +00:00
if ( class_exists ( 'WC_Admin_Status' ) ) {
2018-06-07 11:55:40 +00:00
add_action ( 'admin_bar_menu' , array ( $this , 'admin_bar_menus' ), 50 );
2018-06-05 17:21:23 +00:00
}
2018-06-06 08:02:45 +00:00
add_action ( 'admin_footer' , array ( $this , 'version_information_template' ) );
2020-11-06 18:36:02 +00:00
add_action ( 'admin_head' , array ( $this , 'hide_from_menus' ) );
2018-06-05 08:37:08 +00:00
}
2018-06-05 10:46:55 +00:00
/**
* Get issue template from GitHub .
*
* @ return string
*/
protected function get_ticket_template () {
2018-07-06 17:12:53 +00:00
ob_start ();
?>
** Describe the bug **
A clear and concise description of what the bug is . Please be as descriptive as possible ; issues lacking detail , or for any other reason than to report a bug , may be closed without action .
2018-06-05 10:46:55 +00:00
2018-07-06 17:12:53 +00:00
** To Reproduce **
Steps to reproduce the behavior :
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
** Screenshots **
If applicable , add screenshots to help explain your problem .
** Expected behavior **
A clear and concise description of what you expected to happen .
** Isolating the problem ( mark completed items with an [ x ]) :**
- [ ] I have deactivated other plugins and confirmed this bug occurs when only WooCommerce plugin is active .
2023-11-06 11:45:26 +00:00
- [ ] This bug happens with a default WordPress theme active , or [ Storefront ]( https :// woo . com / storefront / ) .
2018-07-06 17:12:53 +00:00
- [ ] I can reproduce this bug consistently using the steps above .
** WordPress Environment **
< details >
`` `
Copy and paste the system status report from ** WooCommerce > System Status ** in WordPress admin .
`` `
</ details >
< ? php
2018-06-05 10:46:55 +00:00
2018-07-06 17:12:53 +00:00
$bug_tpl = ob_get_clean ();
2018-06-05 10:46:55 +00:00
return $bug_tpl ;
}
2018-06-07 13:16:27 +00:00
/**
* Get info about the current theme for SSR .
*
2018-06-25 11:35:57 +00:00
* @ param string $theme Current theme .
2018-06-07 13:16:27 +00:00
* @ return string
*/
private function get_theme_ssr_info ( $theme ) {
$theme_info = __ ( " \n \n ### Theme ### \n \n " , 'woocommerce-beta-tester' );
$version = $theme [ 'version' ];
if ( version_compare ( $theme [ 'version' ], $theme [ 'version_latest' ], '<' ) ) {
/* translators: 1: latest version */
$version .= sprintf ( __ ( ' - %s is available' , 'woocommerce-beta-tester' ), esc_html ( $theme [ 'version_latest' ] ) );
}
2018-06-07 13:40:48 +00:00
$child_theme = $theme [ 'is_child_theme' ] ? __ ( 'Yes' , 'woocommerce-beta-tester' ) : __ ( 'No - If you are modifying WooCommerce on a parent theme that you did not build personally we recommend using a child theme.' , 'woocommerce-beta-tester' );
2018-06-07 13:16:27 +00:00
if ( $theme [ 'is_child_theme' ] ) {
$parent_version = $theme [ 'parent_version' ];
if ( version_compare ( $theme [ 'parent_version' ], $theme [ 'parent_version_latest' ], '<' ) ) {
/* translators: 1: latest version */
$parent_version .= sprintf ( __ ( ' - %s is available' , 'woocommerce-beta-tester' ), esc_html ( $theme [ 'parent_version_latest' ] ) );
}
$child_theme .= sprintf (
__ ( " Parent theme name: %1 \$ s \n Parent theme version: %2 \$ s \n Parent theme author URL: %3 \$ s \n " , 'woocommerce-beta-tester' ),
$theme [ 'parent_name' ],
$parent_version ,
$theme [ 'parent_author_url' ]
);
}
$theme_info .= sprintf (
__ ( " Name: %1 \$ s \n Version: %2 \$ s \n Author URL: %3 \$ s \n Child Theme: %4 \$ s \n WooCommerce Support: %5 \$ s " , 'woocommerce-beta-tester' ),
$theme [ 'name' ],
$version ,
esc_html ( $theme [ 'author_url' ] ),
$child_theme ,
! $theme [ 'has_woocommerce_support' ] ? __ ( 'Not declared' , 'woocommerce-beta-tester' ) : __ ( 'Yes' , 'woocommerce-beta-tester' )
);
return $theme_info ;
}
/**
* Get info about the current plugins for SSR .
*
2018-06-25 11:35:57 +00:00
* @ param array $active_plugins List of active plugins .
* @ param array $untested_plugins List of untested plugins .
2018-06-07 13:16:27 +00:00
* @ return string
*/
private function get_plugins_ssr_info ( $active_plugins , $untested_plugins ) {
$plugins_info = __ ( " \n \n ### Plugins ### \n \n " , 'woocommerce-beta-tester' );
foreach ( $active_plugins as $plugin ) {
if ( ! empty ( $plugin [ 'name' ] ) ) {
// Link the plugin name to the plugin url if available.
$plugin_name = esc_html ( $plugin [ 'name' ] );
$version_string = '' ;
$network_string = '' ;
2023-11-06 11:45:26 +00:00
if ( strstr ( $plugin [ 'url' ], 'woothemes.com' ) || strstr ( $plugin [ 'url' ], 'woo.com' ) ) {
2018-06-07 13:16:27 +00:00
if ( ! empty ( $plugin [ 'version_latest' ] ) && version_compare ( $plugin [ 'version_latest' ], $plugin [ 'version' ], '>' ) ) {
/* translators: %s: plugin latest version */
$version_string = sprintf ( esc_html__ ( '%s is available' , 'woocommerce-beta-tester' ), $plugin [ 'version_latest' ] );
}
2018-06-25 11:35:57 +00:00
if ( false !== ( bool ) $plugin [ 'network_activated' ] ) {
2018-06-07 13:16:27 +00:00
$network_string = __ ( 'Network enabled' , 'woocommerce-beta-tester' );
}
}
$untested_string = '' ;
if ( array_key_exists ( $plugin [ 'plugin' ], $untested_plugins ) ) {
$untested_string = __ ( 'Not tested with the active version of WooCommerce' , 'woocommerce-beta-tester' );
}
$plugins_info .= sprintf ( __ ( " %1 \$ s: by %2 \$ s - %3 \$ s - %4 \$ s \n " , 'woocommerce-beta-tester' ), $plugin_name , $plugin [ 'author_name' ], $plugin [ 'version' ], $version_string . $untested_string . $network_string );
}
}
return $plugins_info ;
}
2018-06-05 10:46:55 +00:00
/**
* Constructs a WC System Status Report .
*
* @ return string
*/
protected function construct_ssr () {
2023-01-12 01:16:01 +00:00
// This function depends on the WC core global being available. Sometimes, such as when we deactivate
// WC to install a live branches version, WC will not be available and cause a crash if we don't exit early
// here.
if ( ! class_exists ( 'WC' ) ) {
return '' ;
}
2020-09-22 18:37:39 +00:00
if ( version_compare ( WC () -> version , '3.6' , '<' ) ) {
return '' ;
}
2018-06-05 10:46:55 +00:00
$transient_name = 'wc-beta-tester-ssr' ;
2018-06-05 17:36:09 +00:00
$ssr = get_transient ( $transient_name );
2018-06-05 10:46:55 +00:00
if ( false === $ssr ) {
2019-03-13 18:25:25 +00:00
// When running WC 3.6 or greater it is necessary to manually load the REST API classes.
2020-09-22 18:37:39 +00:00
if ( ! did_action ( 'rest_api_init' ) ) {
2019-03-13 17:41:26 +00:00
WC () -> api -> rest_api_includes ();
}
2020-09-22 18:37:39 +00:00
if ( ! class_exists ( 'WC_REST_System_Status_Controller' ) ) {
2019-03-13 17:41:26 +00:00
return '' ;
}
2018-06-05 18:15:16 +00:00
// Get SSR.
$api = new WC_REST_System_Status_Controller ();
$schema = $api -> get_item_schema ();
$mappings = $api -> get_item_mappings ();
$response = array ();
foreach ( $mappings as $section => $values ) {
foreach ( $values as $key => $value ) {
if ( isset ( $schema [ 'properties' ][ $section ][ 'properties' ][ $key ][ 'type' ] ) ) {
settype ( $values [ $key ], $schema [ 'properties' ][ $section ][ 'properties' ][ $key ][ 'type' ] );
}
}
settype ( $values , $schema [ 'properties' ][ $section ][ 'type' ] );
$response [ $section ] = $values ;
}
2018-06-05 10:46:55 +00:00
2018-06-05 18:15:16 +00:00
$ssr = '' ;
foreach ( $response [ 'environment' ] as $key => $value ) {
$index = $key ;
2020-09-22 18:37:39 +00:00
if ( 'external_object_cache' === $index ) {
2018-06-05 18:15:16 +00:00
$ssr .= sprintf ( " %s: %s \n " , 'External object cache' , wc_bool_to_string ( $value ) );
continue ;
}
if ( is_bool ( $value ) ) {
$value = wc_bool_to_string ( $value );
}
$ssr .= sprintf ( " %s: %s \n " , $schema [ 'properties' ][ 'environment' ][ 'properties' ][ $index ][ 'description' ], $value );
}
2018-06-05 10:46:55 +00:00
2018-06-07 13:16:27 +00:00
$active_plugins = $api -> get_active_plugins ();
2018-06-25 11:35:57 +00:00
$plugin_updates = new WC_Plugin_Updates ();
2018-06-07 13:16:27 +00:00
$untested_plugins = $plugin_updates -> get_untested_plugins ( WC () -> version , 'minor' );
$ssr .= $this -> get_plugins_ssr_info ( $active_plugins , $untested_plugins );
$theme = $api -> get_theme_info ();
$ssr .= $this -> get_theme_ssr_info ( $theme );
2018-06-05 10:46:55 +00:00
set_transient ( $transient_name , $ssr , DAY_IN_SECONDS );
}
return $ssr ;
}
/**
* Get URL for creating a GitHub ticket .
*
* @ return string
*/
protected function get_github_ticket_url () {
$bug_tpl = $this -> get_ticket_template ();
$ssr = $this -> construct_ssr ();
$body = str_replace ( 'Copy and paste the system status report from **WooCommerce > System Status** in WordPress admin.' , $ssr , $bug_tpl );
2018-06-05 18:15:16 +00:00
$body = str_replace ( '```' , '' , $body ); // Remove since this break how is displayed.
2018-06-05 10:46:55 +00:00
2018-06-05 12:10:55 +00:00
$wc_plugin_data = get_plugin_data ( WC_PLUGIN_FILE );
if ( isset ( $wc_plugin_data [ 'Version' ] ) ) {
$version = $wc_plugin_data [ 'Version' ];
} else {
$version = '-' ;
}
2018-06-05 10:46:55 +00:00
return add_query_arg (
array (
2018-06-05 17:36:09 +00:00
'body' => rawurlencode ( $body ),
/* translators: %s: woocommerce version */
'title' => rawurlencode ( sprintf ( __ ( '[WC Beta Tester] Bug report for version "%s"' , 'woocommerce-beta-tester' ), $version ) ),
2018-06-05 10:46:55 +00:00
),
'https://github.com/woocommerce/woocommerce/issues/new'
);
}
2018-06-05 08:37:08 +00:00
/**
* Add the " Visit Store " link in admin bar main menu .
*
* @ param WP_Admin_Bar $wp_admin_bar Admin bar instance .
*/
public function admin_bar_menus ( $wp_admin_bar ) {
if ( ! is_admin () || ! is_user_logged_in () ) {
return ;
}
// Show only when the user is a member of this site, or they're a super admin.
if ( ! is_user_member_of_blog () && ! is_super_admin () ) {
return ;
}
// Add the beta tester root node.
2019-03-13 19:54:47 +00:00
$wp_admin_bar -> add_node (
array (
'parent' => 0 ,
'id' => 'wc-beta-tester' ,
'title' => __ ( 'WC Beta Tester' , 'woocommerce-beta-tester' ),
)
);
2018-06-05 08:37:08 +00:00
2018-06-06 15:14:32 +00:00
$settings = WC_Beta_Tester :: get_settings ();
switch ( $settings -> channel ) {
case 'beta' :
$current_channel = __ ( 'Beta' , 'woocommerce-beta-tester' );
break ;
case 'rc' :
$current_channel = __ ( 'Release Candidate' , 'woocommerce-beta-tester' );
break ;
default :
$current_channel = __ ( 'Stable' , 'woocommerce-beta-tester' );
break ;
2018-06-05 11:45:09 +00:00
}
2018-06-05 18:15:16 +00:00
2018-06-05 08:37:08 +00:00
$nodes = array (
array (
'parent' => 'wc-beta-tester' ,
2018-06-07 11:55:40 +00:00
'id' => 'update-channel' ,
2018-06-05 17:36:09 +00:00
/* translators: %s: current channel */
2018-06-25 14:00:00 +00:00
'title' => sprintf ( __ ( 'Channel: %s' , 'woocommerce-beta-tester' ), $current_channel ),
2018-06-07 11:55:40 +00:00
'href' => admin_url ( 'plugins.php?page=wc-beta-tester' ),
2018-06-05 08:37:08 +00:00
),
2020-11-03 18:27:32 +00:00
array (
'parent' => 'wc-beta-tester' ,
'id' => 'import-export-settings' ,
'title' => __ ( 'Import/Export Settings' , 'woocommerce-beta-tester' ),
2020-11-05 18:57:21 +00:00
'href' => admin_url ( 'admin.php?page=wc-beta-tester-settings' ),
2020-11-03 18:27:32 +00:00
),
2018-06-05 08:37:08 +00:00
array (
'parent' => 'wc-beta-tester' ,
'id' => 'show-version-info' ,
2018-06-07 11:55:40 +00:00
/* translators: %s: current version */
2018-06-25 11:35:57 +00:00
'title' => sprintf ( __ ( 'Release %s information' , 'woocommerce-beta-tester' ), WC_VERSION ),
2018-06-06 08:02:45 +00:00
'href' => '#' ,
2018-06-05 08:37:08 +00:00
),
array (
'parent' => 'wc-beta-tester' ,
'id' => 'switch-version' ,
2018-06-07 11:55:40 +00:00
'title' => __ ( 'Switch versions' , 'woocommerce-beta-tester' ),
2018-06-25 14:00:00 +00:00
'href' => admin_url ( 'plugins.php?page=wc-beta-tester-version-picker' ),
2018-06-05 08:37:08 +00:00
),
array (
'parent' => 'wc-beta-tester' ,
2018-06-07 11:55:40 +00:00
'id' => 'submit-gh-ticket' ,
'title' => __ ( 'Submit bug report' , 'woocommerce-beta-tester' ),
'href' => '#' ,
'meta' => array (
// We can't simply use the href here since WP core calls esc_url on it which strips some parts.
'onclick' => 'javascript:window.open( "' . esc_js ( $this -> get_github_ticket_url () ) . '" );' ,
),
2018-06-05 08:37:08 +00:00
),
);
foreach ( $nodes as $node ) {
$wp_admin_bar -> add_node ( $node );
}
}
2018-06-06 08:02:45 +00:00
2020-11-06 18:36:02 +00:00
/**
* Hide menu items from view so the pages exist , but the menu items do not .
*/
public function hide_from_menus () {
global $submenu ;
$items_to_remove = array ( 'wc-beta-tester-settings' , 'wc-beta-tester-version-picker' , 'wc-beta-tester' );
if ( isset ( $submenu [ 'plugins.php' ] ) ) {
foreach ( $submenu [ 'plugins.php' ] as $key => $menu ) {
2023-01-12 01:16:01 +00:00
if ( in_array ( $menu [ 2 ], $items_to_remove , true ) ) {
2020-11-06 18:36:02 +00:00
unset ( $submenu [ 'plugins.php' ][ $key ] );
}
}
}
}
2018-06-06 08:02:45 +00:00
/**
2018-06-06 12:32:45 +00:00
* Template for version information .
2018-06-06 08:02:45 +00:00
*/
public function version_information_template () {
?>
< script type = " text/template " id = " tmpl-wc-beta-tester-version-info " >
< 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 " >
2018-06-06 08:07:45 +00:00
< h1 >
< ? php
/* translators: %s: version number */
2018-06-25 11:35:57 +00:00
echo esc_html ( sprintf ( __ ( 'Release %s information' , 'woocommerce-beta-tester' ), '{{ data.version }}' ) );
2018-06-06 08:07:45 +00:00
?>
</ h1 >
2018-06-06 08:02:45 +00:00
< 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 >
< ? php do_action ( 'woocommerce_admin_version_information_start' ); ?>
{{ data . description }}
< ? php do_action ( 'woocommerce_admin_version_information_end' ); ?>
</ article >
< footer >
2018-06-25 11:35:57 +00:00
< a target = " _blank " href = " https://github.com/woocommerce/woocommerce/releases/tag/ { { data.version }} " >< ? php esc_html_e ( 'Read more on GitHub' , 'woocommerce-beta-tester' ); ?> </a>
2018-06-06 08:02:45 +00:00
</ footer >
</ section >
</ div >
</ div >
< div class = " wc-backbone-modal-backdrop modal-close " ></ div >
</ script >
< ? php
}
2018-06-05 08:37:08 +00:00
}
return new WC_Beta_Tester_Admin_Menus ();