PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 8.5.3
Jetpack – WP Security, Backup, Speed, & Growth v8.5.3
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 6 years ago _inc 6 years ago bin 6 years ago css 6 years ago extensions 1 year ago images 6 years ago json-endpoints 3 years ago languages 6 years ago modules 1 year ago sal 6 years ago src 6 years ago vendor 6 years ago views 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 6 years ago class.frame-nonce-preview.php 6 years ago class.jetpack-admin.php 6 years ago class.jetpack-affiliate.php 6 years ago class.jetpack-autoupdate.php 6 years ago class.jetpack-bbpress-json-api.compat.php 6 years ago class.jetpack-cli.php 6 years ago class.jetpack-client-server.php 6 years ago class.jetpack-connection-banner.php 6 years ago class.jetpack-data.php 6 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 6 years ago class.jetpack-heartbeat.php 6 years ago class.jetpack-idc.php 6 years ago class.jetpack-ixr-client.php 6 years ago class.jetpack-modules-list-table.php 6 years ago class.jetpack-network-sites-list-table.php 6 years ago class.jetpack-network.php 6 years ago class.jetpack-plan.php 6 years ago class.jetpack-post-images.php 6 years ago class.jetpack-twitter-cards.php 6 years ago class.jetpack-user-agent.php 6 years ago class.jetpack-xmlrpc-server.php 6 years ago class.jetpack.php 6 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 6 years ago class.photon.php 6 years ago composer.json 6 years ago functions.compat.php 6 years ago functions.cookies.php 6 years ago functions.gallery.php 6 years ago functions.global.php 6 years ago functions.opengraph.php 6 years ago functions.photon.php 6 years ago jest.config.js 6 years ago jetpack.php 1 year ago json-api-config.php 10 years ago json-endpoints.php 7 years ago load-jetpack.php 6 years ago locales.php 7 years ago readme.txt 1 year ago require-lib.php 6 years ago uninstall.php 6 years ago wpml-config.xml 10 years ago
class.jetpack-modules-list-table.php
357 lines
1 <?php
2
3 use Automattic\Jetpack\Assets;
4
5 if ( ! class_exists( 'WP_List_Table' ) ) {
6 require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
7 }
8
9 class Jetpack_Modules_List_Table extends WP_List_Table {
10
11 function __construct() {
12 parent::__construct();
13
14 Jetpack::init();
15
16 if ( $this->compat_fields && is_array( $this->compat_fields ) ) {
17 array_push( $this->compat_fields, 'all_items' );
18 }
19
20 $this->items = $this->all_items = Jetpack_Admin::init()->get_modules();
21 $this->items = $this->filter_displayed_table_items( $this->items );
22 /**
23 * Filters the list of modules available to be displayed in the Jetpack Settings screen.
24 *
25 * @since 3.0.0
26 *
27 * @param array $this->items Array of Jetpack modules.
28 */
29 $this->items = apply_filters( 'jetpack_modules_list_table_items', $this->items );
30 $this->_column_headers = array( $this->get_columns(), array(), array(), 'name' );
31 $modal_info = isset( $_GET['info'] ) ? $_GET['info'] : false;
32
33 wp_register_script(
34 'models.jetpack-modules',
35 Assets::get_file_url_for_environment(
36 '_inc/build/jetpack-modules.models.min.js',
37 '_inc/jetpack-modules.models.js'
38 ),
39 array( 'backbone', 'underscore' ),
40 JETPACK__VERSION
41 );
42 wp_register_script(
43 'views.jetpack-modules',
44 Assets::get_file_url_for_environment(
45 '_inc/build/jetpack-modules.views.min.js',
46 '_inc/jetpack-modules.views.js'
47 ),
48 array( 'backbone', 'underscore', 'wp-util' ),
49 JETPACK__VERSION
50 );
51 wp_register_script(
52 'jetpack-modules-list-table',
53 Assets::get_file_url_for_environment(
54 '_inc/build/jetpack-modules.min.js',
55 '_inc/jetpack-modules.js'
56 ),
57 array(
58 'views.jetpack-modules',
59 'models.jetpack-modules',
60 'jquery',
61 ),
62 JETPACK__VERSION,
63 true
64 );
65
66 wp_localize_script(
67 'jetpack-modules-list-table',
68 'jetpackModulesData',
69 array(
70 'modules' => Jetpack::get_translated_modules( $this->all_items ),
71 'i18n' => array(
72 'search_placeholder' => __( 'Search Modules…', 'jetpack' ),
73 ),
74 'modalinfo' => $this->module_info_check( $modal_info, $this->all_items ),
75 'nonces' => array(
76 'bulk' => wp_create_nonce( 'bulk-jetpack_page_jetpack_modules' ),
77 ),
78 )
79 );
80
81 wp_enqueue_script( 'jetpack-modules-list-table' );
82
83 /**
84 * Filters the js_templates callback value.
85 *
86 * @since 3.6.0
87 *
88 * @param array array( $this, 'js_templates' ) js_templates callback.
89 */
90 add_action( 'admin_footer', apply_filters( 'jetpack_modules_list_table_js_template_callback', array( $this, 'js_templates' ) ), 9 );
91 }
92
93 function js_templates() {
94 ?>
95 <script type="text/html" id="tmpl-Jetpack_Modules_List_Table_Template">
96 <# var i = 0;
97 if ( data.items.length ) {
98 _.each( data.items, function( item, key, list ) {
99 if ( item === undefined ) return; #>
100 <tr class="jetpack-module <# if ( ++i % 2 ) { #> alternate<# } #><# if ( item.activated ) { #> active<# } #><# if ( ! item.available ) { #> unavailable<# } #>" id="{{{ item.module }}}">
101 <th scope="row" class="check-column">
102 <# if ( 'videopress' !== item.module ) { #>
103 <input type="checkbox" name="modules[]" value="{{{ item.module }}}" />
104 <# } #>
105 </th>
106 <td class='name column-name'>
107 <span class='info'><a href="{{{item.learn_more_button}}}" target="blank">{{{ item.name }}}</a></span>
108 <div class="row-actions">
109 <# if ( item.configurable ) { #>
110 <span class='configure'>{{{ item.configurable }}}</span>
111 <# } #>
112 <# if ( item.activated && 'vaultpress' !== item.module && item.available && 'videopress' !== item.module ) { #>
113 <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>
114 <# } else if ( item.available && 'videopress' !== item.module ) { #>
115 <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>
116 <# } #>
117 </div>
118 </td>
119 </tr>
120 <#
121 });
122 } else {
123 #>
124 <tr class="no-modules-found">
125 <td colspan="2"><?php esc_html_e( 'No Modules Found', 'jetpack' ); ?></td>
126 </tr>
127 <#
128 }
129 #>
130 </script>
131 <?php
132 }
133
134 function get_views() {
135 $modules = Jetpack_Admin::init()->get_modules();
136 $array_of_module_tags = wp_list_pluck( $modules, 'module_tags' );
137 $module_tags = call_user_func_array( 'array_merge', $array_of_module_tags );
138 $module_tags_unique = array_count_values( $module_tags );
139 ksort( $module_tags_unique );
140
141 $format = '<a href="%3$s"%4$s data-title="%1$s">%1$s <span class="count">(%2$s)</span></a>';
142 $title = __( 'All', 'jetpack' );
143 $count = count( $modules );
144 $url = esc_url( remove_query_arg( 'module_tag' ) );
145 $current = empty( $_GET['module_tag'] ) ? ' class="current all"' : ' class="all"';
146 $views = array(
147 'all' => sprintf( $format, $title, $count, $url, $current ),
148 );
149 foreach ( $module_tags_unique as $title => $count ) {
150 $key = sanitize_title( $title );
151 $display_title = esc_html( wptexturize( $title ) );
152 $url = esc_url( add_query_arg( 'module_tag', urlencode( $title ) ) );
153 $current = '';
154 if ( ! empty( $_GET['module_tag'] ) && $title == $_GET['module_tag'] ) {
155 $current = ' class="current"';
156 }
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_displayed( $module ) {
178 // Handle module tag based filtering.
179 if ( ! empty( $_REQUEST['module_tag'] ) ) {
180 $module_tag = sanitize_text_field( $_REQUEST['module_tag'] );
181 if ( ! in_array( $module_tag, $module['module_tags'] ) ) {
182 return false;
183 }
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 }
194 if ( $module1['requires_connection'] ) {
195 return 1;
196 }
197 if ( $module2['requires_connection'] ) {
198 return -1;
199 }
200
201 return 0;
202 }
203
204 function get_columns() {
205 $columns = array(
206 'cb' => '<input type="checkbox" />',
207 'name' => __( 'Name', 'jetpack' ),
208 );
209 return $columns;
210 }
211
212 function get_bulk_actions() {
213 $actions = array(
214 'bulk-activate' => __( 'Activate', 'jetpack' ),
215 'bulk-deactivate' => __( 'Deactivate', 'jetpack' ),
216 );
217 return $actions;
218 }
219
220 function single_row( $item ) {
221 static $i = 0;
222 $row_class = ( ++$i % 2 ) ? ' alternate' : '';
223
224 if ( ! empty( $item['activated'] ) ) {
225 $row_class .= ' active';
226 }
227
228 if ( ! Jetpack_Admin::is_module_available( $item ) ) {
229 $row_class .= ' unavailable';
230 }
231
232 echo '<tr class="jetpack-module' . esc_attr( $row_class ) . '" id="' . esc_attr( $item['module'] ) . '">';
233 $this->single_row_columns( $item );
234 echo '</tr>';
235 }
236
237 function get_table_classes() {
238 return array( 'table', 'table-bordered', 'wp-list-table', 'widefat', 'fixed', 'jetpack-modules' );
239 }
240
241 function column_cb( $item ) {
242 if ( ! Jetpack_Admin::is_module_available( $item ) ) {
243 return '';
244 }
245
246 return sprintf( '<input type="checkbox" name="modules[]" value="%s" />', $item['module'] );
247 }
248
249 function column_icon( $item ) {
250 $badge_text = $free_text = '';
251 ob_start();
252 ?>
253 <a href="#TB_inline?width=600&height=550&inlineId=more-info-module-settings-modal" class="thickbox">
254 <div class="module-image">
255 <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>
256 </div>
257 </a>
258 <?php
259 return ob_get_clean();
260
261 }
262
263 function column_name( $item ) {
264 $actions = array(
265 'info' => sprintf( '<a href="%s" target="blank">%s</a>', esc_url( $item['learn_more_button'] ), esc_html__( 'Feature Info', 'jetpack' ) ),
266 );
267
268 if ( ! empty( $item['configurable'] ) ) {
269 $actions['configure'] = $item['configurable'];
270 }
271
272 if ( empty( $item['activated'] ) && Jetpack_Admin::is_module_available( $item ) ) {
273 $url = wp_nonce_url(
274 Jetpack::admin_url(
275 array(
276 'page' => 'jetpack',
277 'action' => 'activate',
278 'module' => $item['module'],
279 )
280 ),
281 'jetpack_activate-' . $item['module']
282 );
283 $actions['activate'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Activate', 'jetpack' ) );
284 } elseif ( ! empty( $item['activated'] ) ) {
285 $url = wp_nonce_url(
286 Jetpack::admin_url(
287 array(
288 'page' => 'jetpack',
289 'action' => 'deactivate',
290 'module' => $item['module'],
291 )
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 } elseif ( 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