PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 3.7.5
Jetpack – WP Security, Backup, Speed, & Growth v3.7.5
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 10 years ago _inc 10 years ago css 10 years ago images 10 years ago json-endpoints 10 years ago languages 10 years ago modules 5 years ago scss 10 years ago views 10 years ago .svnignore 10 years ago changelog.txt 10 years ago class.jetpack-admin.php 10 years ago class.jetpack-autoupdate.php 10 years ago class.jetpack-bbpress-json-api-compat.php 10 years ago class.jetpack-cli.php 10 years ago class.jetpack-client-server.php 10 years ago class.jetpack-client.php 10 years ago class.jetpack-data.php 10 years ago class.jetpack-debugger.php 10 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 10 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 10 years ago class.jetpack-modules-list-table.php 10 years ago class.jetpack-network-sites-list-table.php 10 years ago class.jetpack-network.php 10 years ago class.jetpack-options.php 10 years ago class.jetpack-post-images.php 10 years ago class.jetpack-signature.php 10 years ago class.jetpack-sync.php 10 years ago class.jetpack-twitter-cards.php 10 years ago class.jetpack-user-agent.php 10 years ago class.jetpack-xmlrpc-server.php 10 years ago class.jetpack.php 10 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 10 years ago class.media-extractor.php 10 years ago class.media-summary.php 10 years ago class.photon.php 10 years ago composer.json 10 years ago functions.compat.php 10 years ago functions.gallery.php 10 years ago functions.opengraph.php 10 years ago functions.photon.php 10 years ago jetpack.php 3 years ago json-api-config.php 10 years ago json-endpoints.php 10 years ago locales.php 10 years ago readme.txt 3 years ago require-lib.php 10 years ago uninstall.php 10 years ago wpml-config.xml 10 years ago
class.jetpack-modules-list-table.php
363 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 plugins_url( '_inc/jetpack-modules.models.js', JETPACK__PLUGIN_FILE ),
35 array( 'backbone', 'underscore' ),
36 JETPACK__VERSION
37 );
38 wp_register_script(
39 'views.jetpack-modules',
40 plugins_url( '_inc/jetpack-modules.views.js', JETPACK__PLUGIN_FILE ),
41 array( 'backbone', 'underscore', 'wp-util' ),
42 JETPACK__VERSION
43 );
44 wp_register_script(
45 'jetpack-modules-list-table',
46 plugins_url( '_inc/jetpack-modules.js', JETPACK__PLUGIN_FILE ),
47 array(
48 'views.jetpack-modules',
49 'models.jetpack-modules',
50 'jquery',
51 ),
52 JETPACK__VERSION,
53 true
54 );
55
56 wp_localize_script( 'jetpack-modules-list-table', 'jetpackModulesData', array(
57 'modules' => $this->all_items,
58 'i18n' => array(
59 'search_placeholder' => __( 'Search Modules…', 'jetpack' ),
60 ),
61 'modalinfo' => $this->module_info_check( $modal_info, $this->all_items ),
62 'nonces' => array(
63 'bulk' => wp_create_nonce( 'bulk-jetpack_page_jetpack_modules' ),
64 ),
65 'coreIconAvailable' => Jetpack::jetpack_site_icon_available_in_core(),
66 ) );
67
68 wp_enqueue_script( 'jetpack-modules-list-table' );
69
70 /**
71 * Filters the js_templates callback value.
72 *
73 * @since 3.6.0
74 *
75 * @param array array( $this, 'js_templates' ) js_templates callback.
76 */
77 add_action( 'admin_footer', apply_filters( 'jetpack_modules_list_table_js_template_callback', array( $this, 'js_templates' ) ), 9 );
78 }
79
80 function js_templates() {
81 ?>
82 <script type="text/html" id="tmpl-Jetpack_Modules_List_Table_Template">
83 <# var i = 0;
84 if ( data.items.length ) {
85 _.each( data.items, function( item, key, list ) {
86 if ( item === undefined ) return;
87 if ( jetpackModulesData.coreIconAvailable && 'site-icon' == item.module ) { #>
88 <tr class="jetpack-module deprecated <# if ( ++i % 2 ) { #> alternate<# } #>" id="site-icon-deprecated">
89 <th scope="row" class="check-column">
90 <input type="checkbox" name="modules[]" value="{{{ item.module }}}" disabled />
91 </th>
92 <td class='name column-name'>
93 <span class='info'>{{{ item.name }}}</span>
94 <div class="row-actions">
95 <span class="dep-msg"><?php _ex( 'WordPress now has Site Icon built in!', '"Site Icon" is the feature name.', 'jetpack' ); ?></span>
96 <span class='configure'><a href="<?php esc_html_e( admin_url( 'customize.php?autofocus[control]=site_icon' ), 'jetpack' ); ?>"><?php _e( 'Configure' , 'jetpack' ); ?></a></span>
97 </div>
98 </td>
99 </tr>
100 <# return; } #>
101 <tr class="jetpack-module <# if ( ++i % 2 ) { #> alternate<# } #><# if ( item.activated ) { #> active<# } #><# if ( ! item.available ) { #> unavailable<# } #>" id="{{{ item.module }}}">
102 <th scope="row" class="check-column">
103 <input type="checkbox" name="modules[]" value="{{{ item.module }}}" />
104 </th>
105 <td class='name column-name'>
106 <span class='info'><a href="#">{{{ item.name }}}</a></span>
107 <div class="row-actions">
108 <# if ( item.configurable ) { #>
109 <span class='configure'>{{{ item.configurable }}}</span>
110 <# } #>
111 <# if ( item.activated && 'vaultpress' !== item.module && item.available ) { #>
112 <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>
113 <# } else if ( item.available ) { #>
114 <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>
115 <# } #>
116 </div>
117 </td>
118 </tr>
119 <#
120 });
121 } else {
122 #>
123 <tr class="no-modules-found">
124 <td colspan="2"><?php esc_html_e( 'No Modules Found' , 'jetpack' ); ?></td>
125 </tr>
126 <#
127 }
128 #>
129 </script>
130 <?php
131 }
132
133 function get_views() {
134 $modules = Jetpack_Admin::init()->get_modules();
135 $array_of_module_tags = wp_list_pluck( $modules, 'module_tags' );
136 $module_tags = call_user_func_array( 'array_merge', $array_of_module_tags );
137 $module_tags_unique = array_count_values( $module_tags );
138 ksort( $module_tags_unique );
139
140 $format = '<a href="%3$s"%4$s data-title="%1$s">%1$s <span class="count">(%2$s)</span></a>';
141 $title = __( 'All', 'jetpack' );
142 $count = count( $modules );
143 $url = esc_url( remove_query_arg( 'module_tag' ) );
144 $current = empty( $_GET['module_tag'] ) ? ' class="current all"' : ' class="all"';
145 $views = array(
146 'all' => sprintf( $format, $title, $count, $url, $current ),
147 );
148 foreach ( $module_tags_unique as $title => $count ) {
149 if ( 'Jumpstart' == $title ) {
150 continue;
151 }
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 $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_available( $module ) {
179 if ( ! is_array( $module ) || empty( $module ) )
180 return false;
181
182 if ( Jetpack::is_development_mode() ) {
183 return ! ( $module['requires_connection'] );
184 } else {
185 return Jetpack::is_active();
186 }
187 }
188
189 static function is_module_displayed( $module ) {
190 // Handle module tag based filtering.
191 if ( ! empty( $_REQUEST['module_tag'] ) ) {
192 $module_tag = sanitize_text_field( $_REQUEST['module_tag'] );
193 if ( ! in_array( $module_tag, $module['module_tags'] ) )
194 return false;
195 }
196
197 // If nothing rejected it, include it!
198 return true;
199 }
200
201 static function sort_requires_connection_last( $module1, $module2 ) {
202 if ( $module1['requires_connection'] == $module2['requires_connection'] )
203 return 0;
204 if ( $module1['requires_connection'] )
205 return 1;
206 if ( $module2['requires_connection'] )
207 return -1;
208
209 return 0;
210 }
211
212 function get_columns() {
213 $columns = array(
214 'cb' => '<input type="checkbox" />',
215 'name' => __( 'Name', 'jetpack' ),
216 );
217 return $columns;
218 }
219
220 function get_bulk_actions() {
221 $actions = array(
222 'bulk-activate' => __( 'Activate', 'jetpack' ),
223 'bulk-deactivate' => __( 'Deactivate', 'jetpack' ),
224 );
225 return $actions;
226 }
227
228 function single_row( $item ) {
229 static $i = 0;
230 $row_class = ( ++$i % 2 ) ? ' alternate' : '';
231
232 if ( ! empty( $item['activated'] ) )
233 $row_class .= ' active';
234
235 if ( ! $this->is_module_available( $item ) )
236 $row_class .= ' unavailable';
237
238 echo '<tr class="jetpack-module' . esc_attr( $row_class ) . '" id="' . esc_attr( $item['module'] ) . '">';
239 $this->single_row_columns( $item );
240 echo '</tr>';
241 }
242
243 function get_table_classes() {
244 return array( 'table', 'table-bordered', 'wp-list-table', 'widefat', 'fixed', 'jetpack-modules' );
245 }
246
247 function column_cb( $item ) {
248 if ( ! $this->is_module_available( $item ) )
249 return '';
250
251 return sprintf( '<input type="checkbox" name="modules[]" value="%s" />', $item['module'] );
252 }
253
254 function column_icon( $item ) {
255 $badge_text = $free_text = '';
256 ob_start();
257 ?>
258 <a href="#TB_inline?width=600&height=550&inlineId=more-info-module-settings-modal" class="thickbox">
259 <div class="module-image">
260 <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>
261 </div>
262 </a>
263 <?php
264 return ob_get_clean();
265
266 }
267
268 function column_name( $item ) {
269 $actions = array(
270 'info' => sprintf( '<a href="%s">%s</a>', esc_url( '#' ), esc_html__( 'Module Info', 'jetpack' ) ),
271 );
272
273 if ( ! empty( $item['configurable'] ) ) {
274 $actions['configure'] = $item['configurable'];
275 }
276
277 if ( empty( $item['activated'] ) && $this->is_module_available( $item ) ) {
278 $url = wp_nonce_url(
279 Jetpack::admin_url( array(
280 'page' => 'jetpack',
281 'action' => 'activate',
282 'module' => $item['module'],
283 ) ),
284 'jetpack_activate-' . $item['module']
285 );
286 $actions['activate'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Activate', 'jetpack' ) );
287 } elseif ( ! empty( $item['activated'] ) ) {
288 $url = wp_nonce_url(
289 Jetpack::admin_url( array(
290 'page' => 'jetpack',
291 'action' => 'deactivate',
292 'module' => $item['module'],
293 ) ),
294 'jetpack_deactivate-' . $item['module']
295 );
296 $actions['delete'] = sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html__( 'Deactivate', 'jetpack' ) );
297 }
298
299 return $this->row_actions( $actions ) . wptexturize( $item['name'] );
300 }
301
302 function column_description( $item ) {
303 ob_start();
304 /** This action is documented in class.jetpack-admin.php */
305 echo apply_filters( 'jetpack_short_module_description', $item['description'], $item['module'] );
306 /** This action is documented in class.jetpack-admin.php */
307 do_action( 'jetpack_learn_more_button_' . $item['module'] );
308 echo '<div id="more-info-' . $item['module'] . '" class="more-info">';
309 if ( Jetpack::is_active() && has_action( 'jetpack_module_more_info_connected_' . $item['module'] ) ) {
310 /** This action is documented in class.jetpack-admin.php */
311 do_action( 'jetpack_module_more_info_connected_' . $item['module'] );
312 } else {
313 /** This action is documented in class.jetpack-admin.php */
314 do_action( 'jetpack_module_more_info_' . $item['module'] );
315 }
316 echo '</div>';
317 return ob_get_clean();
318 }
319
320 function column_module_tags( $item ) {
321 $module_tags = array();
322 foreach( $item['module_tags'] as $module_tag ) {
323 $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 ) ) ) );
324 }
325 return implode( ', ', $module_tags );
326 }
327
328 function column_default( $item, $column_name ) {
329 switch ( $column_name ) {
330 case 'icon':
331 case 'name':
332 case 'description':
333 break;
334 default:
335 return print_r( $item, true );
336 }
337 }
338
339 //Check if the info parameter provided in the URL corresponds to an actual module
340 function module_info_check( $info = false, $modules ) {
341 if ( false == $info ) {
342 return false;
343 } else if ( array_key_exists( $info, $modules ) ) {
344 return $info;
345 }
346 }
347
348 /**
349 * Core switched their `display_tablenav()` method to protected, so we can't access it directly.
350 * Instead, let's include an access function to make it doable without errors!
351 *
352 * @see https://github.com/WordPress/WordPress/commit/d28f6344de97616de8ece543ed290c4ba2383622
353 *
354 * @param string $which
355 *
356 * @return mixed
357 */
358 function unprotected_display_tablenav( $which = 'top' ) {
359 return $this->display_tablenav( $which );
360 }
361
362 }
363