PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 All 504 releases
← All changes | class.jetpack-plan.php +38 -258 12.0.3 → 16.3-a.1 View file →
@@ -1,8 +1,10 @@
1 1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 2 /**
3 3 * Handles fetching of the site's plan and products from WordPress.com and caching values locally.
4 4 *
5 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan instead.
6 + *
5 7 * Not to be confused with the `Jetpack_Plans` class (in `_inc/lib/plans.php`), which
6 8 * fetches general information about all available plans from WordPress.com, side-effect free.
7 9 *
8 10 * @package automattic/jetpack
@@ -7,9 +9,9 @@
7 9 *
8 10 * @package automattic/jetpack
9 11 */
10 12
11 -use Automattic\Jetpack\Connection\Client;
13 +use Automattic\Jetpack\Current_Plan;
12 14
13 15 /**
14 16 * Provides methods methods for fetching the site's plan and products from WordPress.com.
15 17 */
@@ -14,196 +16,53 @@
14 16 * Provides methods methods for fetching the site's plan and products from WordPress.com.
15 17 */
16 18 class Jetpack_Plan {
17 19 /**
18 - * A cache variable to hold the active plan for the current request.
20 + * The name of the option that will store the site's plan.
19 21 *
20 - * @var array
22 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::PLAN_OPTION
23 + *
24 + * @var string
21 25 */
22 - private static $active_plan_cache;
26 + const PLAN_OPTION = Current_Plan::PLAN_OPTION;
23 27
24 28 /**
25 - * The name of the option that will store the site's plan.
29 + * The name of the option that will store the site's products.
26 30 *
31 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::SITE_PRODUCTS_OPTION
32 + *
27 33 * @var string
28 34 */
29 - const PLAN_OPTION = 'jetpack_active_plan';
35 + const SITE_PRODUCTS_OPTION = Current_Plan::SITE_PRODUCTS_OPTION;
30 36
31 37 /**
32 - * The name of the option that will store the site's products.
38 + * Array of products supported by each plan.
33 39 *
34 - * @var string
40 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::PLAN_DATA
41 + *
42 + * @var array
35 43 */
36 - const SITE_PRODUCTS_OPTION = 'jetpack_site_products';
44 + const PLAN_DATA = Current_Plan::PLAN_DATA;
37 45
38 - const PLAN_DATA = array(
39 - 'free' => array(
40 - 'plans' => array(
41 - 'jetpack_free',
42 - ),
43 - 'supports' => array(
44 - 'opentable',
45 - 'calendly',
46 - 'send-a-message',
47 - 'whatsapp-button',
48 - 'social-previews',
49 - 'videopress',
50 - 'videopress/video',
51 - 'v6-video-frame-poster',
52 -
53 - 'core/video',
54 - 'core/cover',
55 - 'core/audio',
56 - ),
57 - ),
58 - 'personal' => array(
59 - 'plans' => array(
60 - 'jetpack_personal',
61 - 'jetpack_personal_monthly',
62 - 'personal-bundle',
63 - 'personal-bundle-monthly',
64 - 'personal-bundle-2y',
65 - 'starter-plan',
66 - ),
67 - 'supports' => array(
68 - 'akismet',
69 - 'payments',
70 - 'recurring-payments',
71 - 'premium-content/container',
72 - 'videopress',
73 - ),
74 - ),
75 - 'premium' => array(
76 - 'plans' => array(
77 - 'jetpack_premium',
78 - 'jetpack_premium_monthly',
79 - 'value_bundle',
80 - 'value_bundle-monthly',
81 - 'value_bundle-2y',
82 - ),
83 - 'supports' => array(
84 - 'donations',
85 - 'simple-payments',
86 - 'vaultpress',
87 - 'videopress',
88 - 'republicize',
89 - ),
90 - ),
91 - 'security' => array(
92 - 'plans' => array(
93 - 'jetpack_security_daily',
94 - 'jetpack_security_daily_monthly',
95 - 'jetpack_security_realtime',
96 - 'jetpack_security_realtime_monthly',
97 - 'jetpack_security_t1_yearly',
98 - 'jetpack_security_t1_monthly',
99 - 'jetpack_security_t2_yearly',
100 - 'jetpack_security_t2_monthly',
101 - ),
102 - 'supports' => array(),
103 - ),
104 - 'business' => array(
105 - 'plans' => array(
106 - 'jetpack_business',
107 - 'jetpack_business_monthly',
108 - 'business-bundle',
109 - 'business-bundle-monthly',
110 - 'business-bundle-2y',
111 - 'ecommerce-bundle',
112 - 'ecommerce-bundle-monthly',
113 - 'ecommerce-bundle-2y',
114 - 'pro-plan',
115 - ),
116 - 'supports' => array(),
117 - ),
118 -
119 - 'complete' => array(
120 - 'plans' => array(
121 - 'jetpack_complete',
122 - 'jetpack_complete_monthly',
123 - 'vip',
124 - ),
125 - 'supports' => array(),
126 - ),
127 - );
128 -
129 46 /**
130 47 * Given a response to the `/sites/%d` endpoint, will parse the response and attempt to set the
131 48 * site's plan and products from the response.
132 49 *
50 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::update_from_sites_response instead.
51 + *
133 52 * @param array $response The response from `/sites/%d`.
134 53 * @return bool Was the plan successfully updated?
135 54 */
136 55 public static function update_from_sites_response( $response ) {
137 - // Bail if there was an error or malformed response.
138 - if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
139 - return false;
140 - }
56 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::update_from_sites_response' );
141 57
142 - $body = wp_remote_retrieve_body( $response );
143 - if ( is_wp_error( $body ) ) {
144 - return false;
145 - }
146 -
147 - // Decode the results.
148 - $results = json_decode( $body, true );
149 -
150 - if ( ! is_array( $results ) ) {
151 - return false;
152 - }
153 -
154 - if ( isset( $results['products'] ) ) {
155 - // Store the site's products in an option and return true if updated.
156 - self::store_data_in_option( self::SITE_PRODUCTS_OPTION, $results['products'] );
157 - }
158 -
159 - if ( ! isset( $results['plan'] ) ) {
160 - return false;
161 - }
162 -
163 - $current_plan = get_option( self::PLAN_OPTION, array() );
164 -
165 - if ( ! empty( $current_plan ) && $current_plan === $results['plan'] ) {
166 - // Bail if the plans array hasn't changed.
167 - return false;
168 - }
169 -
170 - // Store the new plan in an option and return true if updated.
171 - $result = self::store_data_in_option( self::PLAN_OPTION, $results['plan'] );
172 -
173 - if ( $result ) {
174 - // Reset the cache since we've just updated the plan.
175 - self::$active_plan_cache = null;
176 - }
177 -
178 - return $result;
58 + return Current_Plan::update_from_sites_response( $response );
179 59 }
180 60
181 61 /**
182 - * Store data in an option.
183 - *
184 - * @param string $option The name of the option that will store the data.
185 - * @param array $data Data to be store in an option.
186 - * @return bool Were the subscriptions successfully updated?
187 - */
188 - private static function store_data_in_option( $option, $data ) {
189 - $result = update_option( $option, $data, true );
190 -
191 - // If something goes wrong with the update, so delete the current option and then update it.
192 - if ( ! $result ) {
193 - delete_option( $option );
194 - $result = update_option( $option, $data, true );
195 - }
196 -
197 - return $result;
198 - }
199 -
200 - /**
201 62 * Make an API call to WordPress.com for plan status
202 63 *
203 - * @uses Jetpack_Options::get_option()
204 - * @uses Client::wpcom_json_api_request_as_blog()
205 - * @uses update_option()
64 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::refresh_from_wpcom instead.
206 65 *
207 66 * @access public
208 67 * @static
209 68 *
@@ -209,19 +68,17 @@
209 68 *
210 69 * @return bool True if plan is updated, false if no update
211 70 */
212 71 public static function refresh_from_wpcom() {
213 - // Make the API request.
214 - $request = sprintf( '/sites/%d', Jetpack_Options::get_option( 'id' ) );
215 - $response = Client::wpcom_json_api_request_as_blog( $request, '1.1' );
72 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::refresh_from_wpcom' );
216 73
217 - return self::update_from_sites_response( $response );
74 + return Current_Plan::refresh_from_wpcom();
218 75 }
219 76
220 77 /**
221 78 * Get the plan that this Jetpack site is currently using.
222 79 *
223 - * @uses get_option()
80 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::get instead.
224 81 *
225 82 * @access public
226 83 * @static
227 84 *
@@ -227,51 +84,17 @@
227 84 *
228 85 * @return array Active Jetpack plan details
229 86 */
230 87 public static function get() {
231 - // this can be expensive to compute so we cache for the duration of a request.
232 - if ( is_array( self::$active_plan_cache ) && ! empty( self::$active_plan_cache ) ) {
233 - return self::$active_plan_cache;
234 - }
88 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::get' );
235 89
236 - $plan = get_option( self::PLAN_OPTION, array() );
237 -
238 - // Set the default options.
239 - $plan = wp_parse_args(
240 - $plan,
241 - array(
242 - 'product_slug' => 'jetpack_free',
243 - 'class' => 'free',
244 - 'features' => array(
245 - 'active' => array(),
246 - ),
247 - )
248 - );
249 -
250 - list( $plan['class'], $supports ) = self::get_class_and_features( $plan['product_slug'] );
251 -
252 - // get available features.
253 - foreach ( Jetpack::get_available_modules() as $module_slug ) {
254 - $module = Jetpack::get_module( $module_slug );
255 - if ( ! isset( $module ) || ! is_array( $module ) ) {
256 - continue;
257 - }
258 - if ( in_array( 'free', $module['plan_classes'], true ) || in_array( $plan['class'], $module['plan_classes'], true ) ) {
259 - $supports[] = $module_slug;
260 - }
261 - }
262 -
263 - $plan['supports'] = $supports;
264 -
265 - self::$active_plan_cache = $plan;
266 -
267 - return $plan;
90 + return Current_Plan::get();
268 91 }
269 92
270 93 /**
271 94 * Get the site's products.
272 95 *
273 - * @uses get_option()
96 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::get_products instead.
274 97 *
275 98 * @access public
276 99 * @static
277 100 *
@@ -277,48 +100,32 @@
277 100 *
278 101 * @return array Active Jetpack products
279 102 */
280 103 public static function get_products() {
281 - return get_option( self::SITE_PRODUCTS_OPTION, array() );
282 - }
104 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::get_products' );
283 105
284 - /**
285 - * Get the class of plan and a list of features it supports
286 - *
287 - * @param string $plan_slug The plan that we're interested in.
288 - * @return array Two item array, the plan class and the an array of features.
289 - */
290 - private static function get_class_and_features( $plan_slug ) {
291 - $features = array();
292 - foreach ( self::PLAN_DATA as $class => $details ) {
293 - $features = array_merge( $features, $details['supports'] );
294 - if ( in_array( $plan_slug, $details['plans'], true ) ) {
295 - return array( $class, $features );
296 - }
297 - }
298 - return array( 'free', self::PLAN_DATA['free']['supports'] );
106 + return Current_Plan::get_products();
299 107 }
300 108
301 109 /**
302 110 * Gets the minimum plan slug that supports the given feature
303 111 *
112 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::get_minimum_plan_for_feature instead.
113 + *
304 114 * @param string $feature The name of the feature.
305 115 * @return string|bool The slug for the minimum plan that supports.
306 116 * the feature or false if not found
307 117 */
308 118 public static function get_minimum_plan_for_feature( $feature ) {
309 - foreach ( self::PLAN_DATA as $details ) {
310 - if ( in_array( $feature, $details['supports'], true ) ) {
311 - return $details['plans'][0];
312 - }
313 - }
314 - return false;
119 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::get_minimum_plan_for_feature' );
120 +
121 + return Current_Plan::get_minimum_plan_for_feature( $feature );
315 122 }
316 123
317 124 /**
318 125 * Determine whether the active plan supports a particular feature
319 126 *
320 - * @uses Jetpack_Plan::get()
127 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::supports instead.
321 128 *
322 129 * @access public
323 130 * @static
324 131 *
@@ -326,36 +133,9 @@
326 133 *
327 134 * @return bool True if plan supports feature, false if not
328 135 */
329 136 public static function supports( $feature ) {
330 - // Hijack the feature eligibility check on WordPress.com sites since they are gated differently.
331 - $should_wpcom_gate_feature = (
332 - function_exists( 'wpcom_site_has_feature' ) &&
333 - function_exists( 'wpcom_feature_exists' ) &&
334 - wpcom_feature_exists( $feature )
335 - );
336 - if ( $should_wpcom_gate_feature ) {
337 - return wpcom_site_has_feature( $feature );
338 - }
137 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::supports' );
339 138
340 - // Search product bypasses plan feature check.
341 - if ( 'search' === $feature && (bool) get_option( 'has_jetpack_search_product' ) ) {
342 - return true;
343 - }
344 -
345 - // As of Q3 2021 - a videopress free tier is available to all plans.
346 - if ( 'videopress' === $feature ) {
347 - return true;
348 - }
349 -
350 - $plan = self::get();
351 -
352 - if (
353 - in_array( $feature, $plan['supports'], true )
354 - || in_array( $feature, $plan['features']['active'], true )
355 - ) {
356 - return true;
357 - }
358 -
359 - return false;
139 + return Current_Plan::supports( $feature );
360 140 }
361 141 }