PluginProbe
ElasticPress / 5.3.5
ElasticPress v5.3.5
5.3.5 5.3.4 3.6.5 3.6.6 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.6.0 4.6.1 4.7.0 4.7.1 4.7.2 5.0.0 5.0.1 5.0.2 All 108 releases
elasticpress / includes / classes / AdminBar.php

AdminBar.php in ElasticPress 5.3.5, at includes/classes/AdminBar.php

243 lines 7.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * ElasticPress admin bar handler
4 *
5 * @since 5.3.0
6 * @package elasticpress
7 */
8
9 namespace ElasticPress;
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit; // Exit if accessed directly.
13 }
14
15 /**
16 * Admin bar class
17 */
18 class AdminBar {
19 /**
20 * Setup actions and filters
21 */
22 public function setup() {
23 add_action( 'admin_bar_menu', [ $this, 'add_admin_bar_status' ], 500 );
24 add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_style' ] );
25 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_style' ] );
26 add_action( 'wp_footer', [ $this, 'update_placeholders' ], 500 );
27 add_action( 'admin_footer', [ $this, 'update_placeholders' ], 500 );
28 }
29
30
31 /**
32 * Un-setup actions and filters (for multisite).
33 */
34 public function tear_down() {
35 remove_action( 'admin_bar_menu', [ $this, 'add_admin_bar_status' ], 500 );
36 remove_action( 'wp_enqueue_scripts', [ $this, 'enqueue_style' ] );
37 remove_action( 'admin_enqueue_scripts', [ $this, 'enqueue_style' ] );
38 remove_action( 'wp_footer', [ $this, 'update_placeholders' ], 500 );
39 remove_action( 'admin_footer', [ $this, 'update_placeholders' ], 500 );
40 }
41
42 /**
43 * Add the document status to the admin bar.
44 *
45 * @param \WP_Admin_Bar $admin_bar WP Admin Bar instance
46 * @return void
47 */
48 public function add_admin_bar_status( \WP_Admin_Bar $admin_bar ) {
49 if ( ! $this->should_display() ) {
50 return;
51 }
52
53 $admin_bar->add_menu(
54 [
55 'id' => 'ep-basic-status',
56 'title' => '<div id="ep-ab-icon">
57 <span class="screen-reader-text">ElasticPress</span>
58 </div>
59 <span id="ep-ab-indicator" class="ep-status-indicator"></span>',
60 ]
61 );
62
63 $admin_bar->add_menu(
64 [
65 'parent' => 'ep-basic-status',
66 'id' => 'ep-basic-status-summary',
67 'title' => __( 'No calls made to Elasticsearch', 'elasticpress' ),
68 ]
69 );
70 }
71
72 /**
73 * Enqueue the style for the admin bar status.
74 */
75 public function enqueue_style() {
76 wp_enqueue_style(
77 'ep_general_styles',
78 EP_URL . 'dist/css/general-styles.css',
79 Utils\get_asset_info( 'general-styles', 'dependencies' ),
80 Utils\get_asset_info( 'general-styles', 'version' )
81 );
82 }
83
84 /**
85 * Update the placeholders for the admin bar status.
86 */
87 public function update_placeholders() {
88 global $wp_query;
89
90 if ( ! $this->should_display() ) {
91 return;
92 }
93
94 $queries = $this->get_queries();
95 $status = $this->get_status( $queries );
96
97 $has_main_query = ! empty( $wp_query->query_vars['ep_integrate'] );
98 $is_main_query_success = $has_main_query && $wp_query->elasticsearch_success;
99
100 $main_query_status = __( 'No', 'elasticpress' );
101 if ( $has_main_query ) {
102 $main_query_status = $is_main_query_success ? __( 'Yes', 'elasticpress' ) : __( 'Failed', 'elasticpress' );
103 }
104
105 $results = [];
106 $results['main_query'] = sprintf(
107 /* translators: %s: Yes, Failed, or No */
108 __( 'Main query: %s', 'elasticpress' ),
109 $main_query_status
110 );
111 $results['total_queries'] = sprintf(
112 /* translators: %s: Total queries */
113 __( 'Total queries: %s', 'elasticpress' ),
114 count( $queries['filtered'] )
115 );
116 $results['failed_queries'] = sprintf(
117 /* translators: %s: Failed queries */
118 __( 'Failed queries: %s', 'elasticpress' ),
119 count( $queries['failed'] )
120 );
121
122 $results['debugging_article'] = sprintf(
123 '<a href="%s">' . __( 'More about debugging', 'elasticpress' ) . '</a>',
124 'https://www.elasticpress.io/resources/articles/using-the-elasticpress-debugging-add-on-plugin/'
125 );
126
127 $status_and_summary = [
128 'status' => $status,
129 'summary' => $results,
130 ];
131
132 /**
133 * Filter whether to display the admin bar status.
134 *
135 * @since 5.3.0
136 * @hook ep_admin_bar_status_and_summary
137 * @param {array} $status_and_summary CSS class of status indicator. (success, warning, or error)
138 * @param {array} $results Array of results to display in the admin bar.
139 * @param {array} $queries Array of filtered and failed queries.
140 * @param {bool} $has_main_query Whether the main query was integrated with Elasticsearch.
141 * @param {bool} $is_main_query_success Whether the main query is successful.
142 * @return {array} New status value
143 */
144 $filtered_status_and_summary = apply_filters( 'ep_admin_bar_status_and_summary', $status_and_summary, $queries, $has_main_query, $is_main_query_success );
145
146 if ( ! isset( $filtered_status_and_summary['status'], $filtered_status_and_summary['summary'] ) ) {
147 _doing_it_wrong(
148 __METHOD__,
149 esc_html__( 'The ep_admin_bar_status_and_summary filter must return an array with the status and summary keys.', 'elasticpress' ),
150 'ElasticPress 5.3.0'
151 );
152 return;
153 }
154
155 $results_output = implode( '<br>', $filtered_status_and_summary['summary'] );
156
157 $final_output = '<script>
158 document.addEventListener("DOMContentLoaded", function() {
159 document.getElementById("ep-ab-indicator").classList.add("ep-status-indicator--' . esc_js( $filtered_status_and_summary['status'] ) . '");
160 document.querySelector("#wp-admin-bar-ep-basic-status-summary .ab-item").innerHTML = ' . wp_json_encode( wp_kses_post( $results_output ) ) . ';
161 });
162 </script>';
163
164 /**
165 * Filter the final output of the admin bar status and summary.
166 *
167 * @since 5.3.0
168 * @hook ep_admin_bar_status_and_summary_output
169 * @param {string} $final_output The final output of the admin bar status and summary.
170 * @param {array} $filtered_status_and_summary The filtered status and summary.
171 * @param {array} $queries The queries.
172 * @return {string} New final output
173 */
174 echo apply_filters( 'ep_admin_bar_status_and_summary_output', $final_output, $filtered_status_and_summary, $queries ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
175 }
176
177 /**
178 * Whether to display the admin bar status.
179 *
180 * @return bool
181 */
182 protected function should_display(): bool {
183 /**
184 * Filter whether to display the admin bar status.
185 *
186 * @since 5.3.0
187 * @hook ep_admin_bar_should_display
188 * @param {bool} $should_display Whether to display the admin bar status.
189 * @return {bool} New should display value
190 */
191 return apply_filters( 'ep_admin_bar_should_display', current_user_can( Utils\get_capability( 'admin-bar' ) ) );
192 }
193
194 /**
195 * Get the queries.
196 *
197 * @since 5.3.0
198 * @return array Array of filtered and failed queries.
199 */
200 protected function get_queries(): array {
201 $queries = \ElasticPress\Elasticsearch::factory()->get_query_log();
202
203 $filtered_queries = array_filter(
204 $queries,
205 function ( $query ) {
206 if ( ! isset( $query['request'] ) ) {
207 return false;
208 }
209 return is_wp_error( $query['request'] ) || empty( $query['request']['is_ep_fake_request'] );
210 }
211 );
212 $failed_queries = array_filter(
213 $filtered_queries,
214 function ( $query ) {
215 return is_wp_error( $query['request'] ) || ! isset( $query['request']['response'], $query['request']['response']['code'] ) || $query['request']['response']['code'] < 200 || $query['request']['response']['code'] >= 300;
216 }
217 );
218
219 return [
220 'filtered' => $filtered_queries,
221 'failed' => $failed_queries,
222 ];
223 }
224
225 /**
226 * Get the status.
227 *
228 * @since 5.3.0
229 * @param array $queries The queries.
230 * @return string The status.
231 * success, error, or empty string.
232 */
233 protected function get_status( $queries ): string {
234 if ( $queries['filtered'] ) {
235 return 'success';
236 }
237 if ( $queries['failed'] ) {
238 return 'error';
239 }
240 return '';
241 }
242 }
243