|
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’s privacy policy page under <strong>Settings > 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 } |