PluginProbe
WPSSO Core – Complete Schema Markup and Meta Tags / 22.7.0
WPSSO Core – Complete Schema Markup and Meta Tags v22.7.0
22.7.0 22.6.1 22.6.0 22.5.3 22.5.2 22.5.1 22.4.0 22.3.0 22.2.1 22.2.0 22.1.3 22.1.2 22.1.1 22.1.0 22.0.0 21.13.3 21.13.2 trunk 21.13.1
← All changes | lib/admin-dashboard.php +345 -0 22.5.222.7.0 View file →
@@ -1,0 +1,345 @@
1 +<?php
2 +/*
3 + * License: GPLv3
4 + * License URI: https://www.gnu.org/licenses/gpl.txt
5 + * Copyright 2012-2026 Jean-Sebastien Morisset (https://wpsso.com/)
6 + */
7 +
8 +if ( ! defined( 'ABSPATH' ) ) {
9 +
10 + die( 'These aren\'t the droids you\'re looking for.' );
11 +}
12 +
13 +if ( ! class_exists( 'WpssoAdminDashboard' ) ) {
14 +
15 + class WpssoAdminDashboard {
16 +
17 + private $p; // Wpsso class object.
18 +
19 + /*
20 + * Instantiated by WpssoAdmin->__construct().
21 + */
22 + public function __construct( &$plugin ) {
23 +
24 + $this->p =& $plugin;
25 +
26 + if ( $this->p->debug->enabled ) {
27 +
28 + $this->p->debug->mark();
29 + }
30 +
31 + add_action( 'wp_dashboard_setup', array( $this, 'wp_dashboard_setup' ) );
32 + }
33 +
34 + public function wp_dashboard_setup() {
35 +
36 + wp_add_dashboard_widget( $widget_id = 'wpsso-help-support', $widget_name = __( 'WPSSO Help and Support', 'wpsso' ),
37 + $callback = array( $this, 'show_metabox_help_support' ), $control_callback = null, $callback_args = array(
38 + 'metabox_id' => $widget_id, 'metabox_title' => $widget_name ), $context = 'normal', $priority = 'high' );
39 +
40 + wp_add_dashboard_widget( $widget_id = 'wpsso-version-info', $widget_name = __( 'WPSSO Version Information', 'wpsso' ),
41 + $callback = array( $this, 'show_metabox_version_info' ), $control_callback = null, $callback_args = array(
42 + 'metabox_id' => $widget_id, 'metabox_title' => $widget_name ), $context = 'normal', $priority = 'high' );
43 +
44 + wp_add_dashboard_widget( $widget_id = 'wpsso-cache-status', $widget_name = __( 'WPSSO Cache Status', 'wpsso' ),
45 + $callback = array( $this, 'show_metabox_cache_status' ), $control_callback = null, $callback_args = array(
46 + 'metabox_id' => $widget_id, 'metabox_title' => $widget_name ), $context = 'normal', $priority = 'high' );
47 +
48 + }
49 +
50 + /*
51 + * WPSSO Cache Status.
52 + */
53 + public function show_metabox_cache_status( $obj, $mb ) {
54 +
55 + if ( WpssoUtilMetabox::show_is_hidden_content( $mb ) ) return;
56 +
57 + $decimals = 1;
58 + $table_cols = 4;
59 + $all_keys_prefix = 'wpsso_';
60 + $db_transient_keys = $this->p->util->cache->get_db_transients_keys( $all_keys_prefix, $only_expired = false );
61 +
62 + echo '<table class="wpsso-dashboard-widget">';
63 +
64 + echo '<tr><td colspan="' . $table_cols . '"><h4>';
65 + echo __( 'Database Transients', 'wpsso' );
66 + echo '</h4></td></tr>';
67 +
68 + echo '<tr>';
69 + echo '<th class="cache-label"></th>';
70 + echo '<th class="cache-count">' . __( 'Count', 'wpsso' ) . '</th>';
71 + echo '<th class="cache-size">' . __( 'MB', 'wpsso' ) . '</th>';
72 + echo '<th class="cache-expiration">' . __( 'Expiration', 'wpsso' ) . '</th>';
73 + echo '</tr>';
74 +
75 + /*
76 + * Sort the transient array and make sure the "All Transients" count is last.
77 + */
78 + $transients_info = $this->p->cf[ 'wp' ][ 'cache' ][ 'transient' ];
79 +
80 + uasort( $transients_info, array( __CLASS__, 'sort_by_label_key' ) );
81 +
82 + if ( isset( $transients_info[ $all_keys_prefix ] ) ) { // Just in case.
83 +
84 + SucomUtil::move_to_end( $transients_info, $all_keys_prefix );
85 + }
86 +
87 + foreach ( $transients_info as $cache_key => $cache_info ) {
88 +
89 + if ( empty( $cache_info ) ) {
90 +
91 + continue;
92 +
93 + } elseif ( empty( $cache_info[ 'label' ] ) ) { // Skip cache info without labels.
94 +
95 + continue;
96 + }
97 +
98 + $cache_text_dom = empty( $cache_info[ 'text_domain' ] ) ? $this->p->id : $cache_info[ 'text_domain' ];
99 + $cache_label_transl = _x( $cache_info[ 'label' ], 'option label', $cache_text_dom );
100 + $cache_count = count( preg_grep( '/^' . $cache_key . '/', $db_transient_keys ) );
101 + $cache_size = $this->p->util->cache->get_db_transients_size_mb( $cache_key );
102 + $cache_exp_secs = $this->p->util->get_cache_exp_secs( $cache_key, $cache_type = 'transient' );
103 + $human_cache_exp = $cache_exp_secs > 0 ? human_time_diff( 0, $cache_exp_secs ) : __( 'disabled', 'wpsso' );
104 +
105 + echo '<tr>';
106 + echo '<td class="cache-label">' . $cache_label_transl . '</td>';
107 + echo '<td class="cache-count">' . number_format_i18n( $cache_count ) . '</td>';
108 + echo '<td class="cache-size">' . number_format_i18n( $cache_size, $decimals ) . '</td>';
109 +
110 + if ( $cache_key !== $all_keys_prefix ) echo '<td class="cache-expiration">' . $human_cache_exp . '</td>';
111 +
112 + echo '</tr>' . "\n";
113 + }
114 +
115 + if ( wp_using_ext_object_cache() ) {
116 +
117 + echo '<tr><td colspan="' . $table_cols . '">';
118 + echo '<p class="status-msg">';
119 + echo sprintf( __( '<a href="%1$s">Using an external object cache</a> for WordPress transients is <code>%2$s</code>.', 'wpsso' ),
120 + __( 'https://developer.wordpress.org/reference/functions/wp_using_ext_object_cache/', 'wpsso' ),
121 + wp_using_ext_object_cache() ? 'true' : 'false' ) . ' ';
122 + echo '</p><p class="status-msg">';
123 + echo __( 'All database transient counts should be 0.', 'wpsso' ) . ' ';
124 + echo '</p>' . "\n";
125 + echo '</td></tr>';
126 + }
127 +
128 + if ( $cache_files = $this->p->cache->get_cache_files_size_mb() ) {
129 +
130 + echo '<tr><td colspan="' . $table_cols . '"><h4>';
131 + echo __( 'Cache Folder', 'wpsso' );
132 + echo '</h4></td></tr>';
133 +
134 + echo '<tr>';
135 + echo '<th class="cache-label"></th>';
136 + echo '<th class="cache-count">' . __( 'Count', 'wpsso' ) . '</th>';
137 + echo '<th class="cache-size">' . __( 'MB', 'wpsso' ) . '</th>';
138 + echo '</tr>';
139 +
140 + $all_count = 0;
141 + $all_size = 0;
142 +
143 + foreach ( $cache_files as $ext => $info ) {
144 +
145 + $all_count += $info[ 'count' ];
146 + $all_size += $info[ 'size' ];
147 +
148 + echo '<tr>';
149 + echo '<td class="cache-label">' . sprintf( __( 'Cached %s Files', 'wpsso' ), $ext ) . '</td>';
150 + echo '<td class="cache-count">' . number_format_i18n( $info[ 'count' ] ) . '</td>';
151 + echo '<td class="cache-size">' . number_format_i18n( $info[ 'size' ], $decimals ) . '</td>';
152 + echo '</tr>';
153 + }
154 +
155 + echo '<tr>';
156 + echo '<td class="cache-label">' . __( 'All Cached Files', 'wpsso' ) . '</td>';
157 + echo '<td class="cache-count">' . number_format_i18n( $all_count ) . '</td>';
158 + echo '<td class="cache-size">' . number_format_i18n( $all_size, $decimals ) . '</td>';
159 + echo '</tr>';
160 + }
161 +
162 + echo '</table>';
163 + }
164 +
165 + /*
166 + * WPSSO Help and Support.
167 + */
168 + public function show_metabox_help_support( $obj, $mb ) {
169 +
170 + if ( WpssoUtilMetabox::show_is_hidden_content( $mb ) ) return;
171 +
172 + $pkg_info = $this->p->util->get_pkg_info(); // Uses a local cache.
173 +
174 + echo '<table class="wpsso-dashboard-widget">';
175 + echo '<tr><td>';
176 +
177 + foreach ( $this->p->cf[ 'plugin' ] as $ext => $info ) {
178 +
179 + if ( empty( $info[ 'version' ] ) ) { // Exclude add-ons that are not active.
180 +
181 + continue;
182 + }
183 +
184 + $action_links = array();
185 +
186 + if ( ! empty( $info[ 'url' ][ 'faqs' ] ) ) {
187 +
188 + $action_links[] = sprintf( __( '<a href="%s">Frequently Asked Questions</a>', 'wpsso' ), $info[ 'url' ][ 'faqs' ] );
189 + }
190 +
191 + if ( ! empty( $info[ 'url' ][ 'notes' ] ) ) {
192 +
193 + $action_links[] = sprintf( __( '<a href="%s">Notes and Documentation</a>', 'wpsso' ), $info[ 'url' ][ 'notes' ] );
194 + }
195 +
196 + if ( ! empty( $info[ 'url' ][ 'support' ] ) && $pkg_info[ $ext ][ 'pp' ] ) {
197 +
198 + $action_links[] = sprintf( __( '<a href="%s">Priority Support Ticket</a>', 'wpsso' ), $info[ 'url' ][ 'support' ] ) .
199 + ' (' . __( 'Premium edition', 'wpsso' ) . ')';
200 +
201 + } elseif ( ! empty( $info[ 'url' ][ 'forum' ] ) ) {
202 +
203 + $action_links[] = sprintf( __( '<a href="%s">Community Support Forum</a>', 'wpsso' ), $info[ 'url' ][ 'forum' ] );
204 + }
205 +
206 + if ( ! empty( $action_links ) ) {
207 +
208 + echo '<h4>' . $info[ 'name' ] . '</h4>' . "\n";
209 +
210 + echo SucomUtil::array_to_list_html( $action_links );
211 + }
212 + }
213 +
214 + echo '</td></tr>';
215 + echo '</table>';
216 + }
217 +
218 + /*
219 + * WPSSO Version Information.
220 + */
221 + public function show_metabox_version_info( $obj, $mb ) {
222 +
223 + if ( WpssoUtilMetabox::show_is_hidden_content( $mb ) ) return;
224 +
225 + $table_cols = 2;
226 + $label_width = '30%';
227 +
228 + echo '<table class="wpsso-dashboard-widget">';
229 +
230 + /*
231 + * Required for chrome to display a fixed table layout.
232 + */
233 + echo '<colgroup>';
234 + echo '<col style="width:' . $label_width . ';"/>';
235 + echo '<col/>';
236 + echo '</colgroup>';
237 +
238 + foreach ( $this->p->cf[ 'plugin' ] as $ext => $info ) {
239 +
240 + if ( empty( $info[ 'version' ] ) ) { // Filter out add-ons that are not installed.
241 +
242 + continue;
243 + }
244 +
245 + $plugin_version = isset( $info[ 'version' ] ) ? $info[ 'version' ] : ''; // Static value from config.
246 + $stable_version = __( 'Not Available', 'wpsso' ); // Default value.
247 + $latest_version = __( 'Not Available', 'wpsso' ); // Default value.
248 + $latest_notice = '';
249 + $changelog_url = isset( $info[ 'url' ][ 'changelog' ] ) ? $info[ 'url' ][ 'changelog' ] : '';
250 + $readme_info = $this->p->admin->get_readme_info( $ext, $read_cache = true );
251 + $td_addl_class = '';
252 +
253 + if ( ! empty( $readme_info[ 'stable_tag' ] ) ) {
254 +
255 + $stable_version = $readme_info[ 'stable_tag' ];
256 + $is_newer_avail = version_compare( $plugin_version, $stable_version, '<' );
257 +
258 + if ( is_array( $readme_info[ 'upgrade_notice' ] ) ) {
259 +
260 + /*
261 + * Hooked by the update manager to apply the version filter.
262 + *
263 + * See WpssoUmFilters->filter_readme_upgrade_notices().
264 + */
265 + $upgrade_notice = apply_filters( 'wpsso_readme_upgrade_notices', $readme_info[ 'upgrade_notice' ], $ext );
266 +
267 + if ( ! empty( $upgrade_notice ) ) {
268 +
269 + reset( $upgrade_notice );
270 +
271 + $latest_version = key( $upgrade_notice );
272 +
273 + $latest_notice = $upgrade_notice[ $latest_version ];
274 + }
275 + }
276 +
277 + /*
278 + * Hooked by the update manager to check installed version against the latest version, in
279 + * case a non-stable filter is selected for that plugin / add-on.
280 + *
281 + * See WpssoUmFilters->filter_newer_version_available().
282 + */
283 + if ( apply_filters( 'wpsso_newer_version_available', $is_newer_avail, $ext, $plugin_version, $stable_version, $latest_version ) ) {
284 +
285 + $td_addl_class = ' newer-version-available';
286 +
287 + } elseif ( preg_match( '/[a-z]/', $plugin_version ) ) { // Current but not stable (alpha chars in version).
288 +
289 + $td_addl_class = ' current-version-not-stable';
290 +
291 + } else $td_addl_class = ' current-version';
292 + }
293 +
294 + echo '<tr><td colspan="' . $table_cols . '"><h4>' . $info[ 'name' ] . '</h4></td></tr>';
295 +
296 + /*
297 + * Show the stable version if the latest version is different (ie. latest is a non-stable version).
298 + */
299 + if ( $latest_version !== $stable_version ) {
300 +
301 + echo '<tr><th class="version-label">' . _x( 'Stable Version', 'version label', 'wpsso' ) . '</th>';
302 + echo '<td class="version-number">' . $stable_version . '</td></tr>';
303 + }
304 +
305 + echo '<tr><th class="version-label">' . _x( 'Installed Version', 'version label', 'wpsso' ) . '</th>';
306 + echo '<td class="version-number' . $td_addl_class . '">' . $plugin_version . '</td></tr>';
307 +
308 + echo '<tr><th class="version-label">' . _x( 'Latest Version', 'version label', 'wpsso' ) . '</th>';
309 + echo '<td class="version-number">' . $latest_version . '</td></tr>';
310 +
311 + /*
312 + * Show the latest version notice message if there's a newer / non-matching version.
313 + */
314 + if ( $plugin_version !== $stable_version || $plugin_version !== $latest_version ) {
315 +
316 + echo '<tr><th class="version-label">' . _x( 'Update Notice', 'version label', 'wpsso' ) . '</th>';
317 + echo '<td class="latest-notice">';
318 +
319 + if ( ! empty( $latest_notice ) ) {
320 +
321 + echo $latest_notice . ' ';
322 + }
323 +
324 + echo '<a href="' . $changelog_url . '">' . sprintf( __( 'View %s changelog...', 'wpsso'), $info[ 'short' ] ) . '</a>';
325 + echo '</td></tr>';
326 + }
327 + }
328 +
329 + echo '</table>';
330 + }
331 +
332 + /*
333 + * See WpssoSubmenuDashboard->show_metabox_cache_status().
334 + */
335 + private static function sort_by_label_key( $a, $b ) {
336 +
337 + if ( isset( $a[ 'label' ] ) && isset( $b[ 'label' ] ) ) {
338 +
339 + return strcmp( $a[ 'label' ], $b[ 'label' ] );
340 + }
341 +
342 + return 0; // No change.
343 + }
344 + }
345 +}