PluginProbe
Stream – Activity Log & Audit Trail / 4.0.2
Stream – Activity Log & Audit Trail v4.0.2
4.4.0 4.3.0 4.2.2 4.2.1 trunk 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.1 3.1.1 3.10.0 3.2.0 3.2.1 3.2.2 3.2.3 All 50 releases
← All changes | classes/class-admin.php +292 -138 3.0.64.0.2 View file →
@@ -1,16 +1,26 @@
1 1 <?php
2 +/**
3 + * Centralized manager for WordPress backend functionality.
4 + *
5 + * @package WP_Stream
6 + */
7 +
2 8 namespace WP_Stream;
3 9
4 10 use DateTime;
5 11 use DateTimeZone;
6 12 use DateInterval;
7 -use \WP_CLI;
8 -use \WP_Roles;
13 +use WP_CLI;
14 +use WP_Roles;
9 15
16 +/**
17 + * Class - Admin
18 + */
10 19 class Admin {
20 +
11 21 /**
12 - * Hold Plugin class
22 + * Holds Instance of plugin object
13 23 *
14 24 * @var Plugin
15 25 */
16 26 public $plugin;
@@ -115,9 +125,9 @@
115 125
116 126 /**
117 127 * Class constructor.
118 128 *
119 - * @param Plugin $plugin The main Plugin class.
129 + * @param Plugin $plugin Instance of plugin object.
120 130 */
121 131 public function __construct( $plugin ) {
122 132 $this->plugin = $plugin;
123 133
@@ -124,9 +134,9 @@
124 134 add_action( 'init', array( $this, 'init' ) );
125 135
126 136 // Ensure function used in various methods is pre-loaded.
127 137 if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
128 - require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
138 + require_once ABSPATH . '/wp-admin/includes/plugin.php';
129 139 }
130 140
131 141 // User and role caps.
132 142 add_filter( 'user_has_cap', array( $this, 'filter_user_caps' ), 10, 4 );
@@ -131,9 +141,9 @@
131 141 // User and role caps.
132 142 add_filter( 'user_has_cap', array( $this, 'filter_user_caps' ), 10, 4 );
133 143 add_filter( 'role_has_cap', array( $this, 'filter_role_caps' ), 10, 3 );
134 144
135 - if ( is_multisite() && is_plugin_active_for_network( $this->plugin->locations['plugin'] ) && ! is_network_admin() ) {
145 + if ( is_multisite() && $plugin->is_network_activated() && ! is_network_admin() ) {
136 146 $options = (array) get_site_option( 'wp_stream_network', array() );
137 147 $option = isset( $options['general_site_access'] ) ? absint( $options['general_site_access'] ) : 1;
138 148
139 149 $this->disable_access = ( $option ) ? false : true;
@@ -151,27 +161,55 @@
151 161 // Add admin body class.
152 162 add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
153 163
154 164 // Plugin action links.
155 - add_filter( 'plugin_action_links', array( $this, 'plugin_action_links' ), 10, 2 );
165 + add_filter(
166 + 'plugin_action_links',
167 + array(
168 + $this,
169 + 'plugin_action_links',
170 + ),
171 + 10,
172 + 2
173 + );
156 174
157 175 // Load admin scripts and styles.
158 - add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
176 + add_action(
177 + 'admin_enqueue_scripts',
178 + array(
179 + $this,
180 + 'admin_enqueue_scripts',
181 + )
182 + );
159 183 add_action( 'admin_enqueue_scripts', array( $this, 'admin_menu_css' ) );
160 184
161 185 // Reset Streams database.
162 - add_action( 'wp_ajax_wp_stream_reset', array( $this, 'wp_ajax_reset' ) );
186 + add_action(
187 + 'wp_ajax_wp_stream_reset',
188 + array(
189 + $this,
190 + 'wp_ajax_reset',
191 + )
192 + );
163 193
164 - // Uninstall Streams and Deactivate plugin.
165 - $uninstall = new Uninstall( $this->plugin );
166 - add_action( 'wp_ajax_wp_stream_uninstall', array( $uninstall, 'uninstall' ) );
167 -
168 194 // Auto purge setup.
169 195 add_action( 'wp_loaded', array( $this, 'purge_schedule_setup' ) );
170 - add_action( 'wp_stream_auto_purge', array( $this, 'purge_scheduled_action' ) );
196 + add_action(
197 + 'wp_stream_auto_purge',
198 + array(
199 + $this,
200 + 'purge_scheduled_action',
201 + )
202 + );
171 203
172 204 // Ajax users list.
173 - add_action( 'wp_ajax_wp_stream_filters', array( $this, 'ajax_filters' ) );
205 + add_action(
206 + 'wp_ajax_wp_stream_filters',
207 + array(
208 + $this,
209 + 'ajax_filters',
210 + )
211 + );
174 212 }
175 213
176 214 /**
177 215 * Load admin classes
@@ -181,8 +219,14 @@
181 219 public function init() {
182 220 $this->network = new Network( $this->plugin );
183 221 $this->live_update = new Live_Update( $this->plugin );
184 222 $this->export = new Export( $this->plugin );
223 +
224 + // Check if the host has configured the `REMOTE_ADDR` correctly.
225 + $client_ip = $this->plugin->get_client_ip_address();
226 + if ( empty( $client_ip ) && $this->is_stream_screen() ) {
227 + $this->notice( __( 'Stream plugin can\'t determine a reliable client IP address! Please update the hosting environment to set the $_SERVER[\'REMOTE_ADDR\'] variable or use the wp_stream_client_ip_address filter to specify the verified client IP address!', 'stream' ) );
228 + }
185 229 }
186 230
187 231 /**
188 232 * Output specific updates passed as URL parameters.
@@ -208,9 +252,9 @@
208 252 * @param bool $is_error If the message is error_level (true) or warning (false).
209 253 */
210 254 public function notice( $message, $is_error = true ) {
211 255 if ( defined( 'WP_CLI' ) && WP_CLI ) {
212 - $message = strip_tags( $message );
256 + $message = wp_strip_all_tags( $message );
213 257
214 258 if ( $is_error ) {
215 259 WP_CLI::warning( $message );
216 260 } else {
@@ -299,8 +343,16 @@
299 343 $main_menu_position
300 344 );
301 345
302 346 /**
347 + * Fires before submenu items are added to the Stream menu
348 + * allowing plugins to add menu items before Settings
349 + *
350 + * @return void
351 + */
352 + do_action( 'wp_stream_admin_menu' );
353 +
354 + /**
303 355 * Filter the Settings admin page title
304 356 *
305 357 * @return string
306 358 */
@@ -323,9 +375,15 @@
323 375 */
324 376 do_action( 'wp_stream_admin_menu_screens' );
325 377
326 378 // Register the list table early, so it associates the column headers with 'Screen settings'.
327 - add_action( 'load-' . $this->screen_id['main'], array( $this, 'register_list_table' ) );
379 + add_action(
380 + 'load-' . $this->screen_id['main'],
381 + array(
382 + $this,
383 + 'register_list_table',
384 + )
385 + );
328 386 }
329 387 }
330 388
331 389 /**
@@ -332,15 +390,15 @@
332 390 * Enqueue scripts/styles for admin screen
333 391 *
334 392 * @action admin_enqueue_scripts
335 393 *
336 - * @param string $hook
394 + * @param string $hook Current hook.
337 395 *
338 396 * @return void
339 397 */
340 398 public function admin_enqueue_scripts( $hook ) {
341 - wp_register_script( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/js/select2.js', array( 'jquery' ), '3.5.2', true );
342 - wp_register_style( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/css/select2.css', array(), '3.5.2' );
399 + wp_register_script( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/js/select2.full.min.js', array( 'jquery' ), '4.0.13', true );
400 + wp_register_style( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/css/select2.min.css', array(), '4.0.13' );
343 401 wp_register_script( 'wp-stream-timeago', $this->plugin->locations['url'] . 'ui/lib/timeago/jquery.timeago.js', array(), '1.4.1', true );
344 402
345 403 $locale = strtolower( substr( get_locale(), 0, 2 ) );
346 404 $file_tmpl = 'ui/lib/timeago/locales/jquery.timeago.%s.js';
@@ -345,14 +403,27 @@
345 403 $locale = strtolower( substr( get_locale(), 0, 2 ) );
346 404 $file_tmpl = 'ui/lib/timeago/locales/jquery.timeago.%s.js';
347 405
348 406 if ( file_exists( $this->plugin->locations['dir'] . sprintf( $file_tmpl, $locale ) ) ) {
349 - wp_register_script( 'wp-stream-timeago-locale', $this->plugin->locations['url'] . sprintf( $file_tmpl, $locale ), array( 'wp-stream-timeago' ), '1' );
407 + wp_register_script(
408 + 'wp-stream-timeago-locale',
409 + $this->plugin->locations['url'] . sprintf( $file_tmpl, $locale ),
410 + array( 'wp-stream-timeago' ),
411 + '1',
412 + false
413 + );
350 414 } else {
351 - wp_register_script( 'wp-stream-timeago-locale', $this->plugin->locations['url'] . sprintf( $file_tmpl, 'en' ), array( 'wp-stream-timeago' ), '1' );
415 + wp_register_script(
416 + 'wp-stream-timeago-locale',
417 + $this->plugin->locations['url'] . sprintf( $file_tmpl, 'en' ),
418 + array( 'wp-stream-timeago' ),
419 + '1',
420 + false
421 + );
352 422 }
353 423
354 - wp_enqueue_style( 'wp-stream-admin', $this->plugin->locations['url'] . 'ui/css/admin.css', array(), $this->plugin->get_version() );
424 + $min = wp_stream_min_suffix();
425 + wp_enqueue_style( 'wp-stream-admin', $this->plugin->locations['url'] . 'ui/css/admin.' . $min . 'css', array(), $this->plugin->get_version() );
355 426
356 427 $script_screens = array( 'plugins.php' );
357 428
358 429 if ( in_array( $hook, $this->screen_id, true ) || in_array( $hook, $script_screens, true ) ) {
@@ -361,10 +432,38 @@
361 432
362 433 wp_enqueue_script( 'wp-stream-timeago' );
363 434 wp_enqueue_script( 'wp-stream-timeago-locale' );
364 435
365 - wp_enqueue_script( 'wp-stream-admin', $this->plugin->locations['url'] . 'ui/js/admin.js', array( 'jquery', 'wp-stream-select2' ), $this->plugin->get_version() );
366 - wp_enqueue_script( 'wp-stream-live-updates', $this->plugin->locations['url'] . 'ui/js/live-updates.js', array( 'jquery', 'heartbeat' ), $this->plugin->get_version() );
436 + wp_enqueue_script(
437 + 'wp-stream-admin',
438 + $this->plugin->locations['url'] . 'ui/js/admin.' . $min . 'js',
439 + array(
440 + 'jquery',
441 + 'wp-stream-select2',
442 + ),
443 + $this->plugin->get_version(),
444 + false
445 + );
446 + wp_enqueue_script(
447 + 'wp-stream-admin-exclude',
448 + $this->plugin->locations['url'] . 'ui/js/exclude.' . $min . 'js',
449 + array(
450 + 'jquery',
451 + 'wp-stream-select2',
452 + ),
453 + $this->plugin->get_version(),
454 + false
455 + );
456 + wp_enqueue_script(
457 + 'wp-stream-live-updates',
458 + $this->plugin->locations['url'] . 'ui/js/live-updates.' . $min . 'js',
459 + array(
460 + 'jquery',
461 + 'heartbeat',
462 + ),
463 + $this->plugin->get_version(),
464 + false
465 + );
367 466
368 467 wp_localize_script(
369 468 'wp-stream-admin',
370 469 'wp_stream',
@@ -369,11 +468,10 @@
369 468 'wp-stream-admin',
370 469 'wp_stream',
371 470 array(
372 471 'i18n' => array(
373 - 'confirm_purge' => esc_html__( 'Are you sure you want to delete all Stream activity records from the database? This cannot be undone.', 'stream' ),
374 - 'confirm_defaults' => esc_html__( 'Are you sure you want to reset all site settings to default? This cannot be undone.', 'stream' ),
375 - 'confirm_uninstall' => esc_html__( 'Are you sure you want to uninstall and deactivate Stream? This will delete all Stream tables from the database and cannot be undone.', 'stream' ),
472 + 'confirm_purge' => esc_html__( 'Are you sure you want to delete all Stream activity records from the database? This cannot be undone.', 'stream' ),
473 + 'confirm_defaults' => esc_html__( 'Are you sure you want to reset all site settings to default? This cannot be undone.', 'stream' ),
376 474 ),
377 475 'locale' => esc_js( $locale ),
378 476 'gmt_offset' => get_option( 'gmt_offset' ),
379 477 )
@@ -378,17 +476,21 @@
378 476 'gmt_offset' => get_option( 'gmt_offset' ),
379 477 )
380 478 );
381 479
480 + $order_types = array( 'asc', 'desc' );
481 +
382 482 wp_localize_script(
383 483 'wp-stream-live-updates',
384 484 'wp_stream_live_updates',
385 485 array(
386 486 'current_screen' => $hook,
387 - 'current_page' => isset( $_GET['paged'] ) ? esc_js( $_GET['paged'] ) : '1', // input var okay
388 - 'current_order' => isset( $_GET['order'] ) ? esc_js( $_GET['order'] ) : 'desc', // input var okay
389 - 'current_query' => wp_stream_json_encode( $_GET ), // input var okay
390 - 'current_query_count' => count( $_GET ), // input var okay
487 + 'current_page' => isset( $_GET['paged'] ) ? absint( wp_unslash( $_GET['paged'] ) ) : '1', // phpcs:ignore WordPress.Security.NonceVerification.Recommended
488 + 'current_order' => isset( $_GET['order'] ) && in_array( strtolower( $_GET['order'] ), $order_types, true ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
489 + ? esc_js( $_GET['order'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
490 + : 'desc',
491 + 'current_query' => wp_json_encode( $_GET ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
492 + 'current_query_count' => count( $_GET ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
391 493 )
392 494 );
393 495 }
394 496
@@ -405,15 +507,23 @@
405 507 * @return int
406 508 */
407 509 $bulk_actions_threshold = apply_filters( 'wp_stream_bulk_actions_threshold', 100 );
408 510
409 - wp_enqueue_script( 'wp-stream-global', $this->plugin->locations['url'] . 'ui/js/global.js', array( 'jquery' ), $this->plugin->get_version() );
511 + wp_enqueue_script(
512 + 'wp-stream-global',
513 + $this->plugin->locations['url'] . 'ui/js/global.' . $min . 'js',
514 + array( 'jquery' ),
515 + $this->plugin->get_version(),
516 + false
517 + );
518 +
410 519 wp_localize_script(
411 520 'wp-stream-global',
412 521 'wp_stream_global',
413 522 array(
414 - 'bulk_actions' => array(
415 - 'i18n' => array(
523 + 'bulk_actions' => array(
524 + 'i18n' => array(
525 + /* translators: %s: a number of items (e.g. "1,742") */
416 526 'confirm_action' => sprintf( esc_html__( 'Are you sure you want to perform bulk actions on over %s items? This process could take a while to complete.', 'stream' ), number_format( absint( $bulk_actions_threshold ) ) ),
417 527 ),
418 528 'threshold' => absint( $bulk_actions_threshold ),
419 529 ),
@@ -427,12 +537,23 @@
427 537 *
428 538 * @return bool
429 539 */
430 540 public function is_stream_screen() {
431 - if ( is_admin() && false !== strpos( wp_stream_filter_input( INPUT_GET, 'page' ), $this->records_page_slug ) ) {
541 + if ( ! is_admin() ) {
542 + return false;
543 + }
544 +
545 + $page = wp_stream_filter_input( INPUT_GET, 'page' );
546 + if ( is_string( $page ) && false !== strpos( $page, $this->records_page_slug ) ) {
432 547 return true;
433 548 }
434 549
550 + if ( is_admin() && function_exists( 'get_current_screen' ) ) {
551 + $screen = get_current_screen();
552 +
553 + return ( Alerts::POST_TYPE === $screen->post_type );
554 + }
555 +
435 556 return false;
436 557 }
437 558
438 559 /**
@@ -437,9 +558,9 @@
437 558
438 559 /**
439 560 * Add a specific body class to all Stream admin screens
440 561 *
441 - * @param string $classes CSS classes to output to body
562 + * @param string $classes CSS classes to output to body.
442 563 *
443 564 * @filter admin_body_class
444 565 *
445 566 * @return string
@@ -449,10 +570,10 @@
449 570
450 571 if ( $this->is_stream_screen() ) {
451 572 $stream_classes[] = $this->admin_body_class;
452 573
453 - if ( isset( $_GET['page'] ) ) {
454 - $stream_classes[] = sanitize_key( $_GET['page'] ); // input var okay
574 + if ( isset( $_GET['page'] ) ) { // // phpcs:ignore WordPress.Security.NonceVerification.Recommended
575 + $stream_classes[] = sanitize_key( $_GET['page'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
455 576 }
456 577 }
457 578
458 579 /**
@@ -473,16 +594,17 @@
473 594 *
474 595 * @action admin_enqueue_scripts
475 596 */
476 597 public function admin_menu_css() {
477 - wp_register_style( 'wp-stream-datepicker', $this->plugin->locations['url'] . 'ui/css/datepicker.css', array(), $this->plugin->get_version() );
598 + $min = wp_stream_min_suffix();
599 + wp_register_style( 'wp-stream-datepicker', $this->plugin->locations['url'] . 'ui/css/datepicker.' . $min . 'css', array(), $this->plugin->get_version() );
478 600 wp_register_style( 'wp-stream-icons', $this->plugin->locations['url'] . 'ui/stream-icons/style.css', array(), $this->plugin->get_version() );
479 601
480 - // Make sure we're working off a clean version
602 + // Make sure we're working off a clean version.
481 603 if ( ! file_exists( ABSPATH . WPINC . '/version.php' ) ) {
482 604 return;
483 605 }
484 - include( ABSPATH . WPINC . '/version.php' );
606 + include ABSPATH . WPINC . '/version.php';
485 607
486 608 if ( ! isset( $wp_version ) ) {
487 609 return;
488 610 }
@@ -541,10 +663,15 @@
541 663
542 664 \wp_add_inline_style( 'wp-admin', $css );
543 665 }
544 666
667 + /**
668 + * Handle the reset AJAX request to reset logs.
669 + *
670 + * @return bool
671 + */
545 672 public function wp_ajax_reset() {
546 - check_ajax_referer( 'stream_nonce', 'wp_stream_nonce' );
673 + check_ajax_referer( 'stream_nonce_reset', 'wp_stream_nonce_reset' );
547 674
548 675 if ( ! current_user_can( $this->settings_cap ) ) {
549 676 wp_die(
550 677 esc_html__( "You don't have sufficient privileges to do this action.", 'stream' )
@@ -556,9 +683,9 @@
556 683 if ( defined( 'WP_STREAM_TESTS' ) && WP_STREAM_TESTS ) {
557 684 return true;
558 685 }
559 686
560 - wp_redirect(
687 + wp_safe_redirect(
561 688 add_query_arg(
562 689 array(
563 690 'page' => is_network_admin() ? $this->network->network_settings_page_slug : $this->settings_page_slug,
564 691 'message' => 'data_erased',
@@ -569,14 +696,19 @@
569 696
570 697 exit;
571 698 }
572 699
700 + /**
701 + * Clears stream records from the database.
702 + *
703 + * @return void
704 + */
573 705 private function erase_stream_records() {
574 706 global $wpdb;
575 707
576 708 $where = '';
577 709
578 - if ( is_multisite() && ! is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
710 + if ( is_multisite() && ! $this->plugin->is_network_activated() ) {
579 711 $where .= $wpdb->prepare( ' AND `blog_id` = %d', get_current_blog_id() );
580 712 }
581 713
582 714 $wpdb->query(
@@ -587,8 +719,13 @@
587 719 WHERE 1=1 {$where};" // @codingStandardsIgnoreLine $where already prepared
588 720 );
589 721 }
590 722
723 + /**
724 + * Schedules a purge of records.
725 + *
726 + * @return void
727 + */
591 728 public function purge_schedule_setup() {
592 729 if ( ! wp_next_scheduled( 'wp_stream_auto_purge' ) ) {
593 730 wp_schedule_event( time(), 'twicedaily', 'wp_stream_auto_purge' );
594 731 }
@@ -593,41 +730,48 @@
593 730 wp_schedule_event( time(), 'twicedaily', 'wp_stream_auto_purge' );
594 731 }
595 732 }
596 733
734 + /**
735 + * Executes a scheduled purge
736 + *
737 + * @return void
738 + */
597 739 public function purge_scheduled_action() {
598 740 global $wpdb;
599 741
600 - // Don't purge when in Network Admin unless Stream is network activated
742 + // Don't purge when in Network Admin unless Stream is network activated.
601 743 if (
602 744 is_multisite()
603 745 &&
604 746 is_network_admin()
605 747 &&
606 - ! is_plugin_active_for_network( $this->plugin->locations['plugin'] )
748 + ! $this->plugin->is_network_activated()
607 749 ) {
608 750 return;
609 751 }
610 752
611 - if ( is_multisite() && is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
612 - $options = (array) get_site_option( 'wp_stream_network', array() );
753 + $defaults = $this->plugin->settings->get_defaults();
754 + if ( is_multisite() && $this->plugin->is_network_activated() ) {
755 + $options = (array) get_site_option( 'wp_stream_network', $defaults );
613 756 } else {
614 - $options = (array) get_option( 'wp_stream', array() );
757 + $options = (array) get_option( 'wp_stream', $defaults );
615 758 }
616 759
617 - if ( isset( $options['general_keep_records_indefinitely'] ) || ! isset( $options['general_records_ttl'] ) ) {
760 + if ( ! empty( $options['general_keep_records_indefinitely'] ) || ! isset( $options['general_records_ttl'] ) ) {
618 761 return;
619 762 }
620 763
621 - $days = $options['general_records_ttl'];
622 - $date = new DateTime( 'now', $timezone = new DateTimeZone( 'UTC' ) );
764 + $days = $options['general_records_ttl'];
765 + $timezone = new DateTimeZone( 'UTC' );
766 + $date = new DateTime( 'now', $timezone );
623 767
624 768 $date->sub( DateInterval::createFromDateString( "$days days" ) );
625 769
626 770 $where = $wpdb->prepare( ' AND `stream`.`created` < %s', $date->format( 'Y-m-d H:i:s' ) );
627 771
628 - // Multisite but NOT network activated, only purge the current blog
629 - if ( is_multisite() && ! is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
772 + // Multisite but NOT network activated, only purge the current blog.
773 + if ( is_multisite() && ! $this->plugin->is_network_activated() ) {
630 774 $where .= $wpdb->prepare( ' AND `blog_id` = %d', get_current_blog_id() );
631 775 }
632 776
633 777 $wpdb->query(
@@ -639,13 +783,15 @@
639 783 );
640 784 }
641 785
642 786 /**
643 - * @param array $links
644 - * @param string $file
787 + * Returns the admin action links.
645 788 *
646 789 * @filter plugin_action_links
647 790 *
791 + * @param array $links Action links.
792 + * @param string $file Plugin file.
793 + *
648 794 * @return array
649 795 */
650 796 public function plugin_action_links( $links, $file ) {
651 797 if ( plugin_basename( $this->plugin->locations['dir'] . 'stream.php' ) !== $file ) {
@@ -651,31 +797,31 @@
651 797 if ( plugin_basename( $this->plugin->locations['dir'] . 'stream.php' ) !== $file ) {
652 798 return $links;
653 799 }
654 800
655 - // Also don't show links in Network Admin if Stream isn't network enabled
656 - if ( is_network_admin() && is_multisite() && ! is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
801 + // Also don't show links in Network Admin if Stream isn't network enabled.
802 + if ( is_network_admin() && is_multisite() && ! $this->plugin->is_network_activated() ) {
657 803 return $links;
658 804 }
659 805
660 806 if ( is_network_admin() ) {
661 - $admin_page_url = add_query_arg( array( 'page' => $this->network->network_settings_page_slug ), network_admin_url( $this->admin_parent_page ) );
807 + $admin_page_url = add_query_arg(
808 + array(
809 + 'page' => $this->network->network_settings_page_slug,
810 + ),
811 + network_admin_url( $this->admin_parent_page )
812 + );
662 813 } else {
663 - $admin_page_url = add_query_arg( array( 'page' => $this->settings_page_slug ), admin_url( $this->admin_parent_page ) );
814 + $admin_page_url = add_query_arg(
815 + array(
816 + 'page' => $this->settings_page_slug,
817 + ),
818 + admin_url( $this->admin_parent_page )
819 + );
664 820 }
665 821
666 822 $links[] = sprintf( '<a href="%s">%s</a>', esc_url( $admin_page_url ), esc_html__( 'Settings', 'default' ) );
667 823
668 - $url = add_query_arg(
669 - array(
670 - 'action' => 'wp_stream_uninstall',
671 - 'wp_stream_nonce' => wp_create_nonce( 'stream_nonce' ),
672 - ),
673 - admin_url( 'admin-ajax.php' )
674 - );
675 -
676 - $links[] = sprintf( '<span id="wp_stream_uninstall" class="delete"><a href="%s">%s</a></span>', esc_url( $url ), esc_html__( 'Uninstall', 'stream' ) );
677 -
678 824 return $links;
679 825 }
680 826
681 827 /**
@@ -684,12 +830,12 @@
684 830 public function render_list_table() {
685 831 $this->list_table->prepare_items();
686 832 ?>
687 833 <div class="wrap">
688 - <h1><?php echo esc_html( get_admin_page_title() ) ?></h1>
689 - <?php $this->list_table->display() ?>
834 + <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
835 + <?php $this->list_table->display(); ?>
690 836 </div>
691 - <?php
837 + <?php
692 838 }
693 839
694 840 /**
695 841 * Render settings page
@@ -701,28 +847,28 @@
701 847 $page_description = apply_filters( 'wp_stream_settings_form_description', '' );
702 848
703 849 $sections = $this->plugin->settings->get_fields();
704 850 $active_tab = wp_stream_filter_input( INPUT_GET, 'tab' );
705 -
706 - wp_enqueue_script( 'wp-stream-settings', $this->plugin->locations['url'] . 'ui/js/settings.js', array( 'jquery' ), $this->plugin->get_version(), true );
851 + $min = wp_stream_min_suffix();
852 + wp_enqueue_script( 'wp-stream-settings', $this->plugin->locations['url'] . 'ui/js/settings.' . $min . 'js', array( 'jquery' ), $this->plugin->get_version(), true );
707 853 ?>
708 854 <div class="wrap">
709 - <h1><?php echo esc_html( get_admin_page_title() ) ?></h1>
855 + <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
710 856
711 857 <?php if ( ! empty( $page_description ) ) : ?>
712 - <p><?php echo esc_html( $page_description ) ?></p>
858 + <p><?php echo esc_html( $page_description ); ?></p>
713 859 <?php endif; ?>
714 860
715 - <?php settings_errors() ?>
861 + <?php settings_errors(); ?>
716 862
717 863 <?php if ( count( $sections ) > 1 ) : ?>
718 864 <h2 class="nav-tab-wrapper">
719 - <?php $i = 0 ?>
865 + <?php $i = 0; ?>
720 866 <?php foreach ( $sections as $section => $data ) : ?>
721 - <?php $i ++ ?>
722 - <?php $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section ) ?>
723 - <a href="<?php echo esc_url( add_query_arg( 'tab', $section ) ) ?>" class="nav-tab<?php if ( $is_active ) { echo esc_attr( ' nav-tab-active' ); } ?>">
724 - <?php echo esc_html( $data['title'] ) ?>
867 + <?php ++$i; ?>
868 + <?php $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section ); ?>
869 + <a href="<?php echo esc_url( add_query_arg( 'tab', $section ) ); ?>" class="nav-tab <?php echo $is_active ? esc_attr( ' nav-tab-active' ) : ''; ?>">
870 + <?php echo esc_html( $data['title'] ); ?>
725 871 </a>
726 872 <?php endforeach; ?>
727 873 </h2>
728 874 <?php endif; ?>
@@ -727,29 +873,29 @@
727 873 </h2>
728 874 <?php endif; ?>
729 875
730 876 <div class="nav-tab-content" id="tab-content-settings">
731 - <form method="post" action="<?php echo esc_attr( $form_action ) ?>" enctype="multipart/form-data">
877 + <form method="post" action="<?php echo esc_attr( $form_action ); ?>" enctype="multipart/form-data">
732 878 <div class="settings-sections">
733 - <?php
734 - $i = 0;
735 - foreach ( $sections as $section => $data ) {
736 - $i++;
879 + <?php
880 + $i = 0;
881 + foreach ( $sections as $section => $data ) {
882 + ++$i;
737 883
738 - $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section );
884 + $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section );
739 885
740 - if ( $is_active ) {
741 - settings_fields( $option_key );
742 - do_settings_sections( $option_key );
743 - }
744 - }
745 - ?>
886 + if ( $is_active ) {
887 + settings_fields( $option_key );
888 + do_settings_sections( $option_key );
889 + }
890 + }
891 + ?>
746 892 </div>
747 - <?php submit_button() ?>
893 + <?php submit_button(); ?>
748 894 </form>
749 895 </div>
750 896 </div>
751 - <?php
897 + <?php
752 898 }
753 899
754 900 /**
755 901 * Instantiate the list table
@@ -754,15 +900,20 @@
754 900 /**
755 901 * Instantiate the list table
756 902 */
757 903 public function register_list_table() {
758 - $this->list_table = new List_Table( $this->plugin, array( 'screen' => $this->screen_id['main'] ) );
904 + $this->list_table = new List_Table(
905 + $this->plugin,
906 + array(
907 + 'screen' => $this->screen_id['main'],
908 + )
909 + );
759 910 }
760 911
761 912 /**
762 913 * Check if a particular role has access
763 914 *
764 - * @param string $role
915 + * @param string $role User role.
765 916 *
766 917 * @return bool
767 918 */
768 919 private function role_can_view( $role ) {
@@ -775,12 +926,12 @@
775 926
776 927 /**
777 928 * Filter user caps to dynamically grant our view cap based on allowed roles
778 929 *
779 - * @param $allcaps
780 - * @param $caps
781 - * @param $args
782 - * @param $user
930 + * @param array $allcaps All capabilities.
931 + * @param array $caps Required caps.
932 + * @param array $args Unused.
933 + * @param WP_User $user User.
783 934 *
784 935 * @filter user_has_cap
785 936 *
786 937 * @return array
@@ -825,11 +976,11 @@
825 976 * Filter role caps to dynamically grant our view cap based on allowed roles
826 977 *
827 978 * @filter role_has_cap
828 979 *
829 - * @param $allcaps
830 - * @param $cap
831 - * @param $role
980 + * @param array $allcaps All capabilities.
981 + * @param string $cap Require cap.
982 + * @param string $role User role.
832 983 *
833 984 * @return array
834 985 */
835 986 public function filter_role_caps( $allcaps, $cap, $role ) {
@@ -842,8 +993,10 @@
842 993 return $allcaps;
843 994 }
844 995
845 996 /**
997 + * Ajax callback for return a user list.
998 + *
846 999 * @action wp_ajax_wp_stream_filters
847 1000 */
848 1001 public function ajax_filters() {
849 1002 if ( ! defined( 'DOING_AJAX' ) || ! current_user_can( $this->plugin->admin->settings_cap ) ) {
@@ -854,9 +1007,13 @@
854 1007
855 1008 switch ( wp_stream_filter_input( INPUT_GET, 'filter' ) ) {
856 1009 case 'user_id':
857 1010 $users = array_merge(
858 - array( 0 => (object) array( 'display_name' => 'WP-CLI' ) ),
1011 + array(
1012 + 0 => (object) array(
1013 + 'display_name' => 'WP-CLI',
1014 + ),
1015 + ),
859 1016 get_users()
860 1017 );
861 1018
862 1019 $search = wp_stream_filter_input( INPUT_GET, 'q' );
@@ -863,9 +1020,9 @@
863 1020 if ( $search ) {
864 1021 // `search` arg for get_users() is not enough
865 1022 $users = array_filter(
866 1023 $users,
867 - function( $user ) use ( $search ) {
1024 + function ( $user ) use ( $search ) {
868 1025 return false !== mb_strpos( mb_strtolower( $user->display_name ), mb_strtolower( $search ) );
869 1026 }
870 1027 );
871 1028 }
@@ -873,9 +1030,9 @@
873 1030 if ( count( $users ) > $this->preload_users_max ) {
874 1031 $users = array_slice( $users, 0, $this->preload_users_max );
875 1032 }
876 1033
877 - // Get gravatar / roles for final result set
1034 + // Get gravatar / roles for final result set.
878 1035 $results = $this->get_users_record_meta( $users );
879 1036
880 1037 break;
881 1038 }
@@ -880,14 +1037,20 @@
880 1037 break;
881 1038 }
882 1039
883 1040 if ( isset( $results ) ) {
884 - echo wp_stream_json_encode( $results ); // xss ok
1041 + echo wp_json_encode( $results );
885 1042 }
886 1043
887 1044 die();
888 1045 }
889 1046
1047 + /**
1048 + * Return relevant user meta data.
1049 + *
1050 + * @param array $authors Author data.
1051 + * @return array
1052 + */
890 1053 public function get_users_record_meta( $authors ) {
891 1054 $authors_records = array();
892 1055
893 1056 foreach ( $authors as $user_id => $args ) {
@@ -893,13 +1056,13 @@
893 1056 foreach ( $authors as $user_id => $args ) {
894 1057 $author = new Author( $args->ID );
895 1058
896 1059 $authors_records[ $user_id ] = array(
897 - 'text' => $author->get_display_name(),
898 - 'id' => $author->id,
899 - 'label' => $author->get_display_name(),
900 - 'icon' => $author->get_avatar_src( 32 ),
901 - 'title' => '',
1060 + 'text' => $author->get_display_name(),
1061 + 'id' => $author->id,
1062 + 'label' => $author->get_display_name(),
1063 + 'icon' => $author->get_avatar_src( 32 ),
1064 + 'title' => '',
902 1065 );
903 1066 }
904 1067
905 1068 return $authors_records;
@@ -907,18 +1070,15 @@
907 1070
908 1071 /**
909 1072 * Get user meta in a way that is also safe for VIP
910 1073 *
911 - * @param int $user_id
912 - * @param string $meta_key
913 - * @param bool $single (optional)
1074 + * @param int $user_id User ID.
1075 + * @param string $meta_key Meta key.
1076 + * @param bool $single Return first found meta value connected to the meta key (optional).
914 1077 *
915 1078 * @return mixed
916 1079 */
917 - function get_user_meta( $user_id, $meta_key, $single = true ) {
918 - if ( wp_stream_is_vip() && function_exists( 'get_user_attribute' ) ) {
919 - return get_user_attribute( $user_id, $meta_key );
920 - }
1080 + public function get_user_meta( $user_id, $meta_key, $single = true ) {
921 1081 return get_user_meta( $user_id, $meta_key, $single );
922 1082 }
923 1083
924 1084 /**
@@ -923,19 +1083,16 @@
923 1083
924 1084 /**
925 1085 * Update user meta in a way that is also safe for VIP
926 1086 *
927 - * @param int $user_id
928 - * @param string $meta_key
929 - * @param mixed $meta_value
930 - * @param mixed $prev_value (optional)
1087 + * @param int $user_id User ID.
1088 + * @param string $meta_key Meta key.
1089 + * @param mixed $meta_value Meta value.
1090 + * @param mixed $prev_value Previous meta value being overwritten (optional).
931 1091 *
932 1092 * @return int|bool
933 1093 */
934 - function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
935 - if ( wp_stream_is_vip() && function_exists( 'update_user_attribute' ) ) {
936 - return update_user_attribute( $user_id, $meta_key, $meta_value );
937 - }
1094 + public function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
938 1095 return update_user_meta( $user_id, $meta_key, $meta_value, $prev_value );
939 1096 }
940 1097
941 1098 /**
@@ -940,17 +1097,14 @@
940 1097
941 1098 /**
942 1099 * Delete user meta in a way that is also safe for VIP
943 1100 *
944 - * @param int $user_id
945 - * @param string $meta_key
946 - * @param mixed $meta_value (optional)
1101 + * @param int $user_id User ID.
1102 + * @param string $meta_key Meta key.
1103 + * @param mixed $meta_value Meta value (optional).
947 1104 *
948 1105 * @return bool
949 1106 */
950 - function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
951 - if ( wp_stream_is_vip() && function_exists( 'delete_user_attribute' ) ) {
952 - return delete_user_attribute( $user_id, $meta_key, $meta_value );
953 - }
1107 + public function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
954 1108 return delete_user_meta( $user_id, $meta_key, $meta_value );
955 1109 }
956 1110 }