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 -264 12.2.316.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,197 +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 - 'personal-bundle-3y',
66 - 'starter-plan',
67 - ),
68 - 'supports' => array(
69 - 'akismet',
70 - 'payments',
71 - 'videopress',
72 - ),
73 - ),
74 - 'premium' => array(
75 - 'plans' => array(
76 - 'jetpack_premium',
77 - 'jetpack_premium_monthly',
78 - 'value_bundle',
79 - 'value_bundle-monthly',
80 - 'value_bundle-2y',
81 - 'value_bundle-3y',
82 - ),
83 - 'supports' => array(
84 - 'simple-payments',
85 - 'vaultpress',
86 - 'videopress',
87 - 'republicize',
88 - ),
89 - ),
90 - 'security' => array(
91 - 'plans' => array(
92 - 'jetpack_security_daily',
93 - 'jetpack_security_daily_monthly',
94 - 'jetpack_security_realtime',
95 - 'jetpack_security_realtime_monthly',
96 - 'jetpack_security_t1_yearly',
97 - 'jetpack_security_t1_monthly',
98 - 'jetpack_security_t2_yearly',
99 - 'jetpack_security_t2_monthly',
100 - ),
101 - 'supports' => array(),
102 - ),
103 - 'business' => array(
104 - 'plans' => array(
105 - 'jetpack_business',
106 - 'jetpack_business_monthly',
107 - 'business-bundle',
108 - 'business-bundle-monthly',
109 - 'business-bundle-2y',
110 - 'business-bundle-3y',
111 - 'ecommerce-bundle',
112 - 'ecommerce-bundle-monthly',
113 - 'ecommerce-bundle-2y',
114 - 'ecommerce-bundle-3y',
115 - 'pro-plan',
116 - ),
117 - 'supports' => array(),
118 - ),
119 -
120 - 'complete' => array(
121 - 'plans' => array(
122 - 'jetpack_complete',
123 - 'jetpack_complete_monthly',
124 - 'vip',
125 - ),
126 - 'supports' => array(),
127 - ),
128 - );
129 -
130 46 /**
131 47 * Given a response to the `/sites/%d` endpoint, will parse the response and attempt to set the
132 48 * site's plan and products from the response.
133 49 *
50 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::update_from_sites_response instead.
51 + *
134 52 * @param array $response The response from `/sites/%d`.
135 53 * @return bool Was the plan successfully updated?
136 54 */
137 55 public static function update_from_sites_response( $response ) {
138 - // Bail if there was an error or malformed response.
139 - if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
140 - return false;
141 - }
56 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::update_from_sites_response' );
142 57
143 - $body = wp_remote_retrieve_body( $response );
144 - if ( is_wp_error( $body ) ) {
145 - return false;
146 - }
147 -
148 - // Decode the results.
149 - $results = json_decode( $body, true );
150 -
151 - if ( ! is_array( $results ) ) {
152 - return false;
153 - }
154 -
155 - if ( isset( $results['products'] ) ) {
156 - // Store the site's products in an option and return true if updated.
157 - self::store_data_in_option( self::SITE_PRODUCTS_OPTION, $results['products'] );
158 - }
159 -
160 - if ( ! isset( $results['plan'] ) ) {
161 - return false;
162 - }
163 -
164 - $current_plan = get_option( self::PLAN_OPTION, array() );
165 -
166 - if ( ! empty( $current_plan ) && $current_plan === $results['plan'] ) {
167 - // Bail if the plans array hasn't changed.
168 - return false;
169 - }
170 -
171 - // Store the new plan in an option and return true if updated.
172 - $result = self::store_data_in_option( self::PLAN_OPTION, $results['plan'] );
173 -
174 - if ( $result ) {
175 - // Reset the cache since we've just updated the plan.
176 - self::$active_plan_cache = null;
177 - }
178 -
179 - return $result;
58 + return Current_Plan::update_from_sites_response( $response );
180 59 }
181 60
182 61 /**
183 - * Store data in an option.
184 - *
185 - * @param string $option The name of the option that will store the data.
186 - * @param array $data Data to be store in an option.
187 - * @return bool Were the subscriptions successfully updated?
188 - */
189 - private static function store_data_in_option( $option, $data ) {
190 - $result = update_option( $option, $data, true );
191 -
192 - // If something goes wrong with the update, so delete the current option and then update it.
193 - if ( ! $result ) {
194 - delete_option( $option );
195 - $result = update_option( $option, $data, true );
196 - }
197 -
198 - return $result;
199 - }
200 -
201 - /**
202 62 * Make an API call to WordPress.com for plan status
203 63 *
204 - * @uses Jetpack_Options::get_option()
205 - * @uses Client::wpcom_json_api_request_as_blog()
206 - * @uses update_option()
64 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::refresh_from_wpcom instead.
207 65 *
208 66 * @access public
209 67 * @static
210 68 *
@@ -210,19 +68,17 @@
210 68 *
211 69 * @return bool True if plan is updated, false if no update
212 70 */
213 71 public static function refresh_from_wpcom() {
214 - // Make the API request.
215 - $request = sprintf( '/sites/%d', Jetpack_Options::get_option( 'id' ) );
216 - $response = Client::wpcom_json_api_request_as_blog( $request, '1.1' );
72 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::refresh_from_wpcom' );
217 73
218 - return self::update_from_sites_response( $response );
74 + return Current_Plan::refresh_from_wpcom();
219 75 }
220 76
221 77 /**
222 78 * Get the plan that this Jetpack site is currently using.
223 79 *
224 - * @uses get_option()
80 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::get instead.
225 81 *
226 82 * @access public
227 83 * @static
228 84 *
@@ -228,51 +84,17 @@
228 84 *
229 85 * @return array Active Jetpack plan details
230 86 */
231 87 public static function get() {
232 - // this can be expensive to compute so we cache for the duration of a request.
233 - if ( is_array( self::$active_plan_cache ) && ! empty( self::$active_plan_cache ) ) {
234 - return self::$active_plan_cache;
235 - }
88 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::get' );
236 89
237 - $plan = get_option( self::PLAN_OPTION, array() );
238 -
239 - // Set the default options.
240 - $plan = wp_parse_args(
241 - $plan,
242 - array(
243 - 'product_slug' => 'jetpack_free',
244 - 'class' => 'free',
245 - 'features' => array(
246 - 'active' => array(),
247 - ),
248 - )
249 - );
250 -
251 - list( $plan['class'], $supports ) = self::get_class_and_features( $plan['product_slug'] );
252 -
253 - // get available features.
254 - foreach ( Jetpack::get_available_modules() as $module_slug ) {
255 - $module = Jetpack::get_module( $module_slug );
256 - if ( ! isset( $module ) || ! is_array( $module ) ) {
257 - continue;
258 - }
259 - if ( in_array( 'free', $module['plan_classes'], true ) || in_array( $plan['class'], $module['plan_classes'], true ) ) {
260 - $supports[] = $module_slug;
261 - }
262 - }
263 -
264 - $plan['supports'] = $supports;
265 -
266 - self::$active_plan_cache = $plan;
267 -
268 - return $plan;
90 + return Current_Plan::get();
269 91 }
270 92
271 93 /**
272 94 * Get the site's products.
273 95 *
274 - * @uses get_option()
96 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::get_products instead.
275 97 *
276 98 * @access public
277 99 * @static
278 100 *
@@ -278,48 +100,32 @@
278 100 *
279 101 * @return array Active Jetpack products
280 102 */
281 103 public static function get_products() {
282 - return get_option( self::SITE_PRODUCTS_OPTION, array() );
283 - }
104 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::get_products' );
284 105
285 - /**
286 - * Get the class of plan and a list of features it supports
287 - *
288 - * @param string $plan_slug The plan that we're interested in.
289 - * @return array Two item array, the plan class and the an array of features.
290 - */
291 - private static function get_class_and_features( $plan_slug ) {
292 - $features = array();
293 - foreach ( self::PLAN_DATA as $class => $details ) {
294 - $features = array_merge( $features, $details['supports'] );
295 - if ( in_array( $plan_slug, $details['plans'], true ) ) {
296 - return array( $class, $features );
297 - }
298 - }
299 - return array( 'free', self::PLAN_DATA['free']['supports'] );
106 + return Current_Plan::get_products();
300 107 }
301 108
302 109 /**
303 110 * Gets the minimum plan slug that supports the given feature
304 111 *
112 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::get_minimum_plan_for_feature instead.
113 + *
305 114 * @param string $feature The name of the feature.
306 115 * @return string|bool The slug for the minimum plan that supports.
307 116 * the feature or false if not found
308 117 */
309 118 public static function get_minimum_plan_for_feature( $feature ) {
310 - foreach ( self::PLAN_DATA as $details ) {
311 - if ( in_array( $feature, $details['supports'], true ) ) {
312 - return $details['plans'][0];
313 - }
314 - }
315 - 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 );
316 122 }
317 123
318 124 /**
319 125 * Determine whether the active plan supports a particular feature
320 126 *
321 - * @uses Jetpack_Plan::get()
127 + * @deprecated 12.3 use Automattic\Jetpack\Current_Plan::supports instead.
322 128 *
323 129 * @access public
324 130 * @static
325 131 *
@@ -327,41 +133,9 @@
327 133 *
328 134 * @return bool True if plan supports feature, false if not
329 135 */
330 136 public static function supports( $feature ) {
331 - // Hijack the feature eligibility check on WordPress.com sites since they are gated differently.
332 - $should_wpcom_gate_feature = (
333 - function_exists( 'wpcom_site_has_feature' ) &&
334 - function_exists( 'wpcom_feature_exists' ) &&
335 - wpcom_feature_exists( $feature )
336 - );
337 - if ( $should_wpcom_gate_feature ) {
338 - return wpcom_site_has_feature( $feature );
339 - }
137 + _deprecated_function( __METHOD__, '12.3', 'Automattic\Jetpack\Current_Plan::supports' );
340 138
341 - // Search product bypasses plan feature check.
342 - if ( 'search' === $feature && (bool) get_option( 'has_jetpack_search_product' ) ) {
343 - return true;
344 - }
345 -
346 - // As of Q3 2021 - a videopress free tier is available to all plans.
347 - if ( 'videopress' === $feature ) {
348 - return true;
349 - }
350 -
351 - // As of 05 2023 - all plans support Earn features (minus 'simple-payments')
352 - if ( in_array( $feature, array( 'donations', 'recurring-payments', 'premium-content/container' ), true ) ) {
353 - return true;
354 - }
355 -
356 - $plan = self::get();
357 -
358 - if (
359 - in_array( $feature, $plan['supports'], true )
360 - || in_array( $feature, $plan['features']['active'], true )
361 - ) {
362 - return true;
363 - }
364 -
365 - return false;
139 + return Current_Plan::supports( $feature );
366 140 }
367 141 }