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 / dashboard / class-dashboard.php
jetpack / jetpack_vendor / automattic / jetpack-search / src / dashboard Last commit date
class-dashboard.php 8 months ago class-initial-state.php 2 months ago
class-dashboard.php
223 lines
1 <?php
2 /**
3 * A class that adds a search dashboard to wp-admin.
4 *
5 * @package automattic/jetpack
6 */
7
8 namespace Automattic\Jetpack\Search;
9
10 use Automattic\Jetpack\Admin_UI\Admin_Menu;
11 use Automattic\Jetpack\Assets;
12 use Automattic\Jetpack\Connection\Initial_State as Connection_Initial_State;
13 use Automattic\Jetpack\Connection\Manager as Connection_Manager;
14 use Automattic\Jetpack\Status;
15 use Automattic\Jetpack\Tracking;
16 /**
17 * Responsible for adding a search dashboard to wp-admin.
18 *
19 * @package Automattic\Jetpack\Search
20 */
21 class Dashboard {
22 /**
23 * Whether the class has been initialized
24 *
25 * @var boolean
26 */
27 private static $initialized = false;
28 /**
29 * Plan instance
30 *
31 * @var \Automattic\Jetpack\Search\Plan
32 */
33 protected $plan;
34
35 /**
36 * Connection manager instance
37 *
38 * @var \Automattic\Jetpack\Connection\Manager
39 */
40 protected $connection_manager;
41
42 /**
43 * Module_Control instance
44 *
45 * @var \Automattic\Jetpack\Search\Module_Control
46 */
47 protected $module_control;
48
49 /**
50 * Priority for the dashboard menu
51 * For Jetpack sites: Akismet uses 4, so we use 1 to ensure both menus are added when only they exist.
52 * For Simple sites: the value is overriden in a child class with value 100000 to wait for all menus to be registered.
53 *
54 * @var int
55 */
56 protected $search_menu_priority = 1;
57
58 /**
59 * Contructor
60 *
61 * @param \Automattic\Jetpack\Search\Plan $plan - Plan instance.
62 * @param \Automattic\Jetpack\Connection\Manager $connection_manager - Connection Manager instance.
63 * @param \Automattic\Jetpack\Search\Module_Control $module_control - Module_Control instance.
64 */
65 public function __construct( $plan = null, $connection_manager = null, $module_control = null ) {
66 $this->plan = $plan ? $plan : new Plan();
67 $this->connection_manager = $connection_manager ? $connection_manager : new Connection_Manager( Package::SLUG );
68 $this->module_control = $module_control ? $module_control : new Module_Control( $this->plan );
69 $this->plan->init_hooks();
70 }
71
72 /**
73 * Initialise hooks.
74 *
75 * We use the `config` package to initialize the search package, which ensures the package is
76 * only initialized once. However earlier versions of Jetpack would still forcely initialize the
77 * dashboard. As a result, there would be two `Search` submenus if we don't ensure the dashboard
78 * is initialized only once. So we use `$initialized` to ensure the class is only initialized once.
79 *
80 * Ref: https://github.com/Automattic/jetpack/pull/21888/files#diff-aae7d66951585fc55053a4d53b68552a41864d2c69aee900574ef4404b7ad5f7L42
81 */
82 public function init_hooks() {
83 if ( ! self::$initialized ) {
84 self::$initialized = true;
85 add_action( 'admin_menu', array( $this, 'add_wp_admin_submenu' ), $this->search_menu_priority );
86 // Check if the site plan changed and deactivate module accordingly.
87 add_action( 'current_screen', array( $this, 'check_plan_deactivate_search_module' ) );
88 }
89 }
90
91 /**
92 * The page to be added to submenu
93 */
94 public function add_wp_admin_submenu() {
95 // Jetpack of version <= 10.5 would register `jetpack-search` submenu with its built-in search module.
96 $this->remove_search_submenu_if_exists();
97
98 if ( $this->should_add_search_submenu() ) {
99 $page_suffix = Admin_Menu::add_menu(
100 /** "Search" is a product name, do not translate. */
101 'Jetpack Search',
102 'Search',
103 'manage_options',
104 'jetpack-search',
105 array( $this, 'render' ),
106 10
107 );
108 } else {
109 // always add the page, but hide it from the menu.
110 $page_suffix = add_submenu_page(
111 '',
112 /** "Search" is a product name, do not translate. */
113 'Jetpack Search',
114 'Search',
115 'manage_options',
116 'jetpack-search',
117 array( $this, 'render' )
118 );
119 }
120
121 if ( $page_suffix ) {
122 add_action( 'load-' . $page_suffix, array( $this, 'admin_init' ) );
123 }
124 }
125
126 /**
127 * Override render funtion
128 */
129 public function render() {
130 ?>
131 <div id="jp-search-dashboard" class="jp-search-dashboard">
132 <div class="hide-if-js"><?php esc_html_e( 'Your Jetpack Search dashboard requires JavaScript to function properly.', 'jetpack-search-pkg' ); ?></div>
133 </div>
134 <?php
135 }
136
137 /**
138 * Test whether we should show Search menu.
139 *
140 * @return boolean Show search sub menu or not.
141 */
142 protected function should_add_search_submenu() {
143 /**
144 * The filter allows to ommit adding a submenu item for Jetpack Search.
145 *
146 * @since 0.11.2
147 *
148 * @param boolean $should_add_search_submenu Default value is true.
149 */
150 return apply_filters( 'jetpack_search_should_add_search_submenu', current_user_can( 'manage_options' ) );
151 }
152
153 /**
154 * Remove `jetpack-search` submenu page
155 */
156 protected function remove_search_submenu_if_exists() {
157 remove_submenu_page( 'jetpack', 'jetpack-search' );
158 }
159
160 /**
161 * Initialize the admin resources.
162 */
163 public function admin_init() {
164 add_action( 'admin_enqueue_scripts', array( $this, 'load_admin_scripts' ) );
165 }
166
167 /**
168 * Enqueue admin scripts.
169 */
170 public function load_admin_scripts() {
171 if ( $this->should_enqueue_tracking_script() ) {
172 // Required for Analytics.
173 Tracking::register_tracks_functions_scripts( true );
174 }
175
176 Assets::register_script(
177 'jp-search-dashboard',
178 '../../build/dashboard/jp-search-dashboard.js',
179 __FILE__,
180 array(
181 'in_footer' => true,
182 'textdomain' => 'jetpack-search-pkg',
183 )
184 );
185 Assets::enqueue_script( 'jp-search-dashboard' );
186
187 // Add objects to be passed to the initial state of the app.
188 // Use wp_add_inline_script instead of wp_localize_script, see https://core.trac.wordpress.org/ticket/25280.
189 wp_add_inline_script(
190 'jp-search-dashboard',
191 ( new Initial_State() )->render(),
192 'before'
193 );
194
195 // Connection initial state.
196 Connection_Initial_State::render_script( 'jp-search-dashboard' );
197 }
198
199 /**
200 * Check if we should enqueue the tracking script.
201 */
202 protected function should_enqueue_tracking_script() {
203 return ! ( new Status() )->is_offline_mode() && $this->connection_manager->is_connected();
204 }
205
206 /**
207 * Deactivate search module if plan doesn't support search.
208 *
209 * @param \WP_Screen $current_screen Creent screen object.
210 */
211 public function check_plan_deactivate_search_module( $current_screen ) {
212 // Only run on Jetpack admin pages.
213 // The first two checks for current screen are cheap to run on every page.
214 if (
215 property_exists( $current_screen, 'base' ) &&
216 strpos( $current_screen->base, 'jetpack_page_' ) !== false &&
217 ( ! $this->plan->supports_search() || $this->plan->must_upgrade() )
218 ) {
219 $this->module_control->deactivate();
220 }
221 }
222 }
223