PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 9.9.1
Jetpack – WP Security, Backup, Speed, & Growth v9.9.1
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 5 years ago _inc 4 years ago css 4 years ago extensions 4 years ago images 5 years ago json-endpoints 4 years ago modules 4 years ago sal 4 years ago src 5 years ago vendor 4 years ago views 5 years ago CHANGELOG.md 4 years ago LICENSE.txt 5 years ago SECURITY.md 5 years ago class-jetpack-connection-status.php 5 years ago class-jetpack-pre-connection-jitms.php 5 years ago class-jetpack-recommendations-banner.php 5 years ago class-jetpack-wizard-banner.php 5 years ago class-jetpack-xmlrpc-methods.php 5 years ago class.frame-nonce-preview.php 6 years ago class.jetpack-admin.php 5 years ago class.jetpack-affiliate.php 6 years ago class.jetpack-autoupdate.php 5 years ago class.jetpack-bbpress-json-api.compat.php 5 years ago class.jetpack-cli.php 4 years ago class.jetpack-client-server.php 5 years ago class.jetpack-connection-banner.php 5 years ago class.jetpack-data.php 5 years ago class.jetpack-gutenberg.php 4 years ago class.jetpack-heartbeat.php 5 years ago class.jetpack-idc.php 4 years ago class.jetpack-ixr-client.php 5 years ago class.jetpack-modules-list-table.php 5 years ago class.jetpack-network-sites-list-table.php 5 years ago class.jetpack-network.php 5 years ago class.jetpack-plan.php 5 years ago class.jetpack-post-images.php 5 years ago class.jetpack-twitter-cards.php 5 years ago class.jetpack-user-agent.php 5 years ago class.jetpack.php 4 years ago class.json-api-endpoints.php 4 years ago class.json-api.php 5 years ago class.photon.php 5 years ago composer.json 4 years ago functions.compat.php 5 years ago functions.cookies.php 5 years ago functions.gallery.php 6 years ago functions.global.php 5 years ago functions.opengraph.php 5 years ago functions.photon.php 5 years ago jest.config.js 5 years ago jetpack.php 4 years ago json-api-config.php 5 years ago json-endpoints.php 7 years ago load-jetpack.php 4 years ago locales.php 7 years ago readme.txt 4 years ago require-lib.php 5 years ago uninstall.php 5 years ago wpml-config.xml 10 years ago
class.jetpack-modules-list-table.php
361 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 /**
21 * Filters the list of modules available to be displayed in the Jetpack Settings screen.
22 *
23 * @since 3.0.0
24 *
25 * @param array $modules Array of Jetpack modules.
26 */
27 $this->all_items = apply_filters( 'jetpack_modules_list_table_items', Jetpack_Admin::init()->get_modules() );
28 $this->items = $this->all_items;
29 $this->items = $this->filter_displayed_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 <# if ( ! item.available ) { #>
118 <span class='unavailable_reason'>{{{ item.unavailable_reason }}}</span>
119 <# } #>
120 </div>
121 </td>
122 </tr>
123 <#
124 });
125 } else {
126 #>
127 <tr class="no-modules-found">
128 <td colspan="2"><?php esc_html_e( 'No Modules Found', 'jetpack' ); ?></td>
129 </tr>
130 <#
131 }
132 #>
133 </script>
134 <?php
135 }
136
137 function get_views() {
138 /** This filter is already documented in class.jetpack-modules-list-table.php */
139 $modules = apply_filters( 'jetpack_modules_list_table_items', Jetpack_Admin::init()->get_modules() );
140 $array_of_module_tags = wp_list_pluck( $modules, 'module_tags' );
141 $module_tags = array_merge( ...array_values( $array_of_module_tags ) );
142 $module_tags_unique = array_count_values( $module_tags );
143 ksort( $module_tags_unique );
144
145 $format = '<a href="%3$s"%4$s data-title="%1$s">%1$s <span class="count">(%2$s)</span></a>';
146 $title = __( 'All', 'jetpack' );
147 $count = count( $modules );
148 $url = esc_url( remove_query_arg( 'module_tag' ) );
149 $current = empty( $_GET['module_tag'] ) ? ' class="current all"' : ' class="all"';
150 $views = array(
151 'all' => sprintf( $format, $title, $count, $url, $current ),
152 );
153 foreach ( $module_tags_unique as $title => $count ) {
154 $key = sanitize_title( $title );
155 $display_title = esc_html( wptexturize( $title ) );
156 $url = esc_url( add_query_arg( 'module_tag', urlencode( $title ) ) );
157 $current = '';
158 if ( ! empty( $_GET['module_tag'] ) && $title == $_GET['module_tag'] ) {
159 $current = ' class="current"';
160 }
161 $views[ $key ] = sprintf( $format, $display_title, $count, $url, $current );
162 }
163 return $views;
164 }
165
166 function views() {
167 $views = $this->get_views();
168
169 echo "<ul class='subsubsub'>\n";
170 foreach ( $views as $class => $view ) {
171 $views[ $class ] = "\t<li class='$class'>$view</li>";
172 }
173 echo implode( "\n", $views ) . "\n";
174 echo '</ul>';
175 }
176
177 function filter_displayed_table_items( $modules ) {
178 return array_filter( $modules, array( $this, 'is_module_displayed' ) );
179 }
180
181 static function is_module_displayed( $module ) {
182 // Handle module tag based filtering.
183 if ( ! empty( $_REQUEST['module_tag'] ) ) {
184 $module_tag = sanitize_text_field( $_REQUEST['module_tag'] );
185 if ( ! in_array( $module_tag, $module['module_tags'] ) ) {
186 return false;
187 }
188 }
189
190 // If nothing rejected it, include it!
191 return true;
192 }
193
194 static function sort_requires_connection_last( $module1, $module2 ) {
195 if ( $module1['requires_connection'] == $module2['requires_connection'] ) {
196 return 0;
197 }
198 if ( $module1['requires_connection'] ) {
199 return 1;
200 }
201 if ( $module2['requires_connection'] ) {
202 return -1;
203 }
204
205 return 0;
206 }
207
208 function get_columns() {
209 $columns = array(
210 'cb' => '<input type="checkbox" />',
211 'name' => __( 'Name', 'jetpack' ),
212 );
213 return $columns;
214 }
215
216 function get_bulk_actions() {
217 $actions = array(
218 'bulk-activate' => __( 'Activate', 'jetpack' ),
219 'bulk-deactivate' => __( 'Deactivate', 'jetpack' ),
220 );
221 return $actions;
222 }
223
224 function single_row( $item ) {
225 static $i = 0;
226 $row_class = ( ++$i % 2 ) ? ' alternate' : '';
227
228 if ( ! empty( $item['activated'] ) ) {
229 $row_class .= ' active';
230 }
231
232 if ( ! Jetpack_Admin::is_module_available( $item ) ) {
233 $row_class .= ' unavailable';
234 }
235
236 echo '<tr class="jetpack-module' . esc_attr( $row_class ) . '" id="' . esc_attr( $item['module'] ) . '">';
237 $this->single_row_columns( $item );
238 echo '</tr>';
239 }
240
241 function get_table_classes() {
242 return array( 'table', 'table-bordered', 'wp-list-table', 'widefat', 'fixed', 'jetpack-modules' );
243 }
244
245 function column_cb( $item ) {
246 if ( ! Jetpack_Admin::is_module_available( $item ) ) {
247 return '';
248 }
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'] ) && Jetpack_Admin::is_module_available( $item ) ) {
277 $url = wp_nonce_url(
278 Jetpack::admin_url(
279 array(
280 'page' => 'jetpack',
281 'action' => 'activate',
282 'module' => $item['module'],
283 )
284 ),
285 'jetpack_activate-' . $item['module']
286 );
287 $actions['activate'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Activate', 'jetpack' ) );
288 } elseif ( ! empty( $item['activated'] ) ) {
289 $url = wp_nonce_url(
290 Jetpack::admin_url(
291 array(
292 'page' => 'jetpack',
293 'action' => 'deactivate',
294 'module' => $item['module'],
295 )
296 ),
297 'jetpack_deactivate-' . $item['module']
298 );
299 $actions['delete'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Deactivate', 'jetpack' ) );
300 }
301
302 return $this->row_actions( $actions ) . wptexturize( $item['name'] );
303 }
304
305 function column_description( $item ) {
306 ob_start();
307 /** This action is documented in class.jetpack-admin.php */
308 echo apply_filters( 'jetpack_short_module_description', $item['description'], $item['module'] );
309 /** This action is documented in class.jetpack-admin.php */
310 do_action( 'jetpack_learn_more_button_' . $item['module'] );
311 echo '<div id="more-info-' . $item['module'] . '" class="more-info">';
312 /** This action is documented in class.jetpack-admin.php */
313 do_action( 'jetpack_module_more_info_' . $item['module'] );
314 echo '</div>';
315 return ob_get_clean();
316 }
317
318 function column_module_tags( $item ) {
319 $module_tags = array();
320 foreach ( $item['module_tags'] as $module_tag ) {
321 $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 ) ) ) );
322 }
323 return implode( ', ', $module_tags );
324 }
325
326 function column_default( $item, $column_name ) {
327 switch ( $column_name ) {
328 case 'icon':
329 case 'name':
330 case 'description':
331 break;
332 default:
333 return print_r( $item, true );
334 }
335 }
336
337 // Check if the info parameter provided in the URL corresponds to an actual module
338 function module_info_check( $info, $modules ) {
339 if ( false == $info ) {
340 return false;
341 } elseif ( array_key_exists( $info, $modules ) ) {
342 return $info;
343 }
344 }
345
346 /**
347 * Core switched their `display_tablenav()` method to protected, so we can't access it directly.
348 * Instead, let's include an access function to make it doable without errors!
349 *
350 * @see https://github.com/WordPress/WordPress/commit/d28f6344de97616de8ece543ed290c4ba2383622
351 *
352 * @param string $which
353 *
354 * @return mixed
355 */
356 function unprotected_display_tablenav( $which = 'top' ) {
357 return $this->display_tablenav( $which );
358 }
359
360 }
361