PluginProbe
Essential Widgets / 1.8
Essential Widgets v1.8
3.2.1 3.3 3.2 trunk 1.0.0 1.0.1 1.1 1.2 1.2.1 1.2.2 1.3 1.4 1.4.1 1.5 1.6 1.7 1.7.1 1.7.2 1.7.3 1.7.4 1.8 1.9 2.0 2.1 2.2 All 31 releases
essential-widgets / includes / CatchThemesThemePlugin.php

CatchThemesThemePlugin.php in Essential Widgets 1.8, at includes/CatchThemesThemePlugin.php

485 lines 16.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class CatchThemesThemePlugin {
4 public function __construct() {
5 remove_action( 'wp_ajax_query-themes', array( $this, 'wp_ajax_query_themes' ), 1 );
6 add_action( 'wp_ajax_query-themes', array( $this, 'wp_ajax_custom_query_themes' ), 1 );
7
8 add_action( 'admin_enqueue_scripts', array( $this, 'our_themes_script' ) );
9
10 if ( ! is_multisite() ) {
11 add_action( 'customize_register', array( $this, 'customize_register' ) );
12 }
13
14 global $wp_customize;
15 remove_action( 'wp_ajax_customize_load_themes', array( $wp_customize, 'handle_load_themes_request' ) );
16 add_action( 'wp_ajax_customize_load_themes', array( $this, 'handle_load_themes_request' ) );
17
18 add_filter( 'install_plugins_tabs', array( $this, 'add_our_plugins_tab' ), 1 );
19 add_filter( 'install_plugins_table_api_args_catchplugins', array( $this, 'catchplugins' ), 1 );
20 add_action( 'install_plugins_catchplugins', array( $this, 'plugins_table' ) );
21 }
22
23 /* Adds Catch Themes tab in Add Theme page to show all themes by Catch Themes in wordpress.org
24 * taken from wp-admin/includes/ajax-action.php wp_ajax_query_themes().
25 * Ajax handler for getting themes from themes_api().
26 *
27 * @since 3.9.0
28 *
29 * @global array $themes_allowedtags
30 * @global array $theme_field_defaults
31 */
32 public function wp_ajax_custom_query_themes() {
33 global $themes_allowedtags, $theme_field_defaults;
34
35 if ( ! current_user_can( 'install_themes' ) ) {
36 wp_send_json_error();
37 }
38
39 $args = wp_parse_args(
40 wp_unslash( $_REQUEST['request'] ),
41 array(
42 'per_page' => 20,
43 'fields' => array_merge(
44 (array) $theme_field_defaults,
45 array(
46 'reviews_url' => true, // Explicitly request the reviews URL to be linked from the Add Themes screen.
47 )
48 ),
49 )
50 );
51
52 if ( isset( $args['browse'] ) && 'catchthemes' === $args['browse'] && ! isset( $args['user'] ) ) {
53 $args['author'] = 'catchthemes';
54 unset( $args['browse'] );
55 }
56
57 if ( isset( $args['browse'] ) && 'favorites' === $args['browse'] && ! isset( $args['user'] ) ) {
58 $user = get_user_option( 'wporg_favorites' );
59 if ( $user ) {
60 $args['user'] = $user;
61 }
62 }
63
64 $old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search';
65
66 /** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */
67 $args = apply_filters( 'install_themes_table_api_args_' . $old_filter, $args );
68
69 $api = themes_api( 'query_themes', $args );
70
71 if ( is_wp_error( $api ) ) {
72 wp_send_json_error();
73 }
74
75 $update_php = network_admin_url( 'update.php?action=install-theme' );
76 foreach ( $api->themes as &$theme ) {
77 $theme->install_url = add_query_arg(
78 array(
79 'theme' => $theme->slug,
80 '_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ),
81 ),
82 $update_php
83 );
84
85 if ( current_user_can( 'switch_themes' ) ) {
86 if ( is_multisite() ) {
87 $theme->activate_url = add_query_arg(
88 array(
89 'action' => 'enable',
90 '_wpnonce' => wp_create_nonce( 'enable-theme_' . $theme->slug ),
91 'theme' => $theme->slug,
92 ),
93 network_admin_url( 'themes.php' )
94 );
95 } else {
96 $theme->activate_url = add_query_arg(
97 array(
98 'action' => 'activate',
99 '_wpnonce' => wp_create_nonce( 'switch-theme_' . $theme->slug ),
100 'stylesheet' => $theme->slug,
101 ),
102 admin_url( 'themes.php' )
103 );
104 }
105 }
106
107 if ( ! is_multisite() && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
108 $theme->customize_url = add_query_arg(
109 array(
110 'return' => urlencode( network_admin_url( 'theme-install.php', 'relative' ) ),
111 ),
112 wp_customize_url( $theme->slug )
113 );
114 }
115
116 $theme->name = wp_kses( $theme->name, $themes_allowedtags );
117 $theme->author = wp_kses( $theme->author['display_name'], $themes_allowedtags );
118 $theme->version = wp_kses( $theme->version, $themes_allowedtags );
119 $theme->description = wp_kses( $theme->description, $themes_allowedtags );
120
121 $theme->stars = wp_star_rating(
122 array(
123 'rating' => $theme->rating,
124 'type' => 'percent',
125 'number' => $theme->num_ratings,
126 'echo' => false,
127 )
128 );
129
130 $theme->num_ratings = number_format_i18n( $theme->num_ratings );
131 $theme->preview_url = set_url_scheme( $theme->preview_url );
132 $theme->compatible_wp = is_wp_version_compatible( $theme->requires );
133 $theme->compatible_php = is_php_version_compatible( $theme->requires_php );
134
135 }
136
137 wp_send_json_success( $api );
138 }
139
140 public function our_themes_script( $hook_suffix ) {
141
142 if ( 'theme-install.php' === $hook_suffix ) {
143 wp_enqueue_script( 'our-themes-script', plugin_dir_url( __FILE__ ) . '../js/our-themes.js', array( 'jquery' ), '2018-05-16' );
144 }
145 }
146
147 /* Add Catch Themes Section in Theme in Customizer */
148 public function customize_register( $wp_customize ) {
149 $wp_customize->add_section(
150 new WP_Customize_Themes_Section(
151 $wp_customize,
152 'catchthemes',
153 array(
154 'title' => __( 'Themes by CatchThemes', 'catch-themes-demo-import' ),
155 'action' => 'catchthemes',
156 'capability' => 'install_themes',
157 'panel' => 'themes',
158 'priority' => 6,
159 )
160 )
161 );
162 }
163
164
165
166
167 /**
168 * Load themes into the theme browsing/installation UI.
169 * taken from wp-includes/cllass-wp-customize-manager.php
170 * @since 4.9.0
171 */
172 public function handle_load_themes_request() {
173 check_ajax_referer( 'switch_themes', 'nonce' );
174 if ( ! current_user_can( 'switch_themes' ) ) {
175 wp_die( -1 );
176 }
177
178 if ( empty( $_POST['theme_action'] ) ) {
179 wp_send_json_error( 'missing_theme_action' );
180 }
181 $theme_action = sanitize_key( $_POST['theme_action'] );
182 $themes = array();
183 $args = array();
184
185 // Define query filters based on user input.
186 if ( ! array_key_exists( 'search', $_POST ) ) {
187 $args['search'] = '';
188 } else {
189 $args['search'] = sanitize_text_field( wp_unslash( $_POST['search'] ) );
190 }
191
192 if ( ! array_key_exists( 'tags', $_POST ) ) {
193 $args['tag'] = '';
194 } else {
195 $args['tag'] = array_map( 'sanitize_text_field', wp_unslash( (array) $_POST['tags'] ) );
196 }
197
198 if ( ! array_key_exists( 'page', $_POST ) ) {
199 $args['page'] = 1;
200 } else {
201 $args['page'] = absint( $_POST['page'] );
202 }
203
204 require_once ABSPATH . 'wp-admin/includes/theme.php';
205
206 if ( 'installed' === $theme_action ) {
207
208 // Load all installed themes from wp_prepare_themes_for_js().
209 $themes = array( 'themes' => wp_prepare_themes_for_js() );
210 foreach ( $themes['themes'] as &$theme ) {
211 $theme['type'] = 'installed';
212 $theme['active'] = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme['id'] );
213 }
214 } elseif ( 'catchthemes' === $theme_action ) {
215
216 // Load WordPress.org themes from the .org API and normalize data to match installed theme objects.
217 if ( ! current_user_can( 'install_themes' ) ) {
218 wp_die( -1 );
219 }
220
221 // Arguments for all queries.
222 $wporg_args = array(
223 'per_page' => 100,
224 'fields' => array(
225 'reviews_url' => true, // Explicitly request the reviews URL to be linked from the customizer.
226 ),
227 );
228
229 $args = array_merge( $wporg_args, $args );
230
231 if ( '' === $args['search'] && '' === $args['tag'] ) {
232 $args['browse'] = 'new'; // Sort by latest themes by default.
233 }
234
235 $args['author'] = 'catchthemes';
236
237 // Load themes from the .org API.
238 $themes = themes_api( 'query_themes', $args );
239 if ( is_wp_error( $themes ) ) {
240 wp_send_json_error();
241 }
242
243 // This list matches the allowed tags in wp-admin/includes/theme-install.php.
244 $themes_allowedtags = array_fill_keys(
245 array( 'a', 'abbr', 'acronym', 'code', 'pre', 'em', 'strong', 'div', 'p', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img' ),
246 array()
247 );
248 $themes_allowedtags['a'] = array_fill_keys( array( 'href', 'title', 'target' ), true );
249 $themes_allowedtags['acronym']['title'] = true;
250 $themes_allowedtags['abbr']['title'] = true;
251 $themes_allowedtags['img'] = array_fill_keys( array( 'src', 'class', 'alt' ), true );
252
253 // Prepare a list of installed themes to check against before the loop.
254 $installed_themes = array();
255 $wp_themes = wp_get_themes();
256 foreach ( $wp_themes as $theme ) {
257 $installed_themes[] = $theme->get_stylesheet();
258 }
259 $update_php = network_admin_url( 'update.php?action=install-theme' );
260
261 // Set up properties for themes available on WordPress.org.
262 foreach ( $themes->themes as &$theme ) {
263 $theme->install_url = add_query_arg(
264 array(
265 'theme' => $theme->slug,
266 '_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ),
267 ),
268 $update_php
269 );
270
271 $theme->name = wp_kses( $theme->name, $themes_allowedtags );
272 $theme->version = wp_kses( $theme->version, $themes_allowedtags );
273 $theme->description = wp_kses( $theme->description, $themes_allowedtags );
274 $theme->stars = wp_star_rating(
275 array(
276 'rating' => $theme->rating,
277 'type' => 'percent',
278 'number' => $theme->num_ratings,
279 'echo' => false,
280 )
281 );
282 $theme->num_ratings = number_format_i18n( $theme->num_ratings );
283 $theme->preview_url = set_url_scheme( $theme->preview_url );
284
285 // Handle themes that are already installed as installed themes.
286 if ( in_array( $theme->slug, $installed_themes, true ) ) {
287 $theme->type = 'installed';
288 } else {
289 $theme->type = $theme_action;
290 }
291
292 // Set active based on customized theme.
293 $theme->active = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme->slug );
294
295 // Map available theme properties to installed theme properties.
296 $theme->id = $theme->slug;
297 $theme->screenshot = array( $theme->screenshot_url );
298 $theme->authorAndUri = wp_kses( $theme->author['display_name'], $themes_allowedtags );
299 $theme->compatibleWP = is_wp_version_compatible( $theme->requires ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName
300 $theme->compatiblePHP = is_php_version_compatible( $theme->requires_php ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName
301
302 if ( isset( $theme->parent ) ) {
303 $theme->parent = $theme->parent['slug'];
304 } else {
305 $theme->parent = false;
306 }
307 unset( $theme->slug );
308 unset( $theme->screenshot_url );
309 unset( $theme->author );
310 } // End foreach().
311 } elseif ( 'wporg' === $theme_action ) {
312
313 // Load WordPress.org themes from the .org API and normalize data to match installed theme objects.
314 if ( ! current_user_can( 'install_themes' ) ) {
315 wp_die( -1 );
316 }
317
318 // Arguments for all queries.
319 $wporg_args = array(
320 'per_page' => 100,
321 'fields' => array(
322 'reviews_url' => true, // Explicitly request the reviews URL to be linked from the customizer.
323 ),
324 );
325
326 $args = array_merge( $wporg_args, $args );
327
328 if ( '' === $args['search'] && '' === $args['tag'] ) {
329 $args['browse'] = 'new'; // Sort by latest themes by default.
330 }
331
332 // Load themes from the .org API.
333 $themes = themes_api( 'query_themes', $args );
334 if ( is_wp_error( $themes ) ) {
335 wp_send_json_error();
336 }
337
338 // This list matches the allowed tags in wp-admin/includes/theme-install.php.
339 $themes_allowedtags = array_fill_keys(
340 array( 'a', 'abbr', 'acronym', 'code', 'pre', 'em', 'strong', 'div', 'p', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img' ),
341 array()
342 );
343 $themes_allowedtags['a'] = array_fill_keys( array( 'href', 'title', 'target' ), true );
344 $themes_allowedtags['acronym']['title'] = true;
345 $themes_allowedtags['abbr']['title'] = true;
346 $themes_allowedtags['img'] = array_fill_keys( array( 'src', 'class', 'alt' ), true );
347
348 // Prepare a list of installed themes to check against before the loop.
349 $installed_themes = array();
350 $wp_themes = wp_get_themes();
351 foreach ( $wp_themes as $theme ) {
352 $installed_themes[] = $theme->get_stylesheet();
353 }
354 $update_php = network_admin_url( 'update.php?action=install-theme' );
355
356 // Set up properties for themes available on WordPress.org.
357 foreach ( $themes->themes as &$theme ) {
358 $theme->install_url = add_query_arg(
359 array(
360 'theme' => $theme->slug,
361 '_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ),
362 ),
363 $update_php
364 );
365
366 $theme->name = wp_kses( $theme->name, $themes_allowedtags );
367 $theme->version = wp_kses( $theme->version, $themes_allowedtags );
368 $theme->description = wp_kses( $theme->description, $themes_allowedtags );
369 $theme->stars = wp_star_rating(
370 array(
371 'rating' => $theme->rating,
372 'type' => 'percent',
373 'number' => $theme->num_ratings,
374 'echo' => false,
375 )
376 );
377 $theme->num_ratings = number_format_i18n( $theme->num_ratings );
378 $theme->preview_url = set_url_scheme( $theme->preview_url );
379
380 // Handle themes that are already installed as installed themes.
381 if ( in_array( $theme->slug, $installed_themes, true ) ) {
382 $theme->type = 'installed';
383 } else {
384 $theme->type = $theme_action;
385 }
386
387 // Set active based on customized theme.
388 $theme->active = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme->slug );
389
390 // Map available theme properties to installed theme properties.
391 $theme->id = $theme->slug;
392 $theme->screenshot = array( $theme->screenshot_url );
393 $theme->authorAndUri = wp_kses( $theme->author['display_name'], $themes_allowedtags );
394 $theme->compatibleWP = is_wp_version_compatible( $theme->requires ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName
395 $theme->compatiblePHP = is_php_version_compatible( $theme->requires_php ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName
396
397 if ( isset( $theme->parent ) ) {
398 $theme->parent = $theme->parent['slug'];
399 } else {
400 $theme->parent = false;
401 }
402 unset( $theme->slug );
403 unset( $theme->screenshot_url );
404 unset( $theme->author );
405 } // End foreach().
406 } // End if().
407
408 /**
409 * Filters the theme data loaded in the customizer.
410 *
411 * This allows theme data to be loading from an external source,
412 * or modification of data loaded from `wp_prepare_themes_for_js()`
413 * or WordPress.org via `themes_api()`.
414 *
415 * @since 4.9.0
416 *
417 * @see wp_prepare_themes_for_js()
418 * @see themes_api()
419 * @see WP_Customize_Manager::__construct()
420 *
421 * @param array $themes Nested array of theme data.
422 * @param array $args List of arguments, such as page, search term, and tags to query for.
423 * @param WP_Customize_Manager $manager Instance of Customize manager.
424 */
425 $themes = apply_filters( 'customize_load_themes', $themes, $args, $wp_customize );
426
427 wp_send_json_success( $themes );
428 }
429
430 /* Plugins */
431 /* Adds Catch Plugins tab in Add Plugin page to show all plugins by Catch Plugins in wordpress.org */
432 public function add_our_plugins_tab( $tabs ) {
433 // Add our filter here
434 $tabs['catchplugins'] = _x( 'Catch Plugins', 'Plugin Installer' );
435
436 return $tabs;
437 }
438
439 public function catchplugins() {
440 /* From CORE Start */
441 global $paged, $tab;
442 wp_reset_vars( array( 'tab' ) );
443
444 $defined_class = new WP_Plugin_Install_List_Table();
445 $paged = $defined_class->get_pagenum();
446
447 $per_page = 30;
448 //$installed_plugins = catch_get_installed_plugins();
449
450 $args = array(
451 'page' => $paged,
452 'per_page' => $per_page,
453 'fields' => array(
454 'last_updated' => true,
455 'icons' => true,
456 'active_installs' => true,
457 ),
458 // Send the locale and installed plugin slugs to the API so it can provide context-sensitive results.
459 'locale' => get_user_locale(),
460 //'installed_plugins' => array_keys( $installed_plugins ),
461 );
462 /* From CORE End */
463
464 // Add author filter for our plugins
465 $args['author'] = 'catchplugins';
466
467 return $args;
468 }
469
470 public function plugins_table() {
471 global $wp_list_table;
472 printf(
473 '<p class="catch-plugins-list">' . __( 'You can use any of our free plugins or premium plugins from <a href="%s" target="_blank">Catch Plugins</a>' ) . '.</p>',
474 'https://catchplugins.com/'
475 );
476 ?>
477 <form id="plugin-filter" method="post">
478 <?php $wp_list_table->display(); ?>
479 </form>
480 <?php
481 }
482 }
483
484 $catchthemes_theme_plugin = new CatchThemesThemePlugin();
485