PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 8.5.3
Jetpack – WP Security, Backup, Speed, & Growth v8.5.3
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / class.jetpack-plan.php
jetpack Last commit date
3rd-party 6 years ago _inc 6 years ago bin 6 years ago css 6 years ago extensions 1 year ago images 6 years ago json-endpoints 3 years ago languages 6 years ago modules 1 year ago sal 6 years ago src 6 years ago vendor 6 years ago views 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 6 years ago class.frame-nonce-preview.php 6 years ago class.jetpack-admin.php 6 years ago class.jetpack-affiliate.php 6 years ago class.jetpack-autoupdate.php 6 years ago class.jetpack-bbpress-json-api.compat.php 6 years ago class.jetpack-cli.php 6 years ago class.jetpack-client-server.php 6 years ago class.jetpack-connection-banner.php 6 years ago class.jetpack-data.php 6 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 6 years ago class.jetpack-heartbeat.php 6 years ago class.jetpack-idc.php 6 years ago class.jetpack-ixr-client.php 6 years ago class.jetpack-modules-list-table.php 6 years ago class.jetpack-network-sites-list-table.php 6 years ago class.jetpack-network.php 6 years ago class.jetpack-plan.php 6 years ago class.jetpack-post-images.php 6 years ago class.jetpack-twitter-cards.php 6 years ago class.jetpack-user-agent.php 6 years ago class.jetpack-xmlrpc-server.php 6 years ago class.jetpack.php 6 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 6 years ago class.photon.php 6 years ago composer.json 6 years ago functions.compat.php 6 years ago functions.cookies.php 6 years ago functions.gallery.php 6 years ago functions.global.php 6 years ago functions.opengraph.php 6 years ago functions.photon.php 6 years ago jest.config.js 6 years ago jetpack.php 1 year ago json-api-config.php 10 years ago json-endpoints.php 7 years ago load-jetpack.php 6 years ago locales.php 7 years ago readme.txt 1 year ago require-lib.php 6 years ago uninstall.php 6 years ago wpml-config.xml 10 years ago
class.jetpack-plan.php
237 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Handles fetching of the site's plan from WordPress.com and caching the value locally.
4 *
5 * Not to be confused with the `Jetpack_Plans` class (in `_inc/lib/plans.php`), which
6 * fetches general information about all available plans from WordPress.com, side-effect free.
7 *
8 * @package Jetpack
9 */
10
11 use Automattic\Jetpack\Connection\Client;
12
13 /**
14 * Provides methods methods for fetching the plan from WordPress.com.
15 */
16 class Jetpack_Plan {
17 /**
18 * A cache variable to hold the active plan for the current request.
19 *
20 * @var array
21 */
22 private static $active_plan_cache;
23
24 const PLAN_OPTION = 'jetpack_active_plan';
25
26 /**
27 * Given a response to the `/sites/%d` endpoint, will parse the response and attempt to set the
28 * plan from the response.
29 *
30 * @param array $response The response from `/sites/%d`.
31 * @return bool Was the plan successfully updated?
32 */
33 public static function update_from_sites_response( $response ) {
34 // Bail if there was an error or malformed response.
35 if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
36 return false;
37 }
38
39 $body = wp_remote_retrieve_body( $response );
40 if ( is_wp_error( $body ) ) {
41 return false;
42 }
43
44 // Decode the results.
45 $results = json_decode( $body, true );
46
47 // Bail if there were no results or plan details returned.
48 if ( ! is_array( $results ) || ! isset( $results['plan'] ) ) {
49 return false;
50 }
51
52 // Store the new plan in an option and return true if updated.
53 $result = update_option( self::PLAN_OPTION, $results['plan'], true );
54 if ( ! $result ) {
55 // If we got to this point, then we know we need to update. So, assume there is an issue
56 // with caching. To fix that issue, we can delete the current option and then update.
57 delete_option( self::PLAN_OPTION );
58 $result = update_option( self::PLAN_OPTION, $results['plan'], true );
59 }
60
61 if ( $result ) {
62 // Reset the cache since we've just updated the plan.
63 self::$active_plan_cache = null;
64 }
65
66 return $result;
67 }
68
69 /**
70 * Make an API call to WordPress.com for plan status
71 *
72 * @uses Jetpack_Options::get_option()
73 * @uses Client::wpcom_json_api_request_as_blog()
74 * @uses update_option()
75 *
76 * @access public
77 * @static
78 *
79 * @return bool True if plan is updated, false if no update
80 */
81 public static function refresh_from_wpcom() {
82 // Make the API request.
83 $request = sprintf( '/sites/%d', Jetpack_Options::get_option( 'id' ) );
84 $response = Client::wpcom_json_api_request_as_blog( $request, '1.1' );
85
86 return self::update_from_sites_response( $response );
87 }
88
89 /**
90 * Get the plan that this Jetpack site is currently using.
91 *
92 * @uses get_option()
93 *
94 * @access public
95 * @static
96 *
97 * @return array Active Jetpack plan details
98 */
99 public static function get() {
100 // this can be expensive to compute so we cache for the duration of a request.
101 if ( is_array( self::$active_plan_cache ) && ! empty( self::$active_plan_cache ) ) {
102 return self::$active_plan_cache;
103 }
104
105 $plan = get_option( self::PLAN_OPTION, array() );
106
107 // Set the default options.
108 $plan = wp_parse_args(
109 $plan,
110 array(
111 'product_slug' => 'jetpack_free',
112 'class' => 'free',
113 'features' => array(
114 'active' => array(),
115 ),
116 )
117 );
118
119 $supports = array();
120
121 // Define what paid modules are supported by personal plans.
122 $personal_plans = array(
123 'jetpack_personal',
124 'jetpack_personal_monthly',
125 'personal-bundle',
126 'personal-bundle-monthly',
127 'personal-bundle-2y',
128 );
129
130 if ( in_array( $plan['product_slug'], $personal_plans, true ) ) {
131 // special support value, not a module but a separate plugin.
132 $supports[] = 'akismet';
133 $supports[] = 'recurring-payments';
134 $plan['class'] = 'personal';
135 }
136
137 // Define what paid modules are supported by premium plans.
138 $premium_plans = array(
139 'jetpack_premium',
140 'jetpack_premium_monthly',
141 'value_bundle',
142 'value_bundle-monthly',
143 'value_bundle-2y',
144 );
145
146 if ( in_array( $plan['product_slug'], $premium_plans, true ) ) {
147 $supports[] = 'akismet';
148 $supports[] = 'recurring-payments';
149 $supports[] = 'simple-payments';
150 $supports[] = 'vaultpress';
151 $supports[] = 'videopress';
152 $plan['class'] = 'premium';
153 }
154
155 // Define what paid modules are supported by professional plans.
156 $business_plans = array(
157 'jetpack_business',
158 'jetpack_business_monthly',
159 'business-bundle',
160 'business-bundle-monthly',
161 'business-bundle-2y',
162 'ecommerce-bundle',
163 'ecommerce-bundle-monthly',
164 'ecommerce-bundle-2y',
165 'vip',
166 );
167
168 if ( in_array( $plan['product_slug'], $business_plans, true ) ) {
169 $supports[] = 'akismet';
170 $supports[] = 'recurring-payments';
171 $supports[] = 'simple-payments';
172 $supports[] = 'vaultpress';
173 $supports[] = 'videopress';
174 $plan['class'] = 'business';
175 }
176
177 // get available features.
178 foreach ( Jetpack::get_available_modules() as $module_slug ) {
179 $module = Jetpack::get_module( $module_slug );
180 if ( ! isset( $module ) || ! is_array( $module ) ) {
181 continue;
182 }
183 if ( in_array( 'free', $module['plan_classes'], true ) || in_array( $plan['class'], $module['plan_classes'], true ) ) {
184 $supports[] = $module_slug;
185 }
186 }
187
188 $plan['supports'] = $supports;
189
190 self::$active_plan_cache = $plan;
191
192 return $plan;
193 }
194
195 /**
196 * Determine whether the active plan supports a particular feature
197 *
198 * @uses Jetpack_Plan::get()
199 *
200 * @access public
201 * @static
202 *
203 * @param string $feature The module or feature to check.
204 *
205 * @return bool True if plan supports feature, false if not
206 */
207 public static function supports( $feature ) {
208 // Search product bypasses plan feature check.
209 if ( 'search' === $feature && (bool) get_option( 'has_jetpack_search_product' ) ) {
210 return true;
211 }
212
213 $plan = self::get();
214
215 // Manually mapping WordPress.com features to Jetpack module slugs.
216 foreach ( $plan['features']['active'] as $wpcom_feature ) {
217 switch ( $wpcom_feature ) {
218 case 'wordads-jetpack':
219 // WordAds are supported for this site.
220 if ( 'wordads' === $feature ) {
221 return true;
222 }
223 break;
224 }
225 }
226
227 if (
228 in_array( $feature, $plan['supports'], true )
229 || in_array( $feature, $plan['features']['active'], true )
230 ) {
231 return true;
232 }
233
234 return false;
235 }
236 }
237