PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 6.5.4
Jetpack – WP Security, Backup, Speed, & Growth v6.5.4
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / class.jetpack-modules-list-table.php
jetpack Last commit date
3rd-party 7 years ago _inc 1 year ago bin 7 years ago css 7 years ago images 1 year ago json-endpoints 3 years ago languages 7 years ago modules 1 year ago sal 7 years ago scss 7 years ago sync 7 years ago views 8 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 7 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 8 years ago class.jetpack-autoupdate.php 8 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 7 years ago class.jetpack-client-server.php 8 years ago class.jetpack-client.php 7 years ago class.jetpack-connection-banner.php 7 years ago class.jetpack-constants.php 8 years ago class.jetpack-data.php 7 years ago class.jetpack-debugger.php 8 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 7 years ago class.jetpack-idc.php 8 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 8 years ago class.jetpack-modules-list-table.php 8 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 8 years ago class.jetpack-options.php 7 years ago class.jetpack-post-images.php 7 years ago class.jetpack-signature.php 7 years ago class.jetpack-tracks.php 8 years ago class.jetpack-twitter-cards.php 7 years ago class.jetpack-user-agent.php 8 years ago class.jetpack-xmlrpc-server.php 7 years ago class.jetpack.php 7 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 7 years ago class.photon.php 7 years ago composer.json 7 years ago functions.compat.php 7 years ago functions.gallery.php 8 years ago functions.global.php 7 years ago functions.opengraph.php 8 years ago functions.photon.php 8 years ago jetpack.php 1 year ago json-api-config.php 10 years ago json-endpoints.php 8 years ago locales.php 9 years ago phpcs.xml 7 years ago readme.txt 1 year ago require-lib.php 8 years ago uninstall.php 8 years ago wpml-config.xml 10 years ago
class.jetpack-modules-list-table.php
348 lines
1 <?php
2
3 if ( ! class_exists( 'WP_List_Table' ) )
4 require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
5
6 class Jetpack_Modules_List_Table extends WP_List_Table {
7
8 function __construct() {
9 parent::__construct();
10
11 Jetpack::init();
12
13 // In WP 4.2 WP_List_Table will be sanitizing which values are __set()
14 global $wp_version;
15 if ( version_compare( $wp_version, '4.2-z', '>=' ) && $this->compat_fields && is_array( $this->compat_fields ) ) {
16 array_push( $this->compat_fields, 'all_items' );
17 }
18
19 $this->items = $this->all_items = Jetpack_Admin::init()->get_modules();
20 $this->items = $this->filter_displayed_table_items( $this->items );
21 /**
22 * Filters the list of modules available to be displayed in the Jetpack Settings screen.
23 *
24 * @since 3.0.0
25 *
26 * @param array $this->items Array of Jetpack modules.
27 */
28 $this->items = apply_filters( 'jetpack_modules_list_table_items', $this->items );
29 $this->_column_headers = array( $this->get_columns(), array(), array(), 'name' );
30 $modal_info = isset( $_GET['info'] ) ? $_GET['info'] : false;
31
32 wp_register_script(
33 'models.jetpack-modules',
34 Jetpack::get_file_url_for_environment(
35 '_inc/build/jetpack-modules.models.min.js',
36 '_inc/jetpack-modules.models.js'
37 ),
38 array( 'backbone', 'underscore' ),
39 JETPACK__VERSION
40 );
41 wp_register_script(
42 'views.jetpack-modules',
43 Jetpack::get_file_url_for_environment(
44 '_inc/build/jetpack-modules.views.min.js',
45 '_inc/jetpack-modules.views.js'
46 ),
47 array( 'backbone', 'underscore', 'wp-util' ),
48 JETPACK__VERSION
49 );
50 wp_register_script(
51 'jetpack-modules-list-table',
52 Jetpack::get_file_url_for_environment(
53 '_inc/build/jetpack-modules.min.js',
54 '_inc/jetpack-modules.js'
55 ),
56 array(
57 'views.jetpack-modules',
58 'models.jetpack-modules',
59 'jquery',
60 ),
61 JETPACK__VERSION,
62 true
63 );
64
65 wp_localize_script( 'jetpack-modules-list-table', 'jetpackModulesData', array(
66 'modules' => Jetpack::get_translated_modules( $this->all_items ),
67 'i18n' => array(
68 'search_placeholder' => __( 'Search Modules…', 'jetpack' ),
69 ),
70 'modalinfo' => $this->module_info_check( $modal_info, $this->all_items ),
71 'nonces' => array(
72 'bulk' => wp_create_nonce( 'bulk-jetpack_page_jetpack_modules' ),
73 ),
74 ) );
75
76 wp_enqueue_script( 'jetpack-modules-list-table' );
77
78 /**
79 * Filters the js_templates callback value.
80 *
81 * @since 3.6.0
82 *
83 * @param array array( $this, 'js_templates' ) js_templates callback.
84 */
85 add_action( 'admin_footer', apply_filters( 'jetpack_modules_list_table_js_template_callback', array( $this, 'js_templates' ) ), 9 );
86 }
87
88 function js_templates() {
89 ?>
90 <script type="text/html" id="tmpl-Jetpack_Modules_List_Table_Template">
91 <# var i = 0;
92 if ( data.items.length ) {
93 _.each( data.items, function( item, key, list ) {
94 if ( item === undefined ) return;
95 if ( 'manage' == item.module && item.activated ) return; #>
96 <tr class="jetpack-module <# if ( ++i % 2 ) { #> alternate<# } #><# if ( item.activated ) { #> active<# } #><# if ( ! item.available ) { #> unavailable<# } #>" id="{{{ item.module }}}">
97 <th scope="row" class="check-column">
98 <# if ( 'videopress' !== item.module ) { #>
99 <input type="checkbox" name="modules[]" value="{{{ item.module }}}" />
100 <# } #>
101 </th>
102 <td class='name column-name'>
103 <span class='info'><a href="{{{item.learn_more_button}}}" target="blank">{{{ item.name }}}</a></span>
104 <div class="row-actions">
105 <# if ( item.configurable ) { #>
106 <span class='configure'>{{{ item.configurable }}}</span>
107 <# } #>
108 <# if ( item.activated && 'vaultpress' !== item.module && item.available && 'videopress' !== item.module ) { #>
109 <span class='delete'><a href="<?php echo admin_url( 'admin.php' ); ?>?page=jetpack&#038;action=deactivate&#038;module={{{ item.module }}}&#038;_wpnonce={{{ item.deactivate_nonce }}}"><?php _e( 'Deactivate', 'jetpack' ); ?></a></span>
110 <# } else if ( item.available && 'videopress' !== item.module ) { #>
111 <span class='activate'><a href="<?php echo admin_url( 'admin.php' ); ?>?page=jetpack&#038;action=activate&#038;module={{{ item.module }}}&#038;_wpnonce={{{ item.activate_nonce }}}"><?php _e( 'Activate', 'jetpack' ); ?></a></span>
112 <# } #>
113 </div>
114 </td>
115 </tr>
116 <#
117 });
118 } else {
119 #>
120 <tr class="no-modules-found">
121 <td colspan="2"><?php esc_html_e( 'No Modules Found' , 'jetpack' ); ?></td>
122 </tr>
123 <#
124 }
125 #>
126 </script>
127 <?php
128 }
129
130 function get_views() {
131 $modules = Jetpack_Admin::init()->get_modules();
132 $array_of_module_tags = wp_list_pluck( $modules, 'module_tags' );
133 $module_tags = call_user_func_array( 'array_merge', $array_of_module_tags );
134 $module_tags_unique = array_count_values( $module_tags );
135 ksort( $module_tags_unique );
136
137 $format = '<a href="%3$s"%4$s data-title="%1$s">%1$s <span class="count">(%2$s)</span></a>';
138 $title = __( 'All', 'jetpack' );
139 $count = count( $modules );
140 $url = esc_url( remove_query_arg( 'module_tag' ) );
141 $current = empty( $_GET['module_tag'] ) ? ' class="current all"' : ' class="all"';
142 $views = array(
143 'all' => sprintf( $format, $title, $count, $url, $current ),
144 );
145 foreach ( $module_tags_unique as $title => $count ) {
146 if ( 'Jumpstart' == $title ) {
147 continue;
148 }
149 $key = sanitize_title( $title );
150 if ( 'centralized-management' === $key && Jetpack::is_module_active( 'manage' ) ) {
151 continue;
152 }
153 $display_title = esc_html( wptexturize( $title ) );
154 $url = esc_url( add_query_arg( 'module_tag', urlencode( $title ) ) );
155 $current = '';
156 if ( ! empty( $_GET['module_tag'] ) && $title == $_GET['module_tag'] )
157 $current = ' class="current"';
158 $views[ $key ] = sprintf( $format, $display_title, $count, $url, $current );
159 }
160 return $views;
161 }
162
163 function views() {
164 $views = $this->get_views();
165
166 echo "<ul class='subsubsub'>\n";
167 foreach ( $views as $class => $view ) {
168 $views[ $class ] = "\t<li class='$class'>$view</li>";
169 }
170 echo implode( "\n", $views ) . "\n";
171 echo "</ul>";
172 }
173
174 function filter_displayed_table_items( $modules ) {
175 return array_filter( $modules, array( $this, 'is_module_displayed' ) );
176 }
177
178 static function is_module_displayed( $module ) {
179 // Handle module tag based filtering.
180 if ( ! empty( $_REQUEST['module_tag'] ) ) {
181 $module_tag = sanitize_text_field( $_REQUEST['module_tag'] );
182 if ( ! in_array( $module_tag, $module['module_tags'] ) )
183 return false;
184 }
185
186 // If nothing rejected it, include it!
187 return true;
188 }
189
190 static function sort_requires_connection_last( $module1, $module2 ) {
191 if ( $module1['requires_connection'] == $module2['requires_connection'] )
192 return 0;
193 if ( $module1['requires_connection'] )
194 return 1;
195 if ( $module2['requires_connection'] )
196 return -1;
197
198 return 0;
199 }
200
201 function get_columns() {
202 $columns = array(
203 'cb' => '<input type="checkbox" />',
204 'name' => __( 'Name', 'jetpack' ),
205 );
206 return $columns;
207 }
208
209 function get_bulk_actions() {
210 $actions = array(
211 'bulk-activate' => __( 'Activate', 'jetpack' ),
212 'bulk-deactivate' => __( 'Deactivate', 'jetpack' ),
213 );
214 return $actions;
215 }
216
217 function single_row( $item ) {
218 static $i = 0;
219 $row_class = ( ++$i % 2 ) ? ' alternate' : '';
220
221 if ( ! empty( $item['activated'] ) )
222 $row_class .= ' active';
223
224 if ( ! Jetpack_Admin::is_module_available( $item ) ) {
225 $row_class .= ' unavailable';
226 }
227
228 echo '<tr class="jetpack-module' . esc_attr( $row_class ) . '" id="' . esc_attr( $item['module'] ) . '">';
229 $this->single_row_columns( $item );
230 echo '</tr>';
231 }
232
233 function get_table_classes() {
234 return array( 'table', 'table-bordered', 'wp-list-table', 'widefat', 'fixed', 'jetpack-modules' );
235 }
236
237 function column_cb( $item ) {
238 if ( ! Jetpack_Admin::is_module_available( $item ) )
239 return '';
240
241 return sprintf( '<input type="checkbox" name="modules[]" value="%s" />', $item['module'] );
242 }
243
244 function column_icon( $item ) {
245 $badge_text = $free_text = '';
246 ob_start();
247 ?>
248 <a href="#TB_inline?width=600&height=550&inlineId=more-info-module-settings-modal" class="thickbox">
249 <div class="module-image">
250 <p><span class="module-image-badge"><?php echo $badge_text; ?></span><span class="module-image-free" style="display: none"><?php echo $free_text; ?></span></p>
251 </div>
252 </a>
253 <?php
254 return ob_get_clean();
255
256 }
257
258 function column_name( $item ) {
259 $actions = array(
260 'info' => sprintf( '<a href="%s" target="blank">%s</a>', esc_url( $item['learn_more_button'] ), esc_html__( 'Feature Info', 'jetpack' ) ),
261 );
262
263 if ( ! empty( $item['configurable'] ) ) {
264 $actions['configure'] = $item['configurable'];
265 }
266
267 if ( empty( $item['activated'] ) && Jetpack_Admin::is_module_available( $item ) ) {
268 $url = wp_nonce_url(
269 Jetpack::admin_url( array(
270 'page' => 'jetpack',
271 'action' => 'activate',
272 'module' => $item['module'],
273 ) ),
274 'jetpack_activate-' . $item['module']
275 );
276 $actions['activate'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Activate', 'jetpack' ) );
277 } elseif ( ! empty( $item['activated'] ) ) {
278 $url = wp_nonce_url(
279 Jetpack::admin_url( array(
280 'page' => 'jetpack',
281 'action' => 'deactivate',
282 'module' => $item['module'],
283 ) ),
284 'jetpack_deactivate-' . $item['module']
285 );
286 $actions['delete'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Deactivate', 'jetpack' ) );
287 }
288
289 return $this->row_actions( $actions ) . wptexturize( $item['name'] );
290 }
291
292 function column_description( $item ) {
293 ob_start();
294 /** This action is documented in class.jetpack-admin.php */
295 echo apply_filters( 'jetpack_short_module_description', $item['description'], $item['module'] );
296 /** This action is documented in class.jetpack-admin.php */
297 do_action( 'jetpack_learn_more_button_' . $item['module'] );
298 echo '<div id="more-info-' . $item['module'] . '" class="more-info">';
299 /** This action is documented in class.jetpack-admin.php */
300 do_action( 'jetpack_module_more_info_' . $item['module'] );
301 echo '</div>';
302 return ob_get_clean();
303 }
304
305 function column_module_tags( $item ) {
306 $module_tags = array();
307 foreach( $item['module_tags'] as $module_tag ) {
308 $module_tags[] = sprintf( '<a href="%3$s" data-title="%2$s">%1$s</a>', esc_html( $module_tag ), esc_attr( $module_tag ), esc_url( add_query_arg( 'module_tag', urlencode( $module_tag ) ) ) );
309 }
310 return implode( ', ', $module_tags );
311 }
312
313 function column_default( $item, $column_name ) {
314 switch ( $column_name ) {
315 case 'icon':
316 case 'name':
317 case 'description':
318 break;
319 default:
320 return print_r( $item, true );
321 }
322 }
323
324 //Check if the info parameter provided in the URL corresponds to an actual module
325 function module_info_check( $info = false, $modules ) {
326 if ( false == $info ) {
327 return false;
328 } else if ( array_key_exists( $info, $modules ) ) {
329 return $info;
330 }
331 }
332
333 /**
334 * Core switched their `display_tablenav()` method to protected, so we can't access it directly.
335 * Instead, let's include an access function to make it doable without errors!
336 *
337 * @see https://github.com/WordPress/WordPress/commit/d28f6344de97616de8ece543ed290c4ba2383622
338 *
339 * @param string $which
340 *
341 * @return mixed
342 */
343 function unprotected_display_tablenav( $which = 'top' ) {
344 return $this->display_tablenav( $which );
345 }
346
347 }
348