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