PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 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 / jetpack_vendor / automattic / jetpack-search / src / class-plan.php
jetpack / jetpack_vendor / automattic / jetpack-search / src Last commit date
classic-search 3 days ago customberg 8 months ago customizer 3 months ago dashboard 2 months ago initializers 1 month ago inline-search 3 days ago instant-search 2 months ago search-blocks 3 days ago widgets 1 month ago wpes 8 months ago class-ai-answers.php 3 months ago class-cli.php 3 months ago class-helper.php 3 days ago class-module-control.php 2 months ago class-options.php 3 months ago class-package.php 3 days ago class-plan.php 8 months ago class-rest-controller.php 1 month ago class-settings.php 2 months ago class-stats.php 8 months ago class-template-tags.php 8 months ago
class-plan.php
185 lines
1 <?php
2 /**
3 * The Search Plan class.
4 * Registers the REST routes for Search.
5 *
6 * @package automattic/jetpack-search
7 */
8
9 namespace Automattic\Jetpack\Search;
10
11 use Automattic\Jetpack\Connection\Client;
12 use Jetpack_Options;
13 use WP_Error;
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit( 0 );
17 }
18
19 /**
20 * Registers the REST routes for Search.
21 */
22 class Plan {
23 const JETPACK_SEARCH_PLAN_INFO_OPTION_KEY = 'jetpack_search_plan_info';
24 const JETPACK_SEARCH_EVER_SUPPORTED_SEARCH = 'jetpack_search_ever_supported_search';
25
26 // The pricing update starting from August 2022.
27 const JETPACK_SEARCH_NEW_PRICING_VERSION = '202208';
28 const JETPACK_SEARCH_FREE_PRODUCT_SLUG = 'jetpack_search_free';
29
30 /**
31 * Whether we have hooked the actions.
32 *
33 * @var boolean
34 */
35 protected static $update_plan_hook_initialized = false;
36
37 /**
38 * Init hooks for updating plan info
39 */
40 public function init_hooks() {
41 // Update plan info from WPCOM on Jetpack heartbeat.
42 // TODO: implement heartbeart for search.
43 if ( ! static::$update_plan_hook_initialized ) {
44 add_action( 'jetpack_heartbeat', array( $this, 'get_plan_info_from_wpcom' ) );
45 static::$update_plan_hook_initialized = true;
46 }
47 }
48
49 /**
50 * Refresh plan info stored in options
51 */
52 public function get_plan_info_from_wpcom() {
53 $blog_id = Jetpack_Options::get_option( 'id' );
54 $response = Client::wpcom_json_api_request_as_blog(
55 '/sites/' . $blog_id . '/jetpack-search/plan',
56 '2',
57 array(),
58 null,
59 'wpcom'
60 );
61
62 // store plan in options.
63 $this->update_search_plan_info( $response );
64
65 return $response;
66 }
67
68 /**
69 * Get plan info.
70 *
71 * @param bool $force_refresh - Default to false. Set true to load from WPCOM.
72 */
73 public function get_plan_info( $force_refresh = false ) {
74 if ( $force_refresh ) {
75 $this->get_plan_info_from_wpcom();
76 }
77 $plan_info = get_option( self::JETPACK_SEARCH_PLAN_INFO_OPTION_KEY );
78 if ( false === $plan_info && ! $force_refresh ) {
79 $plan_info = $this->get_plan_info( true );
80 }
81 return $plan_info;
82 }
83
84 /**
85 * Please use `supports_instant_search` instead.
86 *
87 * @deprecated
88 */
89 public function has_jetpack_search_product() {
90 return (bool) get_option( 'has_jetpack_search_product' );
91 }
92
93 /**
94 * Returns true if plan supports Instant Search.
95 */
96 public function supports_instant_search() {
97 $plan_info = $this->get_plan_info();
98 return ( isset( $plan_info['supports_instant_search'] ) && $plan_info['supports_instant_search'] );
99 }
100
101 /**
102 * Returns true if the plan support either Instant Search or Classic Search.
103 */
104 public function supports_search() {
105 $plan_info = $this->get_plan_info();
106 return ( isset( $plan_info['supports_search'] ) && $plan_info['supports_search'] );
107 }
108
109 /**
110 * Returns true if the plan usage is exceeded and search should no longer work.
111 */
112 public function must_upgrade() {
113 $plan_info = $this->get_plan_info();
114 return isset( $plan_info['plan_usage']['must_upgrade'] ) && $plan_info['plan_usage']['must_upgrade'];
115 }
116
117 /**
118 * Returns true if the plan only supports Classic Search.
119 */
120 public function supports_only_classic_search() {
121 $plan_info = $this->get_plan_info();
122 return isset( $plan_info['supports_only_classic_search'] ) && $plan_info['supports_only_classic_search'];
123 }
124
125 /**
126 * Whether the plan(s) ever supported search.
127 */
128 public function ever_supported_search() {
129 return (bool) get_option( self::JETPACK_SEARCH_EVER_SUPPORTED_SEARCH ) || $this->supports_search();
130 }
131
132 /**
133 * Returns true if the site is on free plan.
134 */
135 public function is_free_plan() {
136 $plan_info = $this->get_plan_info();
137 return Helper::is_forced_free_plan() || ( isset( $plan_info['effective_subscription']['product_slug'] ) && $plan_info['effective_subscription']['product_slug'] === self::JETPACK_SEARCH_FREE_PRODUCT_SLUG );
138 }
139
140 /**
141 * Update `has_jetpack_search_product` regarding the plan information
142 *
143 * @param array|WP_Error $response - Resopnse from WPCOM.
144 * @return bool - true on success, false on failure.
145 */
146 public function update_search_plan_info( $response ) {
147 if ( is_wp_error( $response ) ) {
148 return false;
149 }
150 $body = json_decode( wp_remote_retrieve_body( $response ), true );
151 $status_code = wp_remote_retrieve_response_code( $response );
152
153 if ( 200 !== $status_code ) {
154 return false;
155 }
156
157 return $this->set_plan_options( $body );
158 }
159
160 /**
161 * Set plan info to options table
162 *
163 * @param array $plan_info - the decoded plan info array.
164 */
165 public function set_plan_options( $plan_info ) {
166 if ( isset( $plan_info['swap_classic_to_inline_search'] ) && is_bool( $plan_info['swap_classic_to_inline_search'] ) ) {
167 update_option( Module_Control::SEARCH_MODULE_SWAP_CLASSIC_TO_INLINE_OPTION_KEY, (bool) $plan_info['swap_classic_to_inline_search'] );
168 }
169 if ( ! isset( $plan_info['supports_instant_search'] ) ) {
170 return false;
171 }
172 // set option whether has Jetpack Search plan for capability reason.
173 if ( get_option( 'has_jetpack_search_product' ) !== (bool) $plan_info['supports_instant_search'] ) {
174 update_option( 'has_jetpack_search_product', (bool) $plan_info['supports_instant_search'] );
175 }
176 // We use this option to determine the visibility of search submenu.
177 // If the site ever had search subscription, then we record it and show the menu after.
178 if ( $plan_info['supports_instant_search'] ) {
179 update_option( self::JETPACK_SEARCH_EVER_SUPPORTED_SEARCH, true, false );
180 }
181 update_option( self::JETPACK_SEARCH_PLAN_INFO_OPTION_KEY, $plan_info );
182 return true;
183 }
184 }
185