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 +272 -131 3.2.24.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,26 +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 = $this->plugin->db->driver->purge_storage( $this->plugin );
166 -
167 194 // Auto purge setup.
168 195 add_action( 'wp_loaded', array( $this, 'purge_schedule_setup' ) );
169 - 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 + );
170 203
171 204 // Ajax users list.
172 - 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 + );
173 212 }
174 213
175 214 /**
176 215 * Load admin classes
@@ -180,8 +219,14 @@
180 219 public function init() {
181 220 $this->network = new Network( $this->plugin );
182 221 $this->live_update = new Live_Update( $this->plugin );
183 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 + }
184 229 }
185 230
186 231 /**
187 232 * Output specific updates passed as URL parameters.
@@ -207,9 +252,9 @@
207 252 * @param bool $is_error If the message is error_level (true) or warning (false).
208 253 */
209 254 public function notice( $message, $is_error = true ) {
210 255 if ( defined( 'WP_CLI' ) && WP_CLI ) {
211 - $message = strip_tags( $message );
256 + $message = wp_strip_all_tags( $message );
212 257
213 258 if ( $is_error ) {
214 259 WP_CLI::warning( $message );
215 260 } else {
@@ -330,9 +375,15 @@
330 375 */
331 376 do_action( 'wp_stream_admin_menu_screens' );
332 377
333 378 // Register the list table early, so it associates the column headers with 'Screen settings'.
334 - 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 + );
335 386 }
336 387 }
337 388
338 389 /**
@@ -339,15 +390,15 @@
339 390 * Enqueue scripts/styles for admin screen
340 391 *
341 392 * @action admin_enqueue_scripts
342 393 *
343 - * @param string $hook
394 + * @param string $hook Current hook.
344 395 *
345 396 * @return void
346 397 */
347 398 public function admin_enqueue_scripts( $hook ) {
348 - wp_register_script( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/js/select2.full.min.js', array( 'jquery' ), '3.5.2', true );
349 - wp_register_style( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/css/select2.min.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' );
350 401 wp_register_script( 'wp-stream-timeago', $this->plugin->locations['url'] . 'ui/lib/timeago/jquery.timeago.js', array(), '1.4.1', true );
351 402
352 403 $locale = strtolower( substr( get_locale(), 0, 2 ) );
353 404 $file_tmpl = 'ui/lib/timeago/locales/jquery.timeago.%s.js';
@@ -352,14 +403,27 @@
352 403 $locale = strtolower( substr( get_locale(), 0, 2 ) );
353 404 $file_tmpl = 'ui/lib/timeago/locales/jquery.timeago.%s.js';
354 405
355 406 if ( file_exists( $this->plugin->locations['dir'] . sprintf( $file_tmpl, $locale ) ) ) {
356 - 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 + );
357 414 } else {
358 - 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 + );
359 422 }
360 423
361 - 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() );
362 426
363 427 $script_screens = array( 'plugins.php' );
364 428
365 429 if ( in_array( $hook, $this->screen_id, true ) || in_array( $hook, $script_screens, true ) ) {
@@ -368,11 +432,38 @@
368 432
369 433 wp_enqueue_script( 'wp-stream-timeago' );
370 434 wp_enqueue_script( 'wp-stream-timeago-locale' );
371 435
372 - wp_enqueue_script( 'wp-stream-admin', $this->plugin->locations['url'] . 'ui/js/admin.js', array( 'jquery', 'wp-stream-select2' ), $this->plugin->get_version() );
373 - wp_enqueue_script( 'wp-stream-admin-exclude', $this->plugin->locations['url'] . 'ui/js/exclude.js', array( 'jquery', 'wp-stream-select2' ), $this->plugin->get_version() );
374 - 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 + );
375 466
376 467 wp_localize_script(
377 468 'wp-stream-admin',
378 469 'wp_stream',
@@ -377,11 +468,10 @@
377 468 'wp-stream-admin',
378 469 'wp_stream',
379 470 array(
380 471 'i18n' => array(
381 - 'confirm_purge' => esc_html__( 'Are you sure you want to delete all Stream activity records from the database? This cannot be undone.', 'stream' ),
382 - 'confirm_defaults' => esc_html__( 'Are you sure you want to reset all site settings to default? This cannot be undone.', 'stream' ),
383 - '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' ),
384 474 ),
385 475 'locale' => esc_js( $locale ),
386 476 'gmt_offset' => get_option( 'gmt_offset' ),
387 477 )
@@ -386,17 +476,21 @@
386 476 'gmt_offset' => get_option( 'gmt_offset' ),
387 477 )
388 478 );
389 479
480 + $order_types = array( 'asc', 'desc' );
481 +
390 482 wp_localize_script(
391 483 'wp-stream-live-updates',
392 484 'wp_stream_live_updates',
393 485 array(
394 486 'current_screen' => $hook,
395 - 'current_page' => isset( $_GET['paged'] ) ? esc_js( $_GET['paged'] ) : '1', // input var okay
396 - 'current_order' => isset( $_GET['order'] ) ? esc_js( $_GET['order'] ) : 'desc', // input var okay
397 - 'current_query' => wp_stream_json_encode( $_GET ), // input var okay
398 - '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
399 493 )
400 494 );
401 495 }
402 496
@@ -413,15 +507,23 @@
413 507 * @return int
414 508 */
415 509 $bulk_actions_threshold = apply_filters( 'wp_stream_bulk_actions_threshold', 100 );
416 510
417 - 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 +
418 519 wp_localize_script(
419 520 'wp-stream-global',
420 521 'wp_stream_global',
421 522 array(
422 - 'bulk_actions' => array(
423 - 'i18n' => array(
523 + 'bulk_actions' => array(
524 + 'i18n' => array(
525 + /* translators: %s: a number of items (e.g. "1,742") */
424 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 ) ) ),
425 527 ),
426 528 'threshold' => absint( $bulk_actions_threshold ),
427 529 ),
@@ -435,15 +537,21 @@
435 537 *
436 538 * @return bool
437 539 */
438 540 public function is_stream_screen() {
439 - 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 ) ) {
440 547 return true;
441 548 }
442 549
443 - $screen = get_current_screen();
444 - if ( is_admin() && Alerts::POST_TYPE === $screen->post_type ) {
445 - return true;
550 + if ( is_admin() && function_exists( 'get_current_screen' ) ) {
551 + $screen = get_current_screen();
552 +
553 + return ( Alerts::POST_TYPE === $screen->post_type );
446 554 }
447 555
448 556 return false;
449 557 }
@@ -450,9 +558,9 @@
450 558
451 559 /**
452 560 * Add a specific body class to all Stream admin screens
453 561 *
454 - * @param string $classes CSS classes to output to body
562 + * @param string $classes CSS classes to output to body.
455 563 *
456 564 * @filter admin_body_class
457 565 *
458 566 * @return string
@@ -462,10 +570,10 @@
462 570
463 571 if ( $this->is_stream_screen() ) {
464 572 $stream_classes[] = $this->admin_body_class;
465 573
466 - if ( isset( $_GET['page'] ) ) {
467 - $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
468 576 }
469 577 }
470 578
471 579 /**
@@ -486,16 +594,17 @@
486 594 *
487 595 * @action admin_enqueue_scripts
488 596 */
489 597 public function admin_menu_css() {
490 - 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() );
491 600 wp_register_style( 'wp-stream-icons', $this->plugin->locations['url'] . 'ui/stream-icons/style.css', array(), $this->plugin->get_version() );
492 601
493 - // Make sure we're working off a clean version
602 + // Make sure we're working off a clean version.
494 603 if ( ! file_exists( ABSPATH . WPINC . '/version.php' ) ) {
495 604 return;
496 605 }
497 - include( ABSPATH . WPINC . '/version.php' );
606 + include ABSPATH . WPINC . '/version.php';
498 607
499 608 if ( ! isset( $wp_version ) ) {
500 609 return;
501 610 }
@@ -554,10 +663,15 @@
554 663
555 664 \wp_add_inline_style( 'wp-admin', $css );
556 665 }
557 666
667 + /**
668 + * Handle the reset AJAX request to reset logs.
669 + *
670 + * @return bool
671 + */
558 672 public function wp_ajax_reset() {
559 - check_ajax_referer( 'stream_nonce', 'wp_stream_nonce' );
673 + check_ajax_referer( 'stream_nonce_reset', 'wp_stream_nonce_reset' );
560 674
561 675 if ( ! current_user_can( $this->settings_cap ) ) {
562 676 wp_die(
563 677 esc_html__( "You don't have sufficient privileges to do this action.", 'stream' )
@@ -569,9 +683,9 @@
569 683 if ( defined( 'WP_STREAM_TESTS' ) && WP_STREAM_TESTS ) {
570 684 return true;
571 685 }
572 686
573 - wp_redirect(
687 + wp_safe_redirect(
574 688 add_query_arg(
575 689 array(
576 690 'page' => is_network_admin() ? $this->network->network_settings_page_slug : $this->settings_page_slug,
577 691 'message' => 'data_erased',
@@ -582,14 +696,19 @@
582 696
583 697 exit;
584 698 }
585 699
700 + /**
701 + * Clears stream records from the database.
702 + *
703 + * @return void
704 + */
586 705 private function erase_stream_records() {
587 706 global $wpdb;
588 707
589 708 $where = '';
590 709
591 - if ( is_multisite() && ! is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
710 + if ( is_multisite() && ! $this->plugin->is_network_activated() ) {
592 711 $where .= $wpdb->prepare( ' AND `blog_id` = %d', get_current_blog_id() );
593 712 }
594 713
595 714 $wpdb->query(
@@ -600,8 +719,13 @@
600 719 WHERE 1=1 {$where};" // @codingStandardsIgnoreLine $where already prepared
601 720 );
602 721 }
603 722
723 + /**
724 + * Schedules a purge of records.
725 + *
726 + * @return void
727 + */
604 728 public function purge_schedule_setup() {
605 729 if ( ! wp_next_scheduled( 'wp_stream_auto_purge' ) ) {
606 730 wp_schedule_event( time(), 'twicedaily', 'wp_stream_auto_purge' );
607 731 }
@@ -606,26 +730,32 @@
606 730 wp_schedule_event( time(), 'twicedaily', 'wp_stream_auto_purge' );
607 731 }
608 732 }
609 733
734 + /**
735 + * Executes a scheduled purge
736 + *
737 + * @return void
738 + */
610 739 public function purge_scheduled_action() {
611 740 global $wpdb;
612 741
613 - // 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.
614 743 if (
615 744 is_multisite()
616 745 &&
617 746 is_network_admin()
618 747 &&
619 - ! is_plugin_active_for_network( $this->plugin->locations['plugin'] )
748 + ! $this->plugin->is_network_activated()
620 749 ) {
621 750 return;
622 751 }
623 752
624 - if ( is_multisite() && is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
625 - $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 );
626 756 } else {
627 - $options = (array) get_option( 'wp_stream', array() );
757 + $options = (array) get_option( 'wp_stream', $defaults );
628 758 }
629 759
630 760 if ( ! empty( $options['general_keep_records_indefinitely'] ) || ! isset( $options['general_records_ttl'] ) ) {
631 761 return;
@@ -630,17 +760,18 @@
630 760 if ( ! empty( $options['general_keep_records_indefinitely'] ) || ! isset( $options['general_records_ttl'] ) ) {
631 761 return;
632 762 }
633 763
634 - $days = $options['general_records_ttl'];
635 - $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 );
636 767
637 768 $date->sub( DateInterval::createFromDateString( "$days days" ) );
638 769
639 770 $where = $wpdb->prepare( ' AND `stream`.`created` < %s', $date->format( 'Y-m-d H:i:s' ) );
640 771
641 - // Multisite but NOT network activated, only purge the current blog
642 - 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() ) {
643 774 $where .= $wpdb->prepare( ' AND `blog_id` = %d', get_current_blog_id() );
644 775 }
645 776
646 777 $wpdb->query(
@@ -652,13 +783,15 @@
652 783 );
653 784 }
654 785
655 786 /**
656 - * @param array $links
657 - * @param string $file
787 + * Returns the admin action links.
658 788 *
659 789 * @filter plugin_action_links
660 790 *
791 + * @param array $links Action links.
792 + * @param string $file Plugin file.
793 + *
661 794 * @return array
662 795 */
663 796 public function plugin_action_links( $links, $file ) {
664 797 if ( plugin_basename( $this->plugin->locations['dir'] . 'stream.php' ) !== $file ) {
@@ -664,31 +797,31 @@
664 797 if ( plugin_basename( $this->plugin->locations['dir'] . 'stream.php' ) !== $file ) {
665 798 return $links;
666 799 }
667 800
668 - // Also don't show links in Network Admin if Stream isn't network enabled
669 - 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() ) {
670 803 return $links;
671 804 }
672 805
673 806 if ( is_network_admin() ) {
674 - $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 + );
675 813 } else {
676 - $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 + );
677 820 }
678 821
679 822 $links[] = sprintf( '<a href="%s">%s</a>', esc_url( $admin_page_url ), esc_html__( 'Settings', 'default' ) );
680 823
681 - $url = add_query_arg(
682 - array(
683 - 'action' => 'wp_stream_uninstall',
684 - 'wp_stream_nonce' => wp_create_nonce( 'stream_nonce' ),
685 - ),
686 - admin_url( 'admin-ajax.php' )
687 - );
688 -
689 - $links[] = sprintf( '<span id="wp_stream_uninstall" class="delete"><a href="%s">%s</a></span>', esc_url( $url ), esc_html__( 'Uninstall', 'stream' ) );
690 -
691 824 return $links;
692 825 }
693 826
694 827 /**
@@ -700,9 +833,9 @@
700 833 <div class="wrap">
701 834 <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
702 835 <?php $this->list_table->display(); ?>
703 836 </div>
704 - <?php
837 + <?php
705 838 }
706 839
707 840 /**
708 841 * Render settings page
@@ -714,10 +847,10 @@
714 847 $page_description = apply_filters( 'wp_stream_settings_form_description', '' );
715 848
716 849 $sections = $this->plugin->settings->get_fields();
717 850 $active_tab = wp_stream_filter_input( INPUT_GET, 'tab' );
718 -
719 - 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 );
720 853 ?>
721 854 <div class="wrap">
722 855 <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
723 856
@@ -728,13 +861,13 @@
728 861 <?php settings_errors(); ?>
729 862
730 863 <?php if ( count( $sections ) > 1 ) : ?>
731 864 <h2 class="nav-tab-wrapper">
732 - <?php $i = 0 ?>
865 + <?php $i = 0; ?>
733 866 <?php foreach ( $sections as $section => $data ) : ?>
734 - <?php $i ++ ?>
867 + <?php ++$i; ?>
735 868 <?php $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section ); ?>
736 - <a href="<?php echo esc_url( add_query_arg( 'tab', $section ) ); ?>" class="nav-tab<?php if ( $is_active ) { echo esc_attr( ' nav-tab-active' ); } ?>">
869 + <a href="<?php echo esc_url( add_query_arg( 'tab', $section ) ); ?>" class="nav-tab <?php echo $is_active ? esc_attr( ' nav-tab-active' ) : ''; ?>">
737 870 <?php echo esc_html( $data['title'] ); ?>
738 871 </a>
739 872 <?php endforeach; ?>
740 873 </h2>
@@ -742,27 +875,27 @@
742 875
743 876 <div class="nav-tab-content" id="tab-content-settings">
744 877 <form method="post" action="<?php echo esc_attr( $form_action ); ?>" enctype="multipart/form-data">
745 878 <div class="settings-sections">
746 - <?php
747 - $i = 0;
748 - foreach ( $sections as $section => $data ) {
749 - $i++;
879 + <?php
880 + $i = 0;
881 + foreach ( $sections as $section => $data ) {
882 + ++$i;
750 883
751 - $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section );
884 + $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section );
752 885
753 - if ( $is_active ) {
754 - settings_fields( $option_key );
755 - do_settings_sections( $option_key );
756 - }
757 - }
758 - ?>
886 + if ( $is_active ) {
887 + settings_fields( $option_key );
888 + do_settings_sections( $option_key );
889 + }
890 + }
891 + ?>
759 892 </div>
760 893 <?php submit_button(); ?>
761 894 </form>
762 895 </div>
763 896 </div>
764 - <?php
897 + <?php
765 898 }
766 899
767 900 /**
768 901 * Instantiate the list table
@@ -767,15 +900,20 @@
767 900 /**
768 901 * Instantiate the list table
769 902 */
770 903 public function register_list_table() {
771 - $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 + );
772 910 }
773 911
774 912 /**
775 913 * Check if a particular role has access
776 914 *
777 - * @param string $role
915 + * @param string $role User role.
778 916 *
779 917 * @return bool
780 918 */
781 919 private function role_can_view( $role ) {
@@ -788,12 +926,12 @@
788 926
789 927 /**
790 928 * Filter user caps to dynamically grant our view cap based on allowed roles
791 929 *
792 - * @param $allcaps
793 - * @param $caps
794 - * @param $args
795 - * @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.
796 934 *
797 935 * @filter user_has_cap
798 936 *
799 937 * @return array
@@ -838,11 +976,11 @@
838 976 * Filter role caps to dynamically grant our view cap based on allowed roles
839 977 *
840 978 * @filter role_has_cap
841 979 *
842 - * @param $allcaps
843 - * @param $cap
844 - * @param $role
980 + * @param array $allcaps All capabilities.
981 + * @param string $cap Require cap.
982 + * @param string $role User role.
845 983 *
846 984 * @return array
847 985 */
848 986 public function filter_role_caps( $allcaps, $cap, $role ) {
@@ -855,8 +993,10 @@
855 993 return $allcaps;
856 994 }
857 995
858 996 /**
997 + * Ajax callback for return a user list.
998 + *
859 999 * @action wp_ajax_wp_stream_filters
860 1000 */
861 1001 public function ajax_filters() {
862 1002 if ( ! defined( 'DOING_AJAX' ) || ! current_user_can( $this->plugin->admin->settings_cap ) ) {
@@ -867,9 +1007,13 @@
867 1007
868 1008 switch ( wp_stream_filter_input( INPUT_GET, 'filter' ) ) {
869 1009 case 'user_id':
870 1010 $users = array_merge(
871 - array( 0 => (object) array( 'display_name' => 'WP-CLI' ) ),
1011 + array(
1012 + 0 => (object) array(
1013 + 'display_name' => 'WP-CLI',
1014 + ),
1015 + ),
872 1016 get_users()
873 1017 );
874 1018
875 1019 $search = wp_stream_filter_input( INPUT_GET, 'q' );
@@ -876,9 +1020,9 @@
876 1020 if ( $search ) {
877 1021 // `search` arg for get_users() is not enough
878 1022 $users = array_filter(
879 1023 $users,
880 - function( $user ) use ( $search ) {
1024 + function ( $user ) use ( $search ) {
881 1025 return false !== mb_strpos( mb_strtolower( $user->display_name ), mb_strtolower( $search ) );
882 1026 }
883 1027 );
884 1028 }
@@ -886,9 +1030,9 @@
886 1030 if ( count( $users ) > $this->preload_users_max ) {
887 1031 $users = array_slice( $users, 0, $this->preload_users_max );
888 1032 }
889 1033
890 - // Get gravatar / roles for final result set
1034 + // Get gravatar / roles for final result set.
891 1035 $results = $this->get_users_record_meta( $users );
892 1036
893 1037 break;
894 1038 }
@@ -893,14 +1037,20 @@
893 1037 break;
894 1038 }
895 1039
896 1040 if ( isset( $results ) ) {
897 - echo wp_stream_json_encode( $results ); // xss ok
1041 + echo wp_json_encode( $results );
898 1042 }
899 1043
900 1044 die();
901 1045 }
902 1046
1047 + /**
1048 + * Return relevant user meta data.
1049 + *
1050 + * @param array $authors Author data.
1051 + * @return array
1052 + */
903 1053 public function get_users_record_meta( $authors ) {
904 1054 $authors_records = array();
905 1055
906 1056 foreach ( $authors as $user_id => $args ) {
@@ -906,13 +1056,13 @@
906 1056 foreach ( $authors as $user_id => $args ) {
907 1057 $author = new Author( $args->ID );
908 1058
909 1059 $authors_records[ $user_id ] = array(
910 - 'text' => $author->get_display_name(),
911 - 'id' => $author->id,
912 - 'label' => $author->get_display_name(),
913 - 'icon' => $author->get_avatar_src( 32 ),
914 - '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' => '',
915 1065 );
916 1066 }
917 1067
918 1068 return $authors_records;
@@ -920,18 +1070,15 @@
920 1070
921 1071 /**
922 1072 * Get user meta in a way that is also safe for VIP
923 1073 *
924 - * @param int $user_id
925 - * @param string $meta_key
926 - * @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).
927 1077 *
928 1078 * @return mixed
929 1079 */
930 - function get_user_meta( $user_id, $meta_key, $single = true ) {
931 - if ( wp_stream_is_vip() && function_exists( 'get_user_attribute' ) ) {
932 - return get_user_attribute( $user_id, $meta_key );
933 - }
1080 + public function get_user_meta( $user_id, $meta_key, $single = true ) {
934 1081 return get_user_meta( $user_id, $meta_key, $single );
935 1082 }
936 1083
937 1084 /**
@@ -936,19 +1083,16 @@
936 1083
937 1084 /**
938 1085 * Update user meta in a way that is also safe for VIP
939 1086 *
940 - * @param int $user_id
941 - * @param string $meta_key
942 - * @param mixed $meta_value
943 - * @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).
944 1091 *
945 1092 * @return int|bool
946 1093 */
947 - function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
948 - if ( wp_stream_is_vip() && function_exists( 'update_user_attribute' ) ) {
949 - return update_user_attribute( $user_id, $meta_key, $meta_value );
950 - }
1094 + public function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
951 1095 return update_user_meta( $user_id, $meta_key, $meta_value, $prev_value );
952 1096 }
953 1097
954 1098 /**
@@ -953,17 +1097,14 @@
953 1097
954 1098 /**
955 1099 * Delete user meta in a way that is also safe for VIP
956 1100 *
957 - * @param int $user_id
958 - * @param string $meta_key
959 - * @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).
960 1104 *
961 1105 * @return bool
962 1106 */
963 - function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
964 - if ( wp_stream_is_vip() && function_exists( 'delete_user_attribute' ) ) {
965 - return delete_user_attribute( $user_id, $meta_key, $meta_value );
966 - }
1107 + public function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
967 1108 return delete_user_meta( $user_id, $meta_key, $meta_value );
968 1109 }
969 1110 }