356 lines
12 KiB
PHP
356 lines
12 KiB
PHP
<?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() {
|
|
if ( class_exists( 'WC_Admin_Status' ) ) {
|
|
add_action( 'admin_bar_menu', array( $this, 'admin_bar_menus' ), 50 );
|
|
}
|
|
add_action( 'admin_footer', array( $this, 'version_information_template' ) );
|
|
}
|
|
|
|
/**
|
|
* Get issue template from GitHub.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function get_ticket_template() {
|
|
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.
|
|
|
|
**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.
|
|
- [ ] This bug happens with a default WordPress theme active, or [Storefront](https://woocommerce.com/storefront/).
|
|
- [ ] 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
|
|
|
|
$bug_tpl = ob_get_clean();
|
|
return $bug_tpl;
|
|
}
|
|
|
|
/**
|
|
* Get info about the current theme for SSR.
|
|
*
|
|
* @param string $theme Current theme.
|
|
* @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'] ) );
|
|
}
|
|
|
|
$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' );
|
|
|
|
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\nParent theme version: %2\$s\nParent theme author URL: %3\$s\n", 'woocommerce-beta-tester' ),
|
|
$theme['parent_name'],
|
|
$parent_version,
|
|
$theme['parent_author_url']
|
|
);
|
|
}
|
|
|
|
$theme_info .= sprintf(
|
|
__( "Name: %1\$s\nVersion: %2\$s\nAuthor URL: %3\$s\nChild Theme: %4\$s\nWooCommerce 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.
|
|
*
|
|
* @param array $active_plugins List of active plugins.
|
|
* @param array $untested_plugins List of untested plugins.
|
|
* @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 = '';
|
|
if ( strstr( $plugin['url'], 'woothemes.com' ) || strstr( $plugin['url'], 'woocommerce.com' ) ) {
|
|
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'] );
|
|
}
|
|
|
|
if ( false !== (bool) $plugin['network_activated'] ) {
|
|
$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;
|
|
}
|
|
|
|
/**
|
|
* Constructs a WC System Status Report.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function construct_ssr() {
|
|
$transient_name = 'wc-beta-tester-ssr';
|
|
$ssr = get_transient( $transient_name );
|
|
|
|
if ( false === $ssr ) {
|
|
// When running WC 3.6 or greater it is necessary to manually load the REST API classes.
|
|
if ( version_compare( WC()->version, '3.6', '>=' ) && ! did_action( 'rest_api_init' ) ) {
|
|
WC()->api->rest_api_includes();
|
|
}
|
|
|
|
if ( ! class_exists( 'WC_REST_System_Status_Controller', false ) ) {
|
|
return '';
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
$ssr = '';
|
|
foreach ( $response['environment'] as $key => $value ) {
|
|
$index = $key;
|
|
// @todo remove this hack after fix schema in WooCommerce, and Claudio never let you folks forget that need to write schema first, and review after every change, schema is the most important part of the REST API.
|
|
if ( 'version' === $index ) {
|
|
$index = 'wc_version';
|
|
} elseif ( 'external_object_cache' === $index ) {
|
|
$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 );
|
|
}
|
|
|
|
$active_plugins = $api->get_active_plugins();
|
|
$plugin_updates = new WC_Plugin_Updates();
|
|
$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 );
|
|
|
|
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 );
|
|
$body = str_replace( '```', '', $body ); // Remove since this break how is displayed.
|
|
|
|
$wc_plugin_data = get_plugin_data( WC_PLUGIN_FILE );
|
|
if ( isset( $wc_plugin_data['Version'] ) ) {
|
|
$version = $wc_plugin_data['Version'];
|
|
} else {
|
|
$version = '-';
|
|
}
|
|
|
|
return add_query_arg(
|
|
array(
|
|
'body' => rawurlencode( $body ),
|
|
/* translators: %s: woocommerce version */
|
|
'title' => rawurlencode( sprintf( __( '[WC Beta Tester] Bug report for version "%s"', 'woocommerce-beta-tester' ), $version ) ),
|
|
),
|
|
'https://github.com/woocommerce/woocommerce/issues/new'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
$wp_admin_bar->add_node(
|
|
array(
|
|
'parent' => 0,
|
|
'id' => 'wc-beta-tester',
|
|
'title' => __( 'WC Beta Tester', 'woocommerce-beta-tester' ),
|
|
)
|
|
);
|
|
|
|
$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;
|
|
}
|
|
|
|
$nodes = array(
|
|
array(
|
|
'parent' => 'wc-beta-tester',
|
|
'id' => 'update-channel',
|
|
/* translators: %s: current channel */
|
|
'title' => sprintf( __( 'Channel: %s', 'woocommerce-beta-tester' ), $current_channel ),
|
|
'href' => admin_url( 'plugins.php?page=wc-beta-tester' ),
|
|
),
|
|
array(
|
|
'parent' => 'wc-beta-tester',
|
|
'id' => 'show-version-info',
|
|
/* translators: %s: current version */
|
|
'title' => sprintf( __( 'Release %s information', 'woocommerce-beta-tester' ), WC_VERSION ),
|
|
'href' => '#',
|
|
),
|
|
array(
|
|
'parent' => 'wc-beta-tester',
|
|
'id' => 'switch-version',
|
|
'title' => __( 'Switch versions', 'woocommerce-beta-tester' ),
|
|
'href' => admin_url( 'plugins.php?page=wc-beta-tester-version-picker' ),
|
|
),
|
|
array(
|
|
'parent' => 'wc-beta-tester',
|
|
'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() ) . '" );',
|
|
),
|
|
),
|
|
);
|
|
|
|
foreach ( $nodes as $node ) {
|
|
$wp_admin_bar->add_node( $node );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Template for version information.
|
|
*/
|
|
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">
|
|
<h1>
|
|
<?php
|
|
/* translators: %s: version number */
|
|
echo esc_html( sprintf( __( 'Release %s information', 'woocommerce-beta-tester' ), '{{ data.version }}' ) );
|
|
?>
|
|
</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>
|
|
<?php do_action( 'woocommerce_admin_version_information_start' ); ?>
|
|
{{ data.description }}
|
|
<?php do_action( 'woocommerce_admin_version_information_end' ); ?>
|
|
</article>
|
|
<footer>
|
|
<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>
|
|
</footer>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
<div class="wc-backbone-modal-backdrop modal-close"></div>
|
|
</script>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
return new WC_Beta_Tester_Admin_Menus();
|