PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 5.8.4
Jetpack – WP Security, Backup, Speed, & Growth v5.8.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 8 years ago _inc 1 year ago bin 8 years ago css 8 years ago images 1 year ago json-endpoints 3 years ago languages 8 years ago modules 1 year ago sal 8 years ago scss 8 years ago sync 8 years ago views 8 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 8 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 8 years ago class.jetpack-autoupdate.php 9 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 8 years ago class.jetpack-client-server.php 8 years ago class.jetpack-client.php 8 years ago class.jetpack-connection-banner.php 8 years ago class.jetpack-constants.php 8 years ago class.jetpack-data.php 9 years ago class.jetpack-debugger.php 8 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 9 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 8 years ago class.jetpack-post-images.php 8 years ago class.jetpack-signature.php 8 years ago class.jetpack-tracks.php 8 years ago class.jetpack-twitter-cards.php 8 years ago class.jetpack-user-agent.php 8 years ago class.jetpack-xmlrpc-server.php 8 years ago class.jetpack.php 8 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 8 years ago class.photon.php 8 years ago composer.json 10 years ago functions.compat.php 9 years ago functions.gallery.php 8 years ago functions.global.php 8 years ago functions.opengraph.php 8 years ago functions.photon.php 9 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 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
357 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 <tr class="jetpack-module <# if ( ++i % 2 ) { #> alternate<# } #><# if ( item.activated ) { #> active<# } #><# if ( ! item.available ) { #> unavailable<# } #>" id="{{{ item.module }}}">
96 <th scope="row" class="check-column">
97 <# if ( 'videopress' !== item.module ) { #>
98 <input type="checkbox" name="modules[]" value="{{{ item.module }}}" />
99 <# } #>
100 </th>
101 <td class='name column-name'>
102 <span class='info'><a href="{{{item.learn_more_button}}}" target="blank">{{{ item.name }}}</a></span>
103 <div class="row-actions">
104 <# if ( item.configurable ) { #>
105 <span class='configure'>{{{ item.configurable }}}</span>
106 <# } #>
107 <# if ( item.activated && 'vaultpress' !== item.module && item.available && 'videopress' !== item.module ) { #>
108 <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>
109 <# } else if ( item.available && 'videopress' !== item.module ) { #>
110 <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>
111 <# } #>
112 </div>
113 </td>
114 </tr>
115 <#
116 });
117 } else {
118 #>
119 <tr class="no-modules-found">
120 <td colspan="2"><?php esc_html_e( 'No Modules Found' , 'jetpack' ); ?></td>
121 </tr>
122 <#
123 }
124 #>
125 </script>
126 <?php
127 }
128
129 function get_views() {
130 $modules = Jetpack_Admin::init()->get_modules();
131 $array_of_module_tags = wp_list_pluck( $modules, 'module_tags' );
132 $module_tags = call_user_func_array( 'array_merge', $array_of_module_tags );
133 $module_tags_unique = array_count_values( $module_tags );
134 ksort( $module_tags_unique );
135
136 $format = '<a href="%3$s"%4$s data-title="%1$s">%1$s <span class="count">(%2$s)</span></a>';
137 $title = __( 'All', 'jetpack' );
138 $count = count( $modules );
139 $url = esc_url( remove_query_arg( 'module_tag' ) );
140 $current = empty( $_GET['module_tag'] ) ? ' class="current all"' : ' class="all"';
141 $views = array(
142 'all' => sprintf( $format, $title, $count, $url, $current ),
143 );
144 foreach ( $module_tags_unique as $title => $count ) {
145 if ( 'Jumpstart' == $title ) {
146 continue;
147 }
148 $key = sanitize_title( $title );
149 if ( 'centralized-management' === $key && Jetpack::is_module_active( 'manage' ) ) {
150 continue;
151 }
152 $display_title = esc_html( wptexturize( $title ) );
153 $url = esc_url( add_query_arg( 'module_tag', urlencode( $title ) ) );
154 $current = '';
155 if ( ! empty( $_GET['module_tag'] ) && $title == $_GET['module_tag'] )
156 $current = ' class="current"';
157 $views[ $key ] = sprintf( $format, $display_title, $count, $url, $current );
158 }
159 return $views;
160 }
161
162 function views() {
163 $views = $this->get_views();
164
165 echo "<ul class='subsubsub'>\n";
166 foreach ( $views as $class => $view ) {
167 $views[ $class ] = "\t<li class='$class'>$view</li>";
168 }
169 echo implode( "\n", $views ) . "\n";
170 echo "</ul>";
171 }
172
173 function filter_displayed_table_items( $modules ) {
174 return array_filter( $modules, array( $this, 'is_module_displayed' ) );
175 }
176
177 static function is_module_available( $module ) {
178 if ( ! is_array( $module ) || empty( $module ) )
179 return false;
180
181 if ( Jetpack::is_development_mode() ) {
182 return ! ( $module['requires_connection'] );
183 } else {
184 return Jetpack::is_active();
185 }
186 }
187
188 static function is_module_displayed( $module ) {
189 // Handle module tag based filtering.
190 if ( ! empty( $_REQUEST['module_tag'] ) ) {
191 $module_tag = sanitize_text_field( $_REQUEST['module_tag'] );
192 if ( ! in_array( $module_tag, $module['module_tags'] ) )
193 return false;
194 }
195
196 // If nothing rejected it, include it!
197 return true;
198 }
199
200 static function sort_requires_connection_last( $module1, $module2 ) {
201 if ( $module1['requires_connection'] == $module2['requires_connection'] )
202 return 0;
203 if ( $module1['requires_connection'] )
204 return 1;
205 if ( $module2['requires_connection'] )
206 return -1;
207
208 return 0;
209 }
210
211 function get_columns() {
212 $columns = array(
213 'cb' => '<input type="checkbox" />',
214 'name' => __( 'Name', 'jetpack' ),
215 );
216 return $columns;
217 }
218
219 function get_bulk_actions() {
220 $actions = array(
221 'bulk-activate' => __( 'Activate', 'jetpack' ),
222 'bulk-deactivate' => __( 'Deactivate', 'jetpack' ),
223 );
224 return $actions;
225 }
226
227 function single_row( $item ) {
228 static $i = 0;
229 $row_class = ( ++$i % 2 ) ? ' alternate' : '';
230
231 if ( ! empty( $item['activated'] ) )
232 $row_class .= ' active';
233
234 if ( ! $this->is_module_available( $item ) )
235 $row_class .= ' unavailable';
236
237 echo '<tr class="jetpack-module' . esc_attr( $row_class ) . '" id="' . esc_attr( $item['module'] ) . '">';
238 $this->single_row_columns( $item );
239 echo '</tr>';
240 }
241
242 function get_table_classes() {
243 return array( 'table', 'table-bordered', 'wp-list-table', 'widefat', 'fixed', 'jetpack-modules' );
244 }
245
246 function column_cb( $item ) {
247 if ( ! $this->is_module_available( $item ) )
248 return '';
249
250 return sprintf( '<input type="checkbox" name="modules[]" value="%s" />', $item['module'] );
251 }
252
253 function column_icon( $item ) {
254 $badge_text = $free_text = '';
255 ob_start();
256 ?>
257 <a href="#TB_inline?width=600&height=550&inlineId=more-info-module-settings-modal" class="thickbox">
258 <div class="module-image">
259 <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>
260 </div>
261 </a>
262 <?php
263 return ob_get_clean();
264
265 }
266
267 function column_name( $item ) {
268 $actions = array(
269 'info' => sprintf( '<a href="%s" target="blank">%s</a>', esc_url( $item['learn_more_button'] ), esc_html__( 'Feature Info', 'jetpack' ) ),
270 );
271
272 if ( ! empty( $item['configurable'] ) ) {
273 $actions['configure'] = $item['configurable'];
274 }
275
276 if ( empty( $item['activated'] ) && $this->is_module_available( $item ) ) {
277 $url = wp_nonce_url(
278 Jetpack::admin_url( array(
279 'page' => 'jetpack',
280 'action' => 'activate',
281 'module' => $item['module'],
282 ) ),
283 'jetpack_activate-' . $item['module']
284 );
285 $actions['activate'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Activate', 'jetpack' ) );
286 } elseif ( ! empty( $item['activated'] ) ) {
287 $url = wp_nonce_url(
288 Jetpack::admin_url( array(
289 'page' => 'jetpack',
290 'action' => 'deactivate',
291 'module' => $item['module'],
292 ) ),
293 'jetpack_deactivate-' . $item['module']
294 );
295 $actions['delete'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Deactivate', 'jetpack' ) );
296 }
297
298 return $this->row_actions( $actions ) . wptexturize( $item['name'] );
299 }
300
301 function column_description( $item ) {
302 ob_start();
303 /** This action is documented in class.jetpack-admin.php */
304 echo apply_filters( 'jetpack_short_module_description', $item['description'], $item['module'] );
305 /** This action is documented in class.jetpack-admin.php */
306 do_action( 'jetpack_learn_more_button_' . $item['module'] );
307 echo '<div id="more-info-' . $item['module'] . '" class="more-info">';
308 /** This action is documented in class.jetpack-admin.php */
309 do_action( 'jetpack_module_more_info_' . $item['module'] );
310 echo '</div>';
311 return ob_get_clean();
312 }
313
314 function column_module_tags( $item ) {
315 $module_tags = array();
316 foreach( $item['module_tags'] as $module_tag ) {
317 $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 ) ) ) );
318 }
319 return implode( ', ', $module_tags );
320 }
321
322 function column_default( $item, $column_name ) {
323 switch ( $column_name ) {
324 case 'icon':
325 case 'name':
326 case 'description':
327 break;
328 default:
329 return print_r( $item, true );
330 }
331 }
332
333 //Check if the info parameter provided in the URL corresponds to an actual module
334 function module_info_check( $info = false, $modules ) {
335 if ( false == $info ) {
336 return false;
337 } else if ( array_key_exists( $info, $modules ) ) {
338 return $info;
339 }
340 }
341
342 /**
343 * Core switched their `display_tablenav()` method to protected, so we can't access it directly.
344 * Instead, let's include an access function to make it doable without errors!
345 *
346 * @see https://github.com/WordPress/WordPress/commit/d28f6344de97616de8ece543ed290c4ba2383622
347 *
348 * @param string $which
349 *
350 * @return mixed
351 */
352 function unprotected_display_tablenav( $which = 'top' ) {
353 return $this->display_tablenav( $which );
354 }
355
356 }
357