wp/wp-admin/includes/class-wp-internal-pointers.php
changeset 7 cf61fcea0001
child 9 177826044cd9
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 <?php
       
     2 /**
       
     3  * Administration API: WP_Internal_Pointers class
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Administration
       
     7  * @since 4.4.0
       
     8  */
       
     9 
       
    10 /**
       
    11  * Core class used to implement an internal admin pointers API.
       
    12  *
       
    13  * @since 3.3.0
       
    14  */
       
    15 final class WP_Internal_Pointers {
       
    16 	/**
       
    17 	 * Initializes the new feature pointers.
       
    18 	 *
       
    19 	 * @since 3.3.0
       
    20 	 *
       
    21 	 * All pointers can be disabled using the following:
       
    22 	 *     remove_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts' ) );
       
    23 	 *
       
    24 	 * Individual pointers (e.g. wp390_widgets) can be disabled using the following:
       
    25 	 *     remove_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_wp390_widgets' ) );
       
    26 	 *
       
    27 	 * @static
       
    28 	 *
       
    29 	 * @param string $hook_suffix The current admin page.
       
    30 	 */
       
    31 	public static function enqueue_scripts( $hook_suffix ) {
       
    32 		/*
       
    33 		 * Register feature pointers
       
    34 		 *
       
    35 		 * Format:
       
    36 		 *     array(
       
    37 		 *         hook_suffix => pointer callback
       
    38 		 *     )
       
    39 		 *
       
    40 		 * Example:
       
    41 		 *     array(
       
    42 		 *         'themes.php' => 'wp390_widgets'
       
    43 		 *     )
       
    44 		 */
       
    45 		$registered_pointers = array(
       
    46 			'index.php' => 'wp496_privacy',
       
    47 		);
       
    48 
       
    49 		// Check if screen related pointer is registered
       
    50 		if ( empty( $registered_pointers[ $hook_suffix ] ) )
       
    51 			return;
       
    52 
       
    53 		$pointers = (array) $registered_pointers[ $hook_suffix ];
       
    54 
       
    55 		/*
       
    56 		 * Specify required capabilities for feature pointers
       
    57 		 *
       
    58 		 * Format:
       
    59 		 *     array(
       
    60 		 *         pointer callback => Array of required capabilities
       
    61 		 *     )
       
    62 		 *
       
    63 		 * Example:
       
    64 		 *     array(
       
    65 		 *         'wp390_widgets' => array( 'edit_theme_options' )
       
    66 		 *     )
       
    67 		 */
       
    68 		$caps_required = array(
       
    69 			'wp496_privacy' => array(
       
    70 				'manage_privacy_options',
       
    71 				'export_others_personal_data',
       
    72 				'erase_others_personal_data',
       
    73 			),
       
    74 		);
       
    75 
       
    76 		// Get dismissed pointers
       
    77 		$dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
       
    78 
       
    79 		$got_pointers = false;
       
    80 		foreach ( array_diff( $pointers, $dismissed ) as $pointer ) {
       
    81 			if ( isset( $caps_required[ $pointer ] ) ) {
       
    82 				foreach ( $caps_required[ $pointer ] as $cap ) {
       
    83 					if ( ! current_user_can( $cap ) )
       
    84 						continue 2;
       
    85 				}
       
    86 			}
       
    87 
       
    88 			// Bind pointer print function
       
    89 			add_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_' . $pointer ) );
       
    90 			$got_pointers = true;
       
    91 		}
       
    92 
       
    93 		if ( ! $got_pointers )
       
    94 			return;
       
    95 
       
    96 		// Add pointers script and style to queue
       
    97 		wp_enqueue_style( 'wp-pointer' );
       
    98 		wp_enqueue_script( 'wp-pointer' );
       
    99 	}
       
   100 
       
   101 	/**
       
   102 	 * Print the pointer JavaScript data.
       
   103 	 *
       
   104 	 * @since 3.3.0
       
   105 	 *
       
   106 	 * @static
       
   107 	 *
       
   108 	 * @param string $pointer_id The pointer ID.
       
   109 	 * @param string $selector The HTML elements, on which the pointer should be attached.
       
   110 	 * @param array  $args Arguments to be passed to the pointer JS (see wp-pointer.js).
       
   111 	 */
       
   112 	private static function print_js( $pointer_id, $selector, $args ) {
       
   113 		if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) )
       
   114 			return;
       
   115 
       
   116 		?>
       
   117 		<script type="text/javascript">
       
   118 		(function($){
       
   119 			var options = <?php echo wp_json_encode( $args ); ?>, setup;
       
   120 
       
   121 			if ( ! options )
       
   122 				return;
       
   123 
       
   124 			options = $.extend( options, {
       
   125 				close: function() {
       
   126 					$.post( ajaxurl, {
       
   127 						pointer: '<?php echo $pointer_id; ?>',
       
   128 						action: 'dismiss-wp-pointer'
       
   129 					});
       
   130 				}
       
   131 			});
       
   132 
       
   133 			setup = function() {
       
   134 				$('<?php echo $selector; ?>').first().pointer( options ).pointer('open');
       
   135 			};
       
   136 
       
   137 			if ( options.position && options.position.defer_loading )
       
   138 				$(window).bind( 'load.wp-pointers', setup );
       
   139 			else
       
   140 				$(document).ready( setup );
       
   141 
       
   142 		})( jQuery );
       
   143 		</script>
       
   144 		<?php
       
   145 	}
       
   146 
       
   147 	public static function pointer_wp330_toolbar() {}
       
   148 	public static function pointer_wp330_media_uploader() {}
       
   149 	public static function pointer_wp330_saving_widgets() {}
       
   150 	public static function pointer_wp340_customize_current_theme_link() {}
       
   151 	public static function pointer_wp340_choose_image_from_library() {}
       
   152 	public static function pointer_wp350_media() {}
       
   153 	public static function pointer_wp360_revisions() {}
       
   154 	public static function pointer_wp360_locks() {}
       
   155 	public static function pointer_wp390_widgets() {}
       
   156 	public static function pointer_wp410_dfw() {}
       
   157 
       
   158 	/**
       
   159 	 * Display a pointer for the new privacy tools.
       
   160 	 *
       
   161 	 * @since 4.9.6
       
   162 	 */
       
   163 	public static function pointer_wp496_privacy() {
       
   164 		$content  = '<h3>' . __( 'Personal Data and Privacy' ) . '</h3>';
       
   165 		$content .= '<h4>' . __( 'Personal Data Export and Erasure' ) . '</h4>';
       
   166 		$content .= '<p>' . __( 'New <strong>Tools</strong> have been added to help you with personal data export and erasure requests.' ) . '</p>';
       
   167 		$content .= '<h4>' . __( 'Privacy Policy' ) . '</h4>';
       
   168 		$content .= '<p>' . __( 'Create or select your site&#8217;s privacy policy page under <strong>Settings &gt; Privacy</strong> to keep your users informed and aware.' ) . '</p>';
       
   169 
       
   170 		if ( is_rtl() ) {
       
   171 			$position = array(
       
   172 				'edge'  => 'right',
       
   173 				'align' => 'bottom',
       
   174 			);
       
   175 		} else {
       
   176 			$position = array(
       
   177 				'edge'  => 'left',
       
   178 				'align' => 'bottom',
       
   179 			);
       
   180 		}
       
   181 
       
   182 		$js_args = array(
       
   183 			'content'  => $content,
       
   184 			'position' => $position,
       
   185 			'pointerClass' => 'wp-pointer arrow-bottom',
       
   186 			'pointerWidth' => 420,
       
   187 		);
       
   188 		self::print_js( 'wp496_privacy', '#menu-tools', $js_args );
       
   189 	}
       
   190 
       
   191 	/**
       
   192 	 * Prevents new users from seeing existing 'new feature' pointers.
       
   193 	 *
       
   194 	 * @since 3.3.0
       
   195 	 *
       
   196 	 * @static
       
   197 	 *
       
   198 	 * @param int $user_id User ID.
       
   199 	 */
       
   200 	public static function dismiss_pointers_for_new_users( $user_id ) {
       
   201 		add_user_meta( $user_id, 'dismissed_wp_pointers', 'wp496_privacy' );
       
   202 	}
       
   203 }