PluginProbe
WooCommerce / 11.1.0-rc.2
WooCommerce v11.1.0-rc.2
11.1.0 11.1.0-rc.2 11.1.0-rc.1 11.1.0-beta.2 11.1.0-beta.1 11.0.1 11.0.0 11.0.0-rc.3 11.0.0-rc.2 11.0.0-rc.1 11.0.0-beta.2 11.0.0-beta.1 10.9.4 10.9.3 10.9.2 10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 All 648 releases
woocommerce / includes / admin / plugin-updates / class-wc-plugins-screen-updates.php
class-wc-plugins-screen-updates.php
174 lines 5.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Manages WooCommerce plugin updating on the Plugins screen.
4 *
5 * @package WooCommerce\Admin
6 * @version 3.2.0
7 */
8
9 use Automattic\Jetpack\Constants;
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit;
13 }
14
15 if ( ! class_exists( 'WC_Plugin_Updates' ) ) {
16 include_once dirname( __FILE__ ) . '/class-wc-plugin-updates.php';
17 }
18
19 /**
20 * Class WC_Plugins_Screen_Updates
21 */
22 class WC_Plugins_Screen_Updates extends WC_Plugin_Updates {
23
24 /**
25 * The upgrade notice shown inline.
26 *
27 * @var string
28 */
29 protected $upgrade_notice = '';
30
31 /**
32 * Constructor.
33 */
34 public function __construct() {
35 add_action( 'in_plugin_update_message-woocommerce/woocommerce.php', array( $this, 'in_plugin_update_message' ), 10, 2 );
36 }
37
38 /**
39 * Show plugin changes on the plugins screen. Code adapted from W3 Total Cache.
40 *
41 * @param array $args Unused parameter.
42 * @param stdClass $response Plugin update response.
43 */
44 public function in_plugin_update_message( $args, $response ) {
45 $version_type = Constants::get_constant( 'WC_SSR_PLUGIN_UPDATE_RELEASE_VERSION_TYPE' );
46 if ( ! is_string( $version_type ) ) {
47 $version_type = 'none';
48 }
49
50 $this->new_version = $response->new_version;
51 $this->upgrade_notice = $this->get_upgrade_notice( $response->new_version );
52 $this->major_untested_plugins = $this->get_untested_plugins( $response->new_version, $version_type );
53
54 $current_version_parts = explode( '.', Constants::get_constant( 'WC_VERSION' ) );
55 $new_version_parts = explode( '.', $this->new_version );
56
57 // If user has already moved to the minor version, we don't need to flag up anything.
58 if ( version_compare( $current_version_parts[0] . '.' . $current_version_parts[1], $new_version_parts[0] . '.' . $new_version_parts[1], '=' ) ) {
59 return;
60 }
61
62 if ( ! empty( $this->major_untested_plugins ) ) {
63 $this->upgrade_notice .= $this->get_extensions_inline_warning_major();
64 }
65
66 if ( ! empty( $this->major_untested_plugins ) ) {
67 $this->upgrade_notice .= $this->get_extensions_modal_warning();
68 add_action( 'admin_print_footer_scripts', array( $this, 'plugin_screen_modal_js' ) );
69 }
70
71 echo apply_filters( 'woocommerce_in_plugin_update_message', $this->upgrade_notice ? '</p>' . wp_kses_post( $this->upgrade_notice ) . '<p class="dummy">' : '' ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
72 }
73
74 /**
75 * Get the upgrade notice from WordPress.org.
76 *
77 * @param string $version WooCommerce new version.
78 * @return string
79 */
80 protected function get_upgrade_notice( $version ) {
81 $transient_name = 'wc_upgrade_notice_' . $version;
82 $upgrade_notice = get_transient( $transient_name );
83
84 if ( false === $upgrade_notice ) {
85 $response = wp_safe_remote_get( 'https://plugins.svn.wordpress.org/woocommerce/trunk/readme.txt' );
86
87 if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) ) {
88 $upgrade_notice = $this->parse_update_notice( $response['body'], $version );
89 set_transient( $transient_name, $upgrade_notice, DAY_IN_SECONDS );
90 }
91 }
92 return $upgrade_notice;
93 }
94
95 /**
96 * Parse update notice from readme file.
97 *
98 * @param string $content WooCommerce readme file content.
99 * @param string $new_version WooCommerce new version.
100 * @return string
101 */
102 private function parse_update_notice( $content, $new_version ) {
103 $version_parts = explode( '.', $new_version );
104 $check_for_notices = array(
105 $version_parts[0] . '.0', // Major.
106 $version_parts[0] . '.0.0', // Major.
107 $version_parts[0] . '.' . $version_parts[1], // Minor.
108 $version_parts[0] . '.' . $version_parts[1] . '.' . $version_parts[2], // Patch.
109 );
110 $notice_regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( $new_version ) . '\s*=|$)~Uis';
111 $upgrade_notice = '';
112
113 foreach ( $check_for_notices as $check_version ) {
114 if ( version_compare( Constants::get_constant( 'WC_VERSION' ), $check_version, '>' ) ) {
115 continue;
116 }
117
118 $matches = null;
119 if ( preg_match( $notice_regexp, $content, $matches ) ) {
120 $notices = (array) preg_split( '~[\r\n]+~', trim( $matches[2] ) );
121
122 if ( version_compare( trim( $matches[1] ), $check_version, '=' ) ) {
123 $upgrade_notice .= '<p class="wc_plugin_upgrade_notice">';
124
125 foreach ( $notices as $index => $line ) {
126 $upgrade_notice .= preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '<a href="${2}">${1}</a>', $line );
127 }
128
129 $upgrade_notice .= '</p>';
130 }
131 break;
132 }
133 }
134 return wp_kses_post( $upgrade_notice );
135 }
136
137 /**
138 * JS for the modal window on the plugins screen.
139 */
140 public function plugin_screen_modal_js() {
141 ?>
142 <script>
143 ( function( $ ) {
144 var $update_box = $( '#woocommerce-update' );
145 var $update_link = $update_box.find('a.update-link').first();
146 var update_url = $update_link.attr( 'href' );
147
148 // Set up thickbox.
149 $update_link.removeClass( 'update-link' );
150 $update_link.addClass( 'wc-thickbox' );
151 $update_link.attr( 'href', '#TB_inline?height=600&width=550&inlineId=wc_untested_extensions_modal' );
152
153 // Trigger the update if the user accepts the modal's warning.
154 $( '#wc_untested_extensions_modal .accept' ).on( 'click', function( evt ) {
155 evt.preventDefault();
156 tb_remove();
157 $update_link.removeClass( 'wc-thickbox open-plugin-details-modal' );
158 $update_link.addClass( 'update-link' );
159 $update_link.attr( 'href', update_url );
160 $update_link.trigger( 'click' );
161 });
162
163 $( '#wc_untested_extensions_modal .cancel' ).on( 'click', function( evt ) {
164 evt.preventDefault();
165 tb_remove();
166 });
167 })( jQuery );
168 </script>
169 <?php
170 $this->generic_modal_js();
171 }
172 }
173 new WC_Plugins_Screen_Updates();
174