* @package View_Admin_As */ if ( ! defined( 'VIEW_ADMIN_AS_DIR' ) ) { die(); } /** * UI hooks for View Admin As. * * @author Jory Hogeveen * @package View_Admin_As * @since 1.6 * @since 1.7 Renamed from VAA_View_Admin_As_Admin * @version 1.8 * @uses \VAA_View_Admin_As_Base Extends class */ final class VAA_View_Admin_As_UI extends VAA_View_Admin_As_Base { /** * The single instance of the class. * * @since 1.6 * @static * @var \VAA_View_Admin_As_UI */ private static $_instance = null; /** * Plugin links. * * @since 1.6.1 * @var array[] */ private $links = array(); /** * Construct function. * * @since 1.6 * @since 1.6.1 $vaa param * @access protected * @param \VAA_View_Admin_As $vaa The main VAA object. */ protected function __construct( $vaa ) { self::$_instance = $this; parent::__construct( $vaa ); $this->add_action( 'wp_meta', array( $this, 'action_wp_meta' ) ); $this->add_action( 'plugin_row_meta', array( $this, 'action_plugin_row_meta' ), 10, 2 ); $this->add_filter( 'removable_query_args', array( $this, 'filter_removable_query_args' ) ); $this->add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); $this->add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); // @since 1.7.6.1 Add scripts to the customizer container hook. $this->add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); $this->add_filter( 'wp_die_handler', array( $this, 'filter_wp_die_handler' ) ); /** * Compat with front and WP version lower than 4.2.0. * @since 1.6.4 * @link https://developer.wordpress.org/reference/functions/wp_admin_canonical_url/ */ if ( ! is_admin() || ! VAA_API::validate_wp_version( '4.2' ) ) { $this->add_action( 'wp_head', array( $this, 'remove_query_args' ) ); } } /** * Adds a 'View Admin As: Reset view' link to the Meta sidebar widget if the admin bar is hidden. * * @since 1.6.1 * @access public */ public function action_wp_meta() { if ( ! VAA_API::is_toolbar_showing() && $this->store->get_view() ) { $link = __( 'View Admin As', VIEW_ADMIN_AS_DOMAIN ) . ': ' . __( 'Reset view', VIEW_ADMIN_AS_DOMAIN ); $url = VAA_API::get_reset_link(); echo '
  • ' . esc_html( $link ) . '
  • '; } } /** * Show row meta on the plugin screen. * * @since 1.6.1 * @see \WP_Plugins_List_Table::single_row() * @param array[] $links The existing links. * @param string $file The plugin file. * @return array */ public function action_plugin_row_meta( $links, $file ) { if ( VIEW_ADMIN_AS_BASENAME === $file ) { $icon_attr = array( 'style' => array( 'font-size: inherit;', 'line-height: inherit;', 'display: inline;', 'vertical-align: text-top;', ), ); foreach ( $this->get_links() as $id => $link ) { $title = VAA_View_Admin_As_Form::do_icon( $link['icon'], $icon_attr ) . ' ' . esc_html( $link['title'] ); $links[ $id ] = '' . $title . ''; } } return $links; } /** * Plugin links. * * @since 1.6.1 * @since 1.6.2 Added Slack channel link * @return array[] */ public function get_links() { if ( ! empty( $this->links ) ) { return $this->links; } $this->links = array( 'support' => array( 'title' => __( 'Support', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Need support?', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-sos', 'url' => 'https://wordpress.org/support/plugin/view-admin-as/', ), 'slack' => array( 'title' => __( 'Slack', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Quick help via Slack', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-format-chat', 'url' => 'https://keraweb.slack.com/messages/plugin-vaa/', ), 'review' => array( 'title' => __( 'Review', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Give 5 stars on WordPress.org!', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-star-filled', 'url' => 'https://wordpress.org/support/plugin/view-admin-as/reviews/', ), 'translate' => array( 'title' => __( 'Translate', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Help translating this plugin!', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-translation', 'url' => 'https://translate.wordpress.org/projects/wp-plugins/view-admin-as', ), 'issue' => array( 'title' => __( 'Report issue', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Have ideas or a bug report?', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-lightbulb', 'url' => 'https://github.com/JoryHogeveen/view-admin-as/issues', ), 'docs' => array( 'title' => __( 'Documentation', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Documentation', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-book-alt', 'url' => 'https://github.com/JoryHogeveen/view-admin-as/wiki', ), 'github' => array( 'title' => __( 'GitHub', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Follow development on GitHub', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-editor-code', 'url' => 'https://github.com/JoryHogeveen/view-admin-as/tree/dev', ), 'donate' => array( 'title' => __( 'Donate', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Buy me a coffee!', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-smiley', 'url' => 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=YGPLMLU7XQ9E8&lc=US&item_name=View%20Admin%20As&item_number=JWPP%2dVAA¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHostedGuest', ), 'plugins' => array( 'title' => __( 'Plugins', VIEW_ADMIN_AS_DOMAIN ), 'description' => __( 'Check out my other plugins', VIEW_ADMIN_AS_DOMAIN ), 'icon' => 'dashicons-admin-plugins', 'url' => 'https://profiles.wordpress.org/keraweb/#content-plugins', ), ); return $this->links; } /** * Filter the list of query arguments which get removed from admin area URLs in WordPress. * * @since 1.6.4 * @access public * @link https://core.trac.wordpress.org/ticket/23367 * * @param array $args List of removable query arguments. * @return array Updated list of removable query arguments. */ public function filter_removable_query_args( $args ) { return array_merge( $args, array( 'reset-view', 'reset-all-views', 'view_admin_as', '_vaa_nonce', ) ); } /** * Remove query arguments from the url. * Same logic as WP uses since v4.2.0. * * @since 1.6.4 * @see wp_admin_canonical_url() * @return void */ public function remove_query_args() { $removable_query_args = $this->filter_removable_query_args( array() ); if ( empty( $removable_query_args ) ) { return; } $request_uri = $_SERVER['REQUEST_URI']; // @since 1.7.6 Some plugins overwrite `REQUEST_URI` and set it to `ORIG_REQUEST_URI`. if ( ! empty( $_SERVER['ORIG_REQUEST_URI'] ) ) { $request_uri = $_SERVER['ORIG_REQUEST_URI']; } // Ensure we're using an absolute URL. $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $request_uri ); $filtered_url = remove_query_arg( $removable_query_args, $current_url ); ?> store->get_version(); wp_enqueue_style( 'vaa_view_admin_as_style', VIEW_ADMIN_AS_URL . 'assets/css/view-admin-as' . $suffix . '.css', array( 'admin-bar' ), $version ); wp_enqueue_script( 'vaa_view_admin_as_script', VIEW_ADMIN_AS_URL . 'assets/js/view-admin-as' . $suffix . '.js', array( 'jquery', 'admin-bar' ), $version, true // load in footer. ); /** * Add data to the VAA script localization. * @since 1.7 * @param array $array Empty array (Will be overwritten with VAA core data so use unique keys). * @return array */ $script_localization = array_merge( (array) apply_filters( 'view_admin_as_script_localization', array() ), array( // Data. 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'siteurl' => get_site_url(), 'settings' => $this->store->get_settings(), 'settings_user' => $this->store->get_userSettings(), 'view' => $this->store->get_view(), 'view_types' => $this->vaa->controller()->get_view_types(), // Other. '_loader_icon' => VIEW_ADMIN_AS_URL . 'assets/img/loader.gif', '_debug' => ( defined( 'WP_DEBUG' ) ) ? (bool) WP_DEBUG : false, '_vaa_nonce' => $this->store->get_nonce( true ), // i18n. '__no_users_found' => esc_html__( 'No users found.', VIEW_ADMIN_AS_DOMAIN ), '__key_already_exists' => esc_html__( 'Key already exists.', VIEW_ADMIN_AS_DOMAIN ), '__success' => esc_html__( 'Success', VIEW_ADMIN_AS_DOMAIN ), '__confirm' => esc_html__( 'Are you sure?', VIEW_ADMIN_AS_DOMAIN ), '__download' => esc_html__( 'Download', VIEW_ADMIN_AS_DOMAIN ), ) ); wp_localize_script( 'vaa_view_admin_as_script', 'VAA_View_Admin_As', $script_localization ); } /** * Add options to the access denied page when the user has selected a view and did something this view is not allowed. * * @since 1.3 * @since 1.5.1 Check for SSL (Moved to VAA_API). * @since 1.6 More options and better description. * @since 1.7 Moved to this class from main class. * @since 1.8 Renamed from die_handler(). * @access public * @see wp_die() * * @param callable $callback WP die callback. * @return callable $callback WP die callback. */ public function filter_wp_die_handler( $callback ) { // Only do something if a view is selected. if ( ! $this->store->get_view() ) { return $callback; } $options = array(); if ( is_network_admin() ) { $options[] = array( 'text' => __( 'Go to network dashboard', VIEW_ADMIN_AS_DOMAIN ), 'url' => network_admin_url(), ); } else { $options[] = array( 'text' => __( 'Go to dashboard', VIEW_ADMIN_AS_DOMAIN ), 'url' => admin_url(), ); $options[] = array( 'text' => __( 'Go to homepage', VIEW_ADMIN_AS_DOMAIN ), 'url' => get_bloginfo( 'url' ), ); } // Reset url. $options[] = array( 'text' => __( 'Reset the view', VIEW_ADMIN_AS_DOMAIN ), 'url' => VAA_API::get_reset_link(), ); /** * Add or remove options to the die/error handler pages. * * @since 1.6.2 * @param array $options { * Required array of arrays. * @type array { * @type string $text The text to show. * @type string $url The link. * } * } * @return array[] */ $options = apply_filters( 'view_admin_as_error_page_options', $options ); ?>

    :