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