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