PluginProbe ʕ •ᴥ•ʔ
Catch Scroll Progress Bar / 1.5
Catch Scroll Progress Bar v1.5
trunk 1.0.0 1.1 1.2 1.3 1.4 1.5 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 2.0 2.1 2.2
catch-scroll-progress-bar / includes / CatchThemesThemePlugin.php
catch-scroll-progress-bar / includes Last commit date
CatchThemesThemePlugin.php 4 years ago class-catch-scroll-progress-bar-activator.php 4 years ago class-catch-scroll-progress-bar-deactivator.php 4 years ago class-catch-scroll-progress-bar-i18n.php 4 years ago class-catch-scroll-progress-bar-loader.php 4 years ago class-catch-scroll-progress-bar.php 4 years ago ctp-tabs-removal.php 4 years ago index.php 4 years ago
CatchThemesThemePlugin.php
485 lines
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