PluginProbe
Stream – Activity Log & Audit Trail / 3.8.0
Stream – Activity Log & Audit Trail v3.8.0
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 -121 3.1.13.8.0 View file →
@@ -1,5 +1,11 @@
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,11 +12,15 @@
6 12 use DateInterval;
7 13 use \WP_CLI;
8 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,62 @@
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' ) );
194 + /**
195 + * Uninstall Streams and Deactivate plugin.
196 + *
197 + * @todo Confirm if variable assignment is necessary.
198 + */
199 + $uninstall = $this->plugin->db->driver->purge_storage( $this->plugin );
167 200
168 201 // Auto purge setup.
169 202 add_action( 'wp_loaded', array( $this, 'purge_schedule_setup' ) );
170 - add_action( 'wp_stream_auto_purge', array( $this, 'purge_scheduled_action' ) );
203 + add_action(
204 + 'wp_stream_auto_purge',
205 + array(
206 + $this,
207 + 'purge_scheduled_action',
208 + )
209 + );
171 210
172 211 // Ajax users list.
173 - add_action( 'wp_ajax_wp_stream_filters', array( $this, 'ajax_filters' ) );
212 + add_action(
213 + 'wp_ajax_wp_stream_filters',
214 + array(
215 + $this,
216 + 'ajax_filters',
217 + )
218 + );
174 219 }
175 220
176 221 /**
177 222 * Load admin classes
@@ -208,9 +253,9 @@
208 253 * @param bool $is_error If the message is error_level (true) or warning (false).
209 254 */
210 255 public function notice( $message, $is_error = true ) {
211 256 if ( defined( 'WP_CLI' ) && WP_CLI ) {
212 - $message = strip_tags( $message );
257 + $message = wp_strip_all_tags( $message );
213 258
214 259 if ( $is_error ) {
215 260 WP_CLI::warning( $message );
216 261 } else {
@@ -331,9 +376,15 @@
331 376 */
332 377 do_action( 'wp_stream_admin_menu_screens' );
333 378
334 379 // 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' ) );
380 + add_action(
381 + 'load-' . $this->screen_id['main'],
382 + array(
383 + $this,
384 + 'register_list_table',
385 + )
386 + );
336 387 }
337 388 }
338 389
339 390 /**
@@ -340,15 +391,15 @@
340 391 * Enqueue scripts/styles for admin screen
341 392 *
342 393 * @action admin_enqueue_scripts
343 394 *
344 - * @param string $hook
395 + * @param string $hook Current hook.
345 396 *
346 397 * @return void
347 398 */
348 399 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' );
400 + wp_register_script( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/js/select2.full.min.js', array( 'jquery' ), '3.5.2', true );
401 + wp_register_style( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/css/select2.min.css', array(), '3.5.2' );
351 402 wp_register_script( 'wp-stream-timeago', $this->plugin->locations['url'] . 'ui/lib/timeago/jquery.timeago.js', array(), '1.4.1', true );
352 403
353 404 $locale = strtolower( substr( get_locale(), 0, 2 ) );
354 405 $file_tmpl = 'ui/lib/timeago/locales/jquery.timeago.%s.js';
@@ -353,14 +404,27 @@
353 404 $locale = strtolower( substr( get_locale(), 0, 2 ) );
354 405 $file_tmpl = 'ui/lib/timeago/locales/jquery.timeago.%s.js';
355 406
356 407 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' );
408 + wp_register_script(
409 + 'wp-stream-timeago-locale',
410 + $this->plugin->locations['url'] . sprintf( $file_tmpl, $locale ),
411 + array( 'wp-stream-timeago' ),
412 + '1',
413 + false
414 + );
358 415 } else {
359 - wp_register_script( 'wp-stream-timeago-locale', $this->plugin->locations['url'] . sprintf( $file_tmpl, 'en' ), array( 'wp-stream-timeago' ), '1' );
416 + wp_register_script(
417 + 'wp-stream-timeago-locale',
418 + $this->plugin->locations['url'] . sprintf( $file_tmpl, 'en' ),
419 + array( 'wp-stream-timeago' ),
420 + '1',
421 + false
422 + );
360 423 }
361 424
362 - wp_enqueue_style( 'wp-stream-admin', $this->plugin->locations['url'] . 'ui/css/admin.css', array(), $this->plugin->get_version() );
425 + $min = wp_stream_min_suffix();
426 + wp_enqueue_style( 'wp-stream-admin', $this->plugin->locations['url'] . 'ui/css/admin.' . $min . 'css', array(), $this->plugin->get_version() );
363 427
364 428 $script_screens = array( 'plugins.php' );
365 429
366 430 if ( in_array( $hook, $this->screen_id, true ) || in_array( $hook, $script_screens, true ) ) {
@@ -369,11 +433,38 @@
369 433
370 434 wp_enqueue_script( 'wp-stream-timeago' );
371 435 wp_enqueue_script( 'wp-stream-timeago-locale' );
372 436
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() );
437 + wp_enqueue_script(
438 + 'wp-stream-admin',
439 + $this->plugin->locations['url'] . 'ui/js/admin.' . $min . 'js',
440 + array(
441 + 'jquery',
442 + 'wp-stream-select2',
443 + ),
444 + $this->plugin->get_version(),
445 + false
446 + );
447 + wp_enqueue_script(
448 + 'wp-stream-admin-exclude',
449 + $this->plugin->locations['url'] . 'ui/js/exclude.' . $min . 'js',
450 + array(
451 + 'jquery',
452 + 'wp-stream-select2',
453 + ),
454 + $this->plugin->get_version(),
455 + false
456 + );
457 + wp_enqueue_script(
458 + 'wp-stream-live-updates',
459 + $this->plugin->locations['url'] . 'ui/js/live-updates.' . $min . 'js',
460 + array(
461 + 'jquery',
462 + 'heartbeat',
463 + ),
464 + $this->plugin->get_version(),
465 + false
466 + );
376 467
377 468 wp_localize_script(
378 469 'wp-stream-admin',
379 470 'wp_stream',
@@ -387,17 +478,21 @@
387 478 'gmt_offset' => get_option( 'gmt_offset' ),
388 479 )
389 480 );
390 481
482 + $order_types = array( 'asc', 'desc' );
483 +
391 484 wp_localize_script(
392 485 'wp-stream-live-updates',
393 486 'wp_stream_live_updates',
394 487 array(
395 488 '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
489 + 'current_page' => isset( $_GET['paged'] ) ? absint( wp_unslash( $_GET['paged'] ) ) : '1', // phpcs:ignore WordPress.Security.NonceVerification.Recommended
490 + 'current_order' => isset( $_GET['order'] ) && in_array( strtolower( $_GET['order'] ), $order_types, true ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
491 + ? esc_js( $_GET['order'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
492 + : 'desc',
493 + 'current_query' => wp_stream_json_encode( $_GET ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
494 + 'current_query_count' => count( $_GET ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
400 495 )
401 496 );
402 497 }
403 498
@@ -414,15 +509,23 @@
414 509 * @return int
415 510 */
416 511 $bulk_actions_threshold = apply_filters( 'wp_stream_bulk_actions_threshold', 100 );
417 512
418 - wp_enqueue_script( 'wp-stream-global', $this->plugin->locations['url'] . 'ui/js/global.js', array( 'jquery' ), $this->plugin->get_version() );
513 + wp_enqueue_script(
514 + 'wp-stream-global',
515 + $this->plugin->locations['url'] . 'ui/js/global.' . $min . 'js',
516 + array( 'jquery' ),
517 + $this->plugin->get_version(),
518 + false
519 + );
520 +
419 521 wp_localize_script(
420 522 'wp-stream-global',
421 523 'wp_stream_global',
422 524 array(
423 - 'bulk_actions' => array(
424 - 'i18n' => array(
525 + 'bulk_actions' => array(
526 + 'i18n' => array(
527 + /* translators: %s: a number of items (e.g. "1,742") */
425 528 '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 529 ),
427 530 'threshold' => absint( $bulk_actions_threshold ),
428 531 ),
@@ -441,9 +544,9 @@
441 544 return true;
442 545 }
443 546
444 547 $screen = get_current_screen();
445 - if ( is_admin() && 'post' === $screen->base && Alerts::POST_TYPE === $screen->post_type ) {
548 + if ( is_admin() && Alerts::POST_TYPE === $screen->post_type ) {
446 549 return true;
447 550 }
448 551
449 552 return false;
@@ -451,9 +554,9 @@
451 554
452 555 /**
453 556 * Add a specific body class to all Stream admin screens
454 557 *
455 - * @param string $classes CSS classes to output to body
558 + * @param string $classes CSS classes to output to body.
456 559 *
457 560 * @filter admin_body_class
458 561 *
459 562 * @return string
@@ -463,10 +566,10 @@
463 566
464 567 if ( $this->is_stream_screen() ) {
465 568 $stream_classes[] = $this->admin_body_class;
466 569
467 - if ( isset( $_GET['page'] ) ) {
468 - $stream_classes[] = sanitize_key( $_GET['page'] ); // input var okay
570 + if ( isset( $_GET['page'] ) ) { // // phpcs:ignore WordPress.Security.NonceVerification.Recommended
571 + $stream_classes[] = sanitize_key( $_GET['page'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
469 572 }
470 573 }
471 574
472 575 /**
@@ -487,16 +590,17 @@
487 590 *
488 591 * @action admin_enqueue_scripts
489 592 */
490 593 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() );
594 + $min = wp_stream_min_suffix();
595 + wp_register_style( 'wp-stream-datepicker', $this->plugin->locations['url'] . 'ui/css/datepicker.' . $min . 'css', array(), $this->plugin->get_version() );
492 596 wp_register_style( 'wp-stream-icons', $this->plugin->locations['url'] . 'ui/stream-icons/style.css', array(), $this->plugin->get_version() );
493 597
494 - // Make sure we're working off a clean version
598 + // Make sure we're working off a clean version.
495 599 if ( ! file_exists( ABSPATH . WPINC . '/version.php' ) ) {
496 600 return;
497 601 }
498 - include( ABSPATH . WPINC . '/version.php' );
602 + include ABSPATH . WPINC . '/version.php';
499 603
500 604 if ( ! isset( $wp_version ) ) {
501 605 return;
502 606 }
@@ -555,10 +659,15 @@
555 659
556 660 \wp_add_inline_style( 'wp-admin', $css );
557 661 }
558 662
663 + /**
664 + * Handle the reset AJAX request to reset logs.
665 + *
666 + * @return bool
667 + */
559 668 public function wp_ajax_reset() {
560 - check_ajax_referer( 'stream_nonce', 'wp_stream_nonce' );
669 + check_ajax_referer( 'stream_nonce_reset', 'wp_stream_nonce_reset' );
561 670
562 671 if ( ! current_user_can( $this->settings_cap ) ) {
563 672 wp_die(
564 673 esc_html__( "You don't have sufficient privileges to do this action.", 'stream' )
@@ -570,9 +679,9 @@
570 679 if ( defined( 'WP_STREAM_TESTS' ) && WP_STREAM_TESTS ) {
571 680 return true;
572 681 }
573 682
574 - wp_redirect(
683 + wp_safe_redirect(
575 684 add_query_arg(
576 685 array(
577 686 'page' => is_network_admin() ? $this->network->network_settings_page_slug : $this->settings_page_slug,
578 687 'message' => 'data_erased',
@@ -583,14 +692,19 @@
583 692
584 693 exit;
585 694 }
586 695
696 + /**
697 + * Clears stream records from the database.
698 + *
699 + * @return void
700 + */
587 701 private function erase_stream_records() {
588 702 global $wpdb;
589 703
590 704 $where = '';
591 705
592 - if ( is_multisite() && ! is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
706 + if ( is_multisite() && ! $this->plugin->is_network_activated() ) {
593 707 $where .= $wpdb->prepare( ' AND `blog_id` = %d', get_current_blog_id() );
594 708 }
595 709
596 710 $wpdb->query(
@@ -601,8 +715,13 @@
601 715 WHERE 1=1 {$where};" // @codingStandardsIgnoreLine $where already prepared
602 716 );
603 717 }
604 718
719 + /**
720 + * Schedules a purge of records.
721 + *
722 + * @return void
723 + */
605 724 public function purge_schedule_setup() {
606 725 if ( ! wp_next_scheduled( 'wp_stream_auto_purge' ) ) {
607 726 wp_schedule_event( time(), 'twicedaily', 'wp_stream_auto_purge' );
608 727 }
@@ -607,26 +726,32 @@
607 726 wp_schedule_event( time(), 'twicedaily', 'wp_stream_auto_purge' );
608 727 }
609 728 }
610 729
730 + /**
731 + * Executes a scheduled purge
732 + *
733 + * @return void
734 + */
611 735 public function purge_scheduled_action() {
612 736 global $wpdb;
613 737
614 - // Don't purge when in Network Admin unless Stream is network activated
738 + // Don't purge when in Network Admin unless Stream is network activated.
615 739 if (
616 740 is_multisite()
617 741 &&
618 742 is_network_admin()
619 743 &&
620 - ! is_plugin_active_for_network( $this->plugin->locations['plugin'] )
744 + ! $this->plugin->is_network_activated()
621 745 ) {
622 746 return;
623 747 }
624 748
625 - if ( is_multisite() && is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
626 - $options = (array) get_site_option( 'wp_stream_network', array() );
749 + $defaults = $this->plugin->settings->get_defaults();
750 + if ( is_multisite() && $this->plugin->is_network_activated() ) {
751 + $options = (array) get_site_option( 'wp_stream_network', $defaults );
627 752 } else {
628 - $options = (array) get_option( 'wp_stream', array() );
753 + $options = (array) get_option( 'wp_stream', $defaults );
629 754 }
630 755
631 756 if ( ! empty( $options['general_keep_records_indefinitely'] ) || ! isset( $options['general_records_ttl'] ) ) {
632 757 return;
@@ -631,17 +756,18 @@
631 756 if ( ! empty( $options['general_keep_records_indefinitely'] ) || ! isset( $options['general_records_ttl'] ) ) {
632 757 return;
633 758 }
634 759
635 - $days = $options['general_records_ttl'];
636 - $date = new DateTime( 'now', $timezone = new DateTimeZone( 'UTC' ) );
760 + $days = $options['general_records_ttl'];
761 + $timezone = new DateTimeZone( 'UTC' );
762 + $date = new DateTime( 'now', $timezone );
637 763
638 764 $date->sub( DateInterval::createFromDateString( "$days days" ) );
639 765
640 766 $where = $wpdb->prepare( ' AND `stream`.`created` < %s', $date->format( 'Y-m-d H:i:s' ) );
641 767
642 - // Multisite but NOT network activated, only purge the current blog
643 - if ( is_multisite() && ! is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
768 + // Multisite but NOT network activated, only purge the current blog.
769 + if ( is_multisite() && ! $this->plugin->is_network_activated() ) {
644 770 $where .= $wpdb->prepare( ' AND `blog_id` = %d', get_current_blog_id() );
645 771 }
646 772
647 773 $wpdb->query(
@@ -653,13 +779,15 @@
653 779 );
654 780 }
655 781
656 782 /**
657 - * @param array $links
658 - * @param string $file
783 + * Returns the admin action links.
659 784 *
660 785 * @filter plugin_action_links
661 786 *
787 + * @param array $links Action links.
788 + * @param string $file Plugin file.
789 + *
662 790 * @return array
663 791 */
664 792 public function plugin_action_links( $links, $file ) {
665 793 if ( plugin_basename( $this->plugin->locations['dir'] . 'stream.php' ) !== $file ) {
@@ -665,30 +793,42 @@
665 793 if ( plugin_basename( $this->plugin->locations['dir'] . 'stream.php' ) !== $file ) {
666 794 return $links;
667 795 }
668 796
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'] ) ) {
797 + // Also don't show links in Network Admin if Stream isn't network enabled.
798 + if ( is_network_admin() && is_multisite() && ! $this->plugin->is_network_activated() ) {
671 799 return $links;
672 800 }
673 801
674 802 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 ) );
803 + $admin_page_url = add_query_arg(
804 + array(
805 + 'page' => $this->network->network_settings_page_slug,
806 + ),
807 + network_admin_url( $this->admin_parent_page )
808 + );
676 809 } else {
677 - $admin_page_url = add_query_arg( array( 'page' => $this->settings_page_slug ), admin_url( $this->admin_parent_page ) );
810 + $admin_page_url = add_query_arg(
811 + array(
812 + 'page' => $this->settings_page_slug,
813 + ),
814 + admin_url( $this->admin_parent_page )
815 + );
678 816 }
679 817
680 818 $links[] = sprintf( '<a href="%s">%s</a>', esc_url( $admin_page_url ), esc_html__( 'Settings', 'default' ) );
681 819
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 - );
820 + if ( ! defined( 'DISALLOW_FILE_MODS' ) || false === DISALLOW_FILE_MODS ) {
821 + $url = add_query_arg(
822 + array(
823 + 'action' => 'wp_stream_uninstall',
824 + 'wp_stream_nonce' => wp_create_nonce( 'stream_nonce' ),
825 + ),
826 + admin_url( 'admin-ajax.php' )
827 + );
689 828
690 - $links[] = sprintf( '<span id="wp_stream_uninstall" class="delete"><a href="%s">%s</a></span>', esc_url( $url ), esc_html__( 'Uninstall', 'stream' ) );
829 + $links[] = sprintf( '<span id="wp_stream_uninstall" class="delete"><a href="%s">%s</a></span>', esc_url( $url ), esc_html__( 'Uninstall', 'stream' ) );
830 + }
691 831
692 832 return $links;
693 833 }
694 834
@@ -698,12 +838,12 @@
698 838 public function render_list_table() {
699 839 $this->list_table->prepare_items();
700 840 ?>
701 841 <div class="wrap">
702 - <h1><?php echo esc_html( get_admin_page_title() ) ?></h1>
703 - <?php $this->list_table->display() ?>
842 + <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
843 + <?php $this->list_table->display(); ?>
704 844 </div>
705 - <?php
845 + <?php
706 846 }
707 847
708 848 /**
709 849 * Render settings page
@@ -715,28 +855,28 @@
715 855 $page_description = apply_filters( 'wp_stream_settings_form_description', '' );
716 856
717 857 $sections = $this->plugin->settings->get_fields();
718 858 $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 );
859 + $min = wp_stream_min_suffix();
860 + wp_enqueue_script( 'wp-stream-settings', $this->plugin->locations['url'] . 'ui/js/settings.' . $min . 'js', array( 'jquery' ), $this->plugin->get_version(), true );
721 861 ?>
722 862 <div class="wrap">
723 - <h1><?php echo esc_html( get_admin_page_title() ) ?></h1>
863 + <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
724 864
725 865 <?php if ( ! empty( $page_description ) ) : ?>
726 - <p><?php echo esc_html( $page_description ) ?></p>
866 + <p><?php echo esc_html( $page_description ); ?></p>
727 867 <?php endif; ?>
728 868
729 - <?php settings_errors() ?>
869 + <?php settings_errors(); ?>
730 870
731 871 <?php if ( count( $sections ) > 1 ) : ?>
732 872 <h2 class="nav-tab-wrapper">
733 - <?php $i = 0 ?>
873 + <?php $i = 0; ?>
734 874 <?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'] ) ?>
875 + <?php $i++; ?>
876 + <?php $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section ); ?>
877 + <a href="<?php echo esc_url( add_query_arg( 'tab', $section ) ); ?>" class="nav-tab <?php echo $is_active ? esc_attr( ' nav-tab-active' ) : ''; ?>">
878 + <?php echo esc_html( $data['title'] ); ?>
739 879 </a>
740 880 <?php endforeach; ?>
741 881 </h2>
742 882 <?php endif; ?>
@@ -741,29 +881,29 @@
741 881 </h2>
742 882 <?php endif; ?>
743 883
744 884 <div class="nav-tab-content" id="tab-content-settings">
745 - <form method="post" action="<?php echo esc_attr( $form_action ) ?>" enctype="multipart/form-data">
885 + <form method="post" action="<?php echo esc_attr( $form_action ); ?>" enctype="multipart/form-data">
746 886 <div class="settings-sections">
747 - <?php
748 - $i = 0;
749 - foreach ( $sections as $section => $data ) {
750 - $i++;
887 + <?php
888 + $i = 0;
889 + foreach ( $sections as $section => $data ) {
890 + $i++;
751 891
752 - $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section );
892 + $is_active = ( ( 1 === $i && ! $active_tab ) || $active_tab === $section );
753 893
754 - if ( $is_active ) {
755 - settings_fields( $option_key );
756 - do_settings_sections( $option_key );
757 - }
758 - }
759 - ?>
894 + if ( $is_active ) {
895 + settings_fields( $option_key );
896 + do_settings_sections( $option_key );
897 + }
898 + }
899 + ?>
760 900 </div>
761 - <?php submit_button() ?>
901 + <?php submit_button(); ?>
762 902 </form>
763 903 </div>
764 904 </div>
765 - <?php
905 + <?php
766 906 }
767 907
768 908 /**
769 909 * Instantiate the list table
@@ -768,15 +908,20 @@
768 908 /**
769 909 * Instantiate the list table
770 910 */
771 911 public function register_list_table() {
772 - $this->list_table = new List_Table( $this->plugin, array( 'screen' => $this->screen_id['main'] ) );
912 + $this->list_table = new List_Table(
913 + $this->plugin,
914 + array(
915 + 'screen' => $this->screen_id['main'],
916 + )
917 + );
773 918 }
774 919
775 920 /**
776 921 * Check if a particular role has access
777 922 *
778 - * @param string $role
923 + * @param string $role User role.
779 924 *
780 925 * @return bool
781 926 */
782 927 private function role_can_view( $role ) {
@@ -789,12 +934,12 @@
789 934
790 935 /**
791 936 * Filter user caps to dynamically grant our view cap based on allowed roles
792 937 *
793 - * @param $allcaps
794 - * @param $caps
795 - * @param $args
796 - * @param $user
938 + * @param array $allcaps All capabilities.
939 + * @param array $caps Required caps.
940 + * @param array $args Unused.
941 + * @param WP_User $user User.
797 942 *
798 943 * @filter user_has_cap
799 944 *
800 945 * @return array
@@ -839,11 +984,11 @@
839 984 * Filter role caps to dynamically grant our view cap based on allowed roles
840 985 *
841 986 * @filter role_has_cap
842 987 *
843 - * @param $allcaps
844 - * @param $cap
845 - * @param $role
988 + * @param array $allcaps All capabilities.
989 + * @param string $cap Require cap.
990 + * @param string $role User role.
846 991 *
847 992 * @return array
848 993 */
849 994 public function filter_role_caps( $allcaps, $cap, $role ) {
@@ -856,8 +1001,10 @@
856 1001 return $allcaps;
857 1002 }
858 1003
859 1004 /**
1005 + * Ajax callback for return a user list.
1006 + *
860 1007 * @action wp_ajax_wp_stream_filters
861 1008 */
862 1009 public function ajax_filters() {
863 1010 if ( ! defined( 'DOING_AJAX' ) || ! current_user_can( $this->plugin->admin->settings_cap ) ) {
@@ -868,9 +1015,13 @@
868 1015
869 1016 switch ( wp_stream_filter_input( INPUT_GET, 'filter' ) ) {
870 1017 case 'user_id':
871 1018 $users = array_merge(
872 - array( 0 => (object) array( 'display_name' => 'WP-CLI' ) ),
1019 + array(
1020 + 0 => (object) array(
1021 + 'display_name' => 'WP-CLI',
1022 + ),
1023 + ),
873 1024 get_users()
874 1025 );
875 1026
876 1027 $search = wp_stream_filter_input( INPUT_GET, 'q' );
@@ -877,9 +1028,9 @@
877 1028 if ( $search ) {
878 1029 // `search` arg for get_users() is not enough
879 1030 $users = array_filter(
880 1031 $users,
881 - function( $user ) use ( $search ) {
1032 + function ( $user ) use ( $search ) {
882 1033 return false !== mb_strpos( mb_strtolower( $user->display_name ), mb_strtolower( $search ) );
883 1034 }
884 1035 );
885 1036 }
@@ -887,9 +1038,9 @@
887 1038 if ( count( $users ) > $this->preload_users_max ) {
888 1039 $users = array_slice( $users, 0, $this->preload_users_max );
889 1040 }
890 1041
891 - // Get gravatar / roles for final result set
1042 + // Get gravatar / roles for final result set.
892 1043 $results = $this->get_users_record_meta( $users );
893 1044
894 1045 break;
895 1046 }
@@ -894,14 +1045,20 @@
894 1045 break;
895 1046 }
896 1047
897 1048 if ( isset( $results ) ) {
898 - echo wp_stream_json_encode( $results ); // xss ok
1049 + echo wp_stream_json_encode( $results ); // xss ok.
899 1050 }
900 1051
901 1052 die();
902 1053 }
903 1054
1055 + /**
1056 + * Return relevant user meta data.
1057 + *
1058 + * @param array $authors Author data.
1059 + * @return array
1060 + */
904 1061 public function get_users_record_meta( $authors ) {
905 1062 $authors_records = array();
906 1063
907 1064 foreach ( $authors as $user_id => $args ) {
@@ -907,13 +1064,13 @@
907 1064 foreach ( $authors as $user_id => $args ) {
908 1065 $author = new Author( $args->ID );
909 1066
910 1067 $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' => '',
1068 + 'text' => $author->get_display_name(),
1069 + 'id' => $author->id,
1070 + 'label' => $author->get_display_name(),
1071 + 'icon' => $author->get_avatar_src( 32 ),
1072 + 'title' => '',
916 1073 );
917 1074 }
918 1075
919 1076 return $authors_records;
@@ -921,18 +1078,19 @@
921 1078
922 1079 /**
923 1080 * Get user meta in a way that is also safe for VIP
924 1081 *
925 - * @param int $user_id
926 - * @param string $meta_key
927 - * @param bool $single (optional)
1082 + * @param int $user_id User ID.
1083 + * @param string $meta_key Meta key.
1084 + * @param bool $single Return first found meta value connected to the meta key (optional).
928 1085 *
929 1086 * @return mixed
930 1087 */
931 - function get_user_meta( $user_id, $meta_key, $single = true ) {
1088 + public function get_user_meta( $user_id, $meta_key, $single = true ) {
932 1089 if ( wp_stream_is_vip() && function_exists( 'get_user_attribute' ) ) {
933 1090 return get_user_attribute( $user_id, $meta_key );
934 1091 }
1092 +
935 1093 return get_user_meta( $user_id, $meta_key, $single );
936 1094 }
937 1095
938 1096 /**
@@ -937,19 +1095,20 @@
937 1095
938 1096 /**
939 1097 * Update user meta in a way that is also safe for VIP
940 1098 *
941 - * @param int $user_id
942 - * @param string $meta_key
943 - * @param mixed $meta_value
944 - * @param mixed $prev_value (optional)
1099 + * @param int $user_id User ID.
1100 + * @param string $meta_key Meta key.
1101 + * @param mixed $meta_value Meta value.
1102 + * @param mixed $prev_value Previous meta value being overwritten (optional).
945 1103 *
946 1104 * @return int|bool
947 1105 */
948 - function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
1106 + public function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
949 1107 if ( wp_stream_is_vip() && function_exists( 'update_user_attribute' ) ) {
950 1108 return update_user_attribute( $user_id, $meta_key, $meta_value );
951 1109 }
1110 +
952 1111 return update_user_meta( $user_id, $meta_key, $meta_value, $prev_value );
953 1112 }
954 1113
955 1114 /**
@@ -954,17 +1113,18 @@
954 1113
955 1114 /**
956 1115 * Delete user meta in a way that is also safe for VIP
957 1116 *
958 - * @param int $user_id
959 - * @param string $meta_key
960 - * @param mixed $meta_value (optional)
1117 + * @param int $user_id User ID.
1118 + * @param string $meta_key Meta key.
1119 + * @param mixed $meta_value Meta value (optional).
961 1120 *
962 1121 * @return bool
963 1122 */
964 - function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
1123 + public function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) {
965 1124 if ( wp_stream_is_vip() && function_exists( 'delete_user_attribute' ) ) {
966 1125 return delete_user_attribute( $user_id, $meta_key, $meta_value );
967 1126 }
1127 +
968 1128 return delete_user_meta( $user_id, $meta_key, $meta_value );
969 1129 }
970 1130 }