PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / 2.7.7
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts v2.7.7
2.7.7 2.7.6 2.7.5 2.7.4 trunk 1.3 2.0.4 2.0.6 2.1.91 2.2.4 2.2.7 2.2.9 2.3.1 2.3.10 2.4.10 2.4.2 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.6.0 2.6.1 2.7.0 All 28 releases
← All changes | includes/class.helpers.php +761 -66 2.0.62.7.7 View file →
@@ -1,66 +1,761 @@
1 -<?php
2 -
3 - /**
4 - * Helpers tools
5 - * @author Webcraftic <wordpress.webraftic@gmail.com>
6 - * @copyright (c) 09.11.2017, Webcraftic
7 - * @version 1.0
8 - */
9 - class WINP_Helper {
10 -
11 - private static $meta_options = array();
12 -
13 - /**
14 - * Get meta option
15 - *
16 - * @param int $post_id
17 - * @param string $option_name
18 - * @param mixed $default
19 - * @return bool|int
20 - */
21 - public static function getMetaOption($post_id, $option_name, $default = null)
22 - {
23 - $post_id = (int)$post_id;
24 -
25 - if( !isset(self::$meta_options[$post_id]) || empty(self::$meta_options[$post_id]) ) {
26 - $meta_vals = get_post_meta($post_id, '', true);
27 -
28 - foreach($meta_vals as $name => $val) {
29 - self::$meta_options[$post_id][$name] = $val[0];
30 - }
31 - }
32 -
33 - return isset(self::$meta_options[$post_id][WINP_Plugin::app()->getPrefix() . $option_name])
34 - ? self::$meta_options[$post_id][WINP_Plugin::app()->getPrefix() . $option_name]
35 - : $default;
36 - }
37 -
38 - /**
39 - * Udpdate meta option
40 - *
41 - * @param int $post_id
42 - * @param string $option_name
43 - * @param mixed $option_value
44 - * @return bool|int
45 - */
46 - public static function updateMetaOption($post_id, $option_name, $option_value)
47 - {
48 - $post_id = (int)$post_id;
49 -
50 - return update_post_meta($post_id, WINP_Plugin::app()->getPrefix() . $option_name, $option_value);
51 - }
52 -
53 - /**
54 - * Remove meta option
55 - *
56 - * @param int $post_id
57 - * @param string $option_name
58 - * @return bool|int
59 - */
60 - public static function removeMetaOption($post_id, $option_name)
61 - {
62 - $post_id = (int)$post_id;
63 -
64 - return delete_post_meta($post_id, WINP_Plugin::app()->getPrefix() . $option_name);
65 - }
66 - }
1 +<?php
2 +/**
3 + * Helpers tools
4 + *
5 + * @package Woody_Code_Snippets
6 + */
7 +
8 +// Exit if accessed directly
9 +if ( ! defined( 'ABSPATH' ) ) {
10 + exit;
11 +}
12 +
13 +class WINP_Helper {
14 +
15 + private static $meta_options = [];
16 +
17 + /**
18 + * Get initialized WordPress filesystem instance.
19 + *
20 + * @return WP_Filesystem_Base|false
21 + */
22 + public static function get_wp_filesystem() {
23 + global $wp_filesystem;
24 +
25 + if ( ! function_exists( 'WP_Filesystem' ) ) {
26 + require_once ABSPATH . 'wp-admin/includes/file.php';
27 + }
28 +
29 + WP_Filesystem();
30 +
31 + if ( ! ( $wp_filesystem instanceof WP_Filesystem_Base ) ) {
32 + return false;
33 + }
34 +
35 + return $wp_filesystem;
36 + }
37 +
38 + /**
39 + * @return bool
40 + */
41 + public static function is_safe_mode() {
42 + global $wbcr_inp_safe_mode;
43 +
44 + if ( ! current_user_can( 'manage_options' ) ) {
45 + return false;
46 + }
47 +
48 + if ( $wbcr_inp_safe_mode || isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) {
49 + return true;
50 + }
51 +
52 + return false;
53 + }
54 +
55 + /**
56 + * Enables safe mode, in which the php code will not be executed.
57 + */
58 + public static function enable_safe_mode() {
59 + global $wbcr_inp_safe_mode;
60 +
61 + if ( ! current_user_can( 'manage_options' ) ) {
62 + return false;
63 + }
64 +
65 + if ( ( ! $wbcr_inp_safe_mode || ! isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) ) {
66 + $wbcr_inp_safe_mode = true;
67 + setcookie( 'wbcr-php-snippets-safe-mode', 1, time() + 3600, '/' );
68 +
69 + return true;
70 + }
71 +
72 + return false;
73 + }
74 +
75 + /**
76 + * Disable safe mode, in which the php code will not be executed.
77 + */
78 + public static function disable_safe_mode() {
79 + global $wbcr_inp_safe_mode;
80 +
81 + if ( ! current_user_can( 'manage_options' ) ) {
82 + return false;
83 + }
84 +
85 + if ( $wbcr_inp_safe_mode || isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) {
86 + $wbcr_inp_safe_mode = false;
87 +
88 + unset( $_COOKIE['wbcr-php-snippets-safe-mode'] );
89 +
90 + setcookie( 'wbcr-php-snippets-safe-mode', null, - 1, '/' );
91 + setcookie( 'wbcr-php-snippets-safe-mode', null, - 1, '/wp-admin' );
92 +
93 + return true;
94 + }
95 +
96 + return false;
97 + }
98 +
99 + /**
100 + * Gets and verified available attributes for snippets shortcodes.
101 + *
102 + * @param bool $tinymce
103 + *
104 + * @return mixed|void
105 + */
106 + public static function get_shortcode_data( $tinymce = false ) {
107 +
108 + $snippets = get_posts(
109 + [
110 + 'post_type' => WINP_SNIPPETS_POST_TYPE,
111 + 'meta_query' => [
112 + 'relation' => 'AND',
113 + [
114 + 'key' => 'wbcr_inp_snippet_scope',
115 + 'value' => 'shortcode',
116 + ],
117 + [
118 + 'key' => 'wbcr_inp_snippet_activate',
119 + 'value' => 1,
120 + ],
121 + ],
122 + 'post_status' => 'publish',
123 + 'numberposts' => - 1,
124 + ]
125 + );
126 +
127 + $result = [];
128 +
129 + if ( ! empty( $snippets ) ) {
130 + foreach ( (array) $snippets as $snippet ) {
131 + $tag_names = [ 'id' ];
132 + $snippet_type = self::get_snippet_type( $snippet->ID );
133 +
134 + $available_tags = self::getMetaOption( $snippet->ID, 'snippet_tags' );
135 + $available_tags = ! empty( $available_tags ) ? trim( rtrim( $available_tags ) ) : '';
136 +
137 + if ( ! empty( $available_tags ) ) {
138 + $available_tags = array_map( 'trim', explode( ',', $available_tags ) );
139 + $available_tags = array_unique( $available_tags );
140 + } elseif ( $snippet_type !== 'text' && $snippet_type !== 'advert' ) {
141 + $available_tags = [ 'id', 'title' ];
142 + } else {
143 + $available_tags = [ 'id' ];
144 + }
145 +
146 + $tags = [
147 + 'id' => $snippet->ID,
148 + 'type' => $snippet_type,
149 + 'name' => $snippet_type == WINP_SNIPPET_TYPE_UNIVERSAL ? 'wbcr_snippet' : 'wbcr_' . $snippet_type . '_snippet',
150 + 'title' => empty( $snippet->post_title ) ? '(no titled, ID=' . $snippet->ID . ')' : $snippet->post_title,
151 + ];
152 +
153 + if ( ! empty( $available_tags ) ) {
154 + foreach ( (array) $available_tags as $tag ) {
155 + if ( '' != $tag ) {
156 + if ( 'title' == $tag ) {
157 + $tags['title'] = empty( $snippet->post_title ) ? '(no titled, ID=' . $snippet->ID . ')' : $snippet->post_title;
158 + $tag_names[] = 'title';
159 + } elseif ( 'id' != $tag ) {
160 + $tag = preg_replace( '/[^a-zA-Z0-9_\x7f-\xff]/', '', $tag );
161 + $tags[ $tag ] = '';
162 + $tag_names[] = $tag;
163 + }
164 + }
165 + }
166 + }
167 +
168 + $tags['snippet_tags'] = $tag_names;
169 +
170 + $result[] = $tags;
171 + }
172 + }
173 +
174 + return apply_filters( 'wbcr/inp/helper/get_shortcode_data', $result, $tinymce );
175 + }
176 +
177 + /**
178 + * Get snippet type
179 + *
180 + * @param mixed $post_id Post ID.
181 + *
182 + * @return string|false Snippet type string, or false if post is not a valid snippet post type or not found.
183 + */
184 + public static function get_snippet_type( $post_id = null ) {
185 + global $post;
186 +
187 + $_post = $post;
188 +
189 + $snippet_type = WINP_HTTP::get( 'winp_item', WINP_SNIPPET_TYPE_PHP, 'sanitize_key' );
190 + $get_post = WINP_HTTP::get( 'post', '' );
191 +
192 + if ( empty( $post_id ) && ! empty( $get_post ) && ! is_array( $get_post ) ) {
193 + $post_id = esc_attr( $get_post );
194 + }
195 +
196 + if ( ! empty( $post_id ) ) {
197 + $_post = get_post( $post_id );
198 +
199 + // Security: Validate that the post belongs to the snippet post type
200 + // to prevent arbitrary post content execution via shortcodes.
201 + if ( empty( $_post ) || WINP_SNIPPETS_POST_TYPE !== $_post->post_type ) {
202 + return false;
203 + }
204 + }
205 +
206 + if ( ! empty( $_post ) && WINP_SNIPPETS_POST_TYPE === $_post->post_type ) {
207 + $_snippet_type = get_post_meta( $_post->ID, 'wbcr_inp_snippet_type', true );
208 + $snippet_type = $_snippet_type ? $_snippet_type : $snippet_type;
209 + }
210 +
211 + return $snippet_type;
212 + }
213 +
214 + /**
215 + * Checks if the current request is a WP REST API request.
216 + *
217 + * Case #1: After WP_REST_Request initialisation
218 + * Case #2: Support "plain" permalink settings
219 + * Case #3: URL Path begins with wp-json/ (your REST prefix)
220 + * Also supports WP installations in subfolders
221 + *
222 + * @author matzeeable https://wordpress.stackexchange.com/questions/221202/does-something-like-is-rest-exist
223 + * @since 2.1.0
224 + * @return boolean
225 + */
226 + public static function doing_rest_api() {
227 + $prefix = rest_get_url_prefix();
228 + $rest_route = WINP_HTTP::get( 'rest_route', null );
229 + if ( defined( 'REST_REQUEST' ) && REST_REQUEST // (#1)
230 + || ! is_null( $rest_route ) // (#2)
231 + && strpos( trim( $rest_route, '\\/' ), $prefix, 0 ) === 0 ) {
232 + return true;
233 + }
234 +
235 + // (#3)
236 + $rest_url = wp_parse_url( site_url( $prefix ) );
237 + $current_url = wp_parse_url( esc_url( add_query_arg( [] ) ) );
238 +
239 + if ( empty( $rest_url['path'] ) || empty( $current_url['path'] ) ) {
240 + return false;
241 + }
242 +
243 + return strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
244 + }
245 +
246 + /**
247 + * @return bool
248 + * @since 2.1.0
249 + */
250 + public static function doing_ajax() {
251 + if ( function_exists( 'wp_doing_ajax' ) ) {
252 + return wp_doing_ajax();
253 + }
254 +
255 + return defined( 'DOING_AJAX' ) && DOING_AJAX;
256 + }
257 +
258 + /**
259 + * @return bool
260 + * @since 2.1.0
261 + */
262 + public static function doing_cron() {
263 + if ( function_exists( 'wp_doing_cron' ) ) {
264 + return wp_doing_cron();
265 + }
266 +
267 + return defined( 'DOING_CRON' ) && DOING_CRON;
268 + }
269 +
270 + /**
271 + * In the new version of the plugin, we moved the code of the snippets
272 + * from the meta data to the post table, to the post_content cell.
273 + *
274 + * If the migration was an error, we need to reliably get the
275 + * snippet code if the post_content cell is empty.
276 + *
277 + * @param WP_Post $post
278 + *
279 + * @return string snippet code
280 + * @since 2.2.1
281 + */
282 + public static function get_snippet_code( $post ) {
283 + if ( empty( $post->post_content ) ) {
284 + return self::getMetaOption( $post->ID, 'snippet_code' );
285 + }
286 +
287 + return $post->post_content;
288 + }
289 +
290 + /**
291 + * Get meta option
292 + *
293 + * @param int $post_id
294 + * @param string $option_name
295 + * @param mixed $default
296 + *
297 + * @return mixed|array
298 + */
299 + public static function getMetaOption( $post_id, $option_name, $default = null ) {
300 + $post_id = (int) $post_id;
301 +
302 + if ( ! isset( self::$meta_options[ $post_id ] ) || empty( self::$meta_options[ $post_id ] ) ) {
303 + $meta_vals = get_post_meta( $post_id, '', true );
304 +
305 + if ( ! empty( $meta_vals ) && is_array( $meta_vals ) ) {
306 + foreach ( $meta_vals as $name => $val ) {
307 + self::$meta_options[ $post_id ][ $name ] = $val[0];
308 + }
309 + }
310 + }
311 +
312 + return isset( self::$meta_options[ $post_id ][ 'wbcr_inp_' . $option_name ] ) ? self::$meta_options[ $post_id ][ 'wbcr_inp_' . $option_name ] : $default;
313 + }
314 +
315 + /**
316 + * Udpdate meta option
317 + *
318 + * @param int $post_id
319 + * @param string $option_name
320 + * @param mixed $option_value
321 + *
322 + * @return bool|int
323 + */
324 + public static function updateMetaOption( $post_id, $option_name, $option_value ) {
325 + $post_id = (int) $post_id;
326 +
327 + return update_post_meta( $post_id, 'wbcr_inp_' . $option_name, $option_value );
328 + }
329 +
330 + /**
331 + * Check capabilities for snippets post type.
332 + *
333 + * @since 2.2.0
334 + */
335 + public static function has_post_capabilities() {
336 + $role = get_role( 'administrator' );
337 +
338 + if ( ! $role ) {
339 + return false;
340 + }
341 +
342 + return $role->has_cap( 'edit_' . WINP_SNIPPETS_POST_TYPE );
343 + }
344 +
345 + /**
346 + * Set capabilities for snippets post type.
347 + *
348 + * @since 2.2.0
349 + */
350 + public static function set_post_capabilities() {
351 + $role = get_role( 'administrator' );
352 +
353 + if ( ! $role ) {
354 + return false;
355 + }
356 +
357 + $role->add_cap( 'edit_' . WINP_SNIPPETS_POST_TYPE );
358 + $role->add_cap( 'read_' . WINP_SNIPPETS_POST_TYPE );
359 + $role->add_cap( 'delete_' . WINP_SNIPPETS_POST_TYPE );
360 + $role->add_cap( 'edit_' . WINP_SNIPPETS_POST_TYPE . 's' );
361 + $role->add_cap( 'edit_others_' . WINP_SNIPPETS_POST_TYPE . 's' );
362 + $role->add_cap( 'publish_' . WINP_SNIPPETS_POST_TYPE . 's' );
363 + $role->add_cap( 'read_private_' . WINP_SNIPPETS_POST_TYPE . 's' );
364 +
365 + return true;
366 + }
367 +
368 + /**
369 + * Create a demo snippets with examples of use
370 + */
371 + public static function create_demo_snippets() {
372 +
373 + update_option( 'wbcr_inp_activate_by_default', 1 );
374 + update_option( 'wbcr_inp_complete_uninstall', 0 );
375 + update_option( 'wbcr_inp_code_editor_theme', 'default' );
376 + update_option( 'wbcr_inp_code_editor_indent_with_tabs', 1 );
377 + update_option( 'wbcr_inp_code_editor_tab_size', 4 );
378 + update_option( 'wbcr_inp_code_editor_indent_unit', 4 );
379 + update_option( 'wbcr_inp_code_editor_wrap_lines', 1 );
380 + update_option( 'wbcr_inp_code_editor_line_numbers', 1 );
381 + update_option( 'wbcr_inp_code_editor_auto_close_brackets', 1 );
382 + update_option( 'wbcr_inp_code_editor_highlight_selection_matches', 0 );
383 +
384 + $posts = [
385 + [
386 + 'post_title' => __( 'Simple universal snippet: Google analytics tracking', 'insert-php' ),
387 + 'post_name' => 'simple-universal-snippet',
388 + 'post_content' => self::get_simple_universal_snippet(),
389 + 'meta' => [
390 + 'type' => WINP_SNIPPET_TYPE_UNIVERSAL,
391 + 'description' => __( 'Google analytics tracking code will be added to all pages before the &lt;/head&gt; tag. Please remember to set the Tracking ID before activating the snippet.', 'insert-php' ),
392 + 'filters' => 'a:1:{i:0;O:8:"stdClass":2:{s:10:"conditions";a:1:{i:0;O:8:"stdClass":2:{s:4:"type";s:5:"scope";s:10:"conditions";a:1:{i:0;O:8:"stdClass":4:{s:5:"param";s:18:"location-some-page";s:8:"operator";s:6:"equals";s:4:"type";s:6:"select";s:5:"value";s:8:"base_web";}}}}s:4:"type";s:6:"showif";}}',
393 + 'tags' => [ 'universal', 'tracking' ],
394 + 'priority' => 10,
395 + ],
396 + ],
397 + [
398 + 'post_title' => __( 'Simple text snippet: What is Lorem Ipsum?', 'insert-php' ),
399 + 'post_name' => 'simple-text-snippet',
400 + 'post_content' => self::get_simple_text_snippet(),
401 + 'meta' => [
402 + 'type' => WINP_SNIPPET_TYPE_TEXT,
403 + 'description' => __( 'This is ordinary maintenance text. With this snippet, you can fill your pages with meaningless English text.', 'insert-php' ),
404 + 'filters' => 'a:1:{i:0;O:8:"stdClass":2:{s:10:"conditions";a:2:{i:0;O:8:"stdClass":2:{s:4:"type";s:5:"scope";s:10:"conditions";a:1:{i:0;O:8:"stdClass":4:{s:5:"param";s:18:"location-some-page";s:8:"operator";s:6:"equals";s:4:"type";s:6:"select";s:5:"value";s:9:"base_sing";}}}i:1;O:8:"stdClass":2:{s:4:"type";s:5:"scope";s:10:"conditions";a:2:{i:0;O:8:"stdClass":4:{s:5:"param";s:18:"location-post-type";s:8:"operator";s:6:"equals";s:4:"type";s:6:"select";s:5:"value";s:4:"post";}i:1;O:8:"stdClass":4:{s:5:"param";s:18:"location-post-type";s:8:"operator";s:6:"equals";s:4:"type";s:6:"select";s:5:"value";s:4:"page";}}}}s:4:"type";s:6:"showif";}}',
405 + 'tags' => [ 'text', 'lorem ipsum' ],
406 + 'priority' => 20,
407 + ],
408 + ],
409 + [
410 + 'post_title' => __( 'Simple php snippet: Disable emojis', 'insert-php' ),
411 + 'post_name' => 'simple-php-snippet',
412 + 'post_content' => self::get_simple_php_snippet(),
413 + 'meta' => [
414 + 'type' => WINP_SNIPPET_TYPE_PHP,
415 + 'description' => __( 'Emojis are little icons used to express ideas or emotions. While these icons are useful, they may not be necessary for your WordPress site. Use this snippet to disable emojis on your site and make it faster.', 'insert-php' ),
416 + 'tags' => [ 'php', 'disable features' ],
417 + 'priority' => 30,
418 + ],
419 + ],
420 + [
421 + 'post_title' => __( 'Add Facebook Pixel to the Order success page', 'insert-php' ),
422 + 'post_name' => 'simple-uni-snippet-for-woocommerce',
423 + 'post_content' => self::get_woo_snippet(),
424 + 'meta' => [
425 + 'type' => WINP_SNIPPET_TYPE_UNIVERSAL,
426 + 'description' => __( 'Add Facebook Pixel to the Order success page.', 'insert-php' ),
427 + 'filters' => 'a:1:{i:0;O:8:"stdClass":2:{s:10:"conditions";a:1:{i:0;O:8:"stdClass":2:{s:4:"type";s:5:"scope";s:10:"conditions";a:1:{i:0;O:8:"stdClass":4:{s:5:"param";s:18:"location-some-page";s:8:"operator";s:6:"equals";s:4:"type";s:6:"select";s:5:"value";s:16:"woo_checkout_pay";}}}}s:4:"type";s:6:"showif";}}',
428 + 'tags' => [ 'woocommerce' ],
429 + 'priority' => 40,
430 + ],
431 + ],
432 + ];
433 +
434 + foreach ( $posts as $post ) {
435 + // '@' here is to hide unexpected output while plugin activation
436 + $post_id = @wp_insert_post(
437 + [
438 + 'post_content' => $post['post_content'],
439 + 'post_title' => $post['post_title'],
440 + 'post_status' => 'publish',
441 + 'post_type' => WINP_SNIPPETS_POST_TYPE,
442 + ]
443 + );
444 +
445 + if ( ! is_wp_error( $post_id ) ) {
446 + if ( isset( $post['meta']['type'] ) ) {
447 + self::updateMetaOption( $post_id, 'snippet_type', $post['meta']['type'] );
448 +
449 + if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_PHP ) {
450 + self::updateMetaOption( $post_id, 'snippet_scope', 'evrywhere' );
451 + }
452 + if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_TEXT ) {
453 + self::updateMetaOption( $post_id, 'snippet_scope', 'shortcode' );
454 + }
455 + if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_UNIVERSAL ) {
456 + self::updateMetaOption( $post_id, 'snippet_scope', 'auto' );
457 + self::updateMetaOption( $post_id, 'snippet_location', 'header' );
458 + }
459 + }
460 +
461 + if ( isset( $post['meta']['description'] ) ) {
462 + self::updateMetaOption( $post_id, 'snippet_description', $post['meta']['description'] );
463 + }
464 +
465 + if ( isset( $post['meta']['filters'] ) && is_serialized( $post['meta']['filters'] ) ) {
466 + $unserialized_filters = unserialize( $post['meta']['filters'] );
467 + self::updateMetaOption( $post_id, 'snippet_filters', $unserialized_filters );
468 + self::updateMetaOption( $post_id, 'changed_filters', 1 );
469 + }
470 +
471 + if ( isset( $post['meta']['tags'] ) && ! empty( $post['meta']['tags'] ) ) {
472 + if ( ! taxonomy_exists( WINP_SNIPPETS_TAXONOMY ) ) {
473 + register_taxonomy( WINP_SNIPPETS_TAXONOMY, WINP_SNIPPETS_POST_TYPE, [] );
474 + }
475 +
476 + wp_set_post_terms( $post_id, $post['meta']['tags'], WINP_SNIPPETS_TAXONOMY, true );
477 + }
478 +
479 + if ( isset( $post['meta']['priority'] ) ) {
480 + self::updateMetaOption( $post_id, 'snippet_priority', $post['meta']['priority'] );
481 + }
482 + }
483 + }
484 +
485 + update_option( 'wbcr_inp_demo_snippets_created', 1 );
486 + }
487 +
488 + /**
489 + * Returns an example php snippet content
490 + *
491 + * @return string
492 + */
493 + protected static function get_simple_php_snippet() {
494 + $output = '/**' . PHP_EOL;
495 + $output .= '* Disable WP 4.2 emoji' . PHP_EOL;
496 + $output .= '*/' . PHP_EOL;
497 + $output .= 'function ace_remove_emoji() {' . PHP_EOL;
498 + $output .= "\tadd_filter( 'emoji_svg_url', '__return_false' );" . PHP_EOL;
499 + $output .= "\tremove_action( 'admin_print_styles', 'print_emoji_styles' );" . PHP_EOL;
500 + $output .= "\tremove_action( 'wp_head', 'print_emoji_detection_script', 7 );" . PHP_EOL;
501 + $output .= "\tremove_action( 'admin_print_scripts', 'print_emoji_detection_script' );" . PHP_EOL;
502 + $output .= "\tremove_action( 'wp_print_styles', 'print_emoji_styles' );" . PHP_EOL;
503 + $output .= "\tremove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );" . PHP_EOL;
504 + $output .= "\tremove_filter( 'the_content_feed', 'wp_staticize_emoji' );" . PHP_EOL;
505 + $output .= "\tremove_filter( 'comment_text_rss', 'wp_staticize_emoji' );" . PHP_EOL;
506 + $output .= "\t// filter to remove TinyMCE emojis" . PHP_EOL;
507 + $output .= "\tadd_filter( 'tiny_mce_plugins', 'ace_disable_emoji_tinymce' );" . PHP_EOL;
508 + $output .= '}' . PHP_EOL;
509 + $output .= "add_action( 'init', 'ace_remove_emoji' );" . PHP_EOL;
510 + $output .= '/**' . PHP_EOL;
511 + $output .= '* Remove tinyMCE emoji' . PHP_EOL;
512 + $output .= '*/' . PHP_EOL;
513 + $output .= 'function ace_disable_emoji_tinymce( $plugins ) {' . PHP_EOL;
514 + $output .= "\tunset( \$plugins['wpemoji'] );" . PHP_EOL;
515 + $output .= "\treturn \$plugins;" . PHP_EOL;
516 + $output .= '}' . PHP_EOL;
517 +
518 + return $output;
519 + }
520 +
521 + /**
522 + * Returns an example of the content of a text snippet.
523 + *
524 + * @return string
525 + */
526 + protected static function get_simple_text_snippet() {
527 + $output = '<h3>What is Lorem Ipsum?</h3>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.';
528 + $output .= PHP_EOL . '{{SNIPPET_CONTENT}}' . PHP_EOL;
529 +
530 + return $output;
531 + }
532 +
533 + /**
534 + * Returns an example of the content of a universal snippet.
535 + *
536 + * @return string
537 + */
538 + protected static function get_simple_universal_snippet() {
539 + $output = '<!-- Global Site Tag (gtag.js) - Google Analytics -->' . PHP_EOL;
540 + $output .= '<script async src="https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"></script>' . PHP_EOL;
541 + $output .= '<script>' . PHP_EOL;
542 + $output .= "\twindow.dataLayer = window.dataLayer || [];" . PHP_EOL;
543 + $output .= "\tfunction gtag(){dataLayer.push(arguments);}" . PHP_EOL;
544 + $output .= "\tgtag('js', new Date());" . PHP_EOL;
545 + $output .= "\tgtag('config', 'GA_TRACKING_ID');" . PHP_EOL;
546 + $output .= '</script>' . PHP_EOL;
547 + $output .= '<!-- End global Site Tag (gtag.js) - Google Analytics -->' . PHP_EOL;
548 +
549 + return $output;
550 + }
551 +
552 + /**
553 + * Returns an example of the content of a woocommerce snippet.
554 + *
555 + * @return string
556 + */
557 + protected static function get_woo_snippet() {
558 + $output = <<<'SCRIPT'
559 +<script type="text/javascript">
560 + var pixel_id = ''; // Add you FB pixel ID!
561 + !function (f, b, e, v, n, t, s) {
562 + if (f.fbq) return; n = f.fbq = function () {
563 + n.callMethod ?
564 + n.callMethod.apply(n, arguments) : n.queue.push(arguments)
565 + }; if (!f._fbq) f._fbq = n;
566 + n.push = n; n.loaded = !0; n.version = '2.0'; n.queue = []; t = b.createElement(e); t.async = !0;
567 + t.src = v; s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s)
568 + }(window,document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
569 +
570 + fbq('init', pixel_id);
571 + fbq('track', 'PageView');
572 +</script>
573 +SCRIPT;
574 +
575 + return $output;
576 + }
577 +
578 + /**
579 + * Wrapper for register shortcode
580 + *
581 + * @param $name
582 + * @param $obj
583 + */
584 + /**
585 + * Register a shortcode class
586 + *
587 + * @param string $name Shortcode class name.
588 + * @param object $obj Plugin object.
589 + *
590 + * @return void
591 + */
592 + public static function register_shortcode( $name, $obj ) {
593 + if ( class_exists( $name ) ) {
594 + new $name( $obj );
595 + }
596 + }
597 +
598 + /**
599 + * Render html for purchase button
600 + */
601 + public static function get_purchase_button( $utm_tracking_location = 'snippet-library-page' ) {
602 + $price_url = tsdk_utmify( WINP_UPGRADE, 'upsell_button', $utm_tracking_location );
603 + ?>
604 + <p class="winp-purchase-button">
605 + <a class="button" id="winp-library-buy-button" href="<?php echo esc_url( $price_url ); ?>" target="_blank">
606 + <span><?php _e( 'Upgrade to Pro', 'insert-php' ); ?></span>
607 + </a>
608 + </p>
609 + <?php
610 + }
611 +
612 + /**
613 + * Check if current user is admin or editor
614 + * todo: удалить этот метод, потому что он дублирует функционал WINP_Plugin::app()->current_user_car
615 + *
616 + * @return bool
617 + */
618 + public static function winp_check_user_admin() {
619 + return current_user_can( 'manage_options' ) || current_user_can( 'administrator' );
620 + }
621 +
622 + /*
623 + * Flushes as many page cache plugin's caches as possible.
624 + *
625 + * @return void
626 + */
627 + public static function flush_page_cache() {
628 + if ( function_exists( 'wp_cache_clear_cache' ) ) {
629 + if ( is_multisite() ) {
630 + $blog_id = get_current_blog_id();
631 + wp_cache_clear_cache( $blog_id );
632 + } else {
633 + wp_cache_clear_cache();
634 + }
635 + } elseif ( has_action( 'cachify_flush_cache' ) ) {
636 + do_action( 'cachify_flush_cache' );
637 + } elseif ( function_exists( 'w3tc_pgcache_flush' ) ) {
638 + w3tc_pgcache_flush();
639 + } elseif ( function_exists( 'wp_fast_cache_bulk_delete_all' ) ) {
640 + wp_fast_cache_bulk_delete_all();
641 + } elseif ( class_exists( 'WpFastestCache' ) ) {
642 + $wpfc = new WpFastestCache();
643 + $wpfc->deleteCache();
644 + } elseif ( class_exists( 'c_ws_plugin__qcache_purging_routines' ) ) {
645 + c_ws_plugin__qcache_purging_routines::purge_cache_dir(); // quick cache
646 + } elseif ( class_exists( 'zencache' ) ) {
647 + zencache::clear();
648 + } elseif ( class_exists( 'comet_cache' ) ) {
649 + comet_cache::clear();
650 + } elseif ( class_exists( 'WpeCommon' ) ) {
651 + // WPEngine cache purge/flush methods to call by default
652 + $wpe_methods = [
653 + 'purge_varnish_cache',
654 + ];
655 +
656 + // More agressive clear/flush/purge behind a filter
657 + if ( apply_filters( 'wbcr/factory/flush_wpengine_aggressive', false ) ) {
658 + $wpe_methods = array_merge( $wpe_methods, [ 'purge_memcached', 'clear_maxcdn_cache' ] );
659 + }
660 +
661 + // Filtering the entire list of WpeCommon methods to be called (for advanced usage + easier testing)
662 + $wpe_methods = apply_filters( 'wbcr/factory/wpengine_methods', $wpe_methods );
663 +
664 + foreach ( $wpe_methods as $wpe_method ) {
665 + if ( method_exists( 'WpeCommon', $wpe_method ) ) {
666 + WpeCommon::$wpe_method();
667 + }
668 + }
669 + } elseif ( function_exists( 'sg_cachepress_purge_cache' ) ) {
670 + sg_cachepress_purge_cache();
671 + } elseif ( file_exists( WP_CONTENT_DIR . '/wp-cache-config.php' ) && function_exists( 'prune_super_cache' ) ) {
672 + // fallback for WP-Super-Cache
673 + global $cache_path;
674 + if ( is_multisite() ) {
675 + $blog_id = get_current_blog_id();
676 + prune_super_cache( get_supercache_dir( $blog_id ), true );
677 + prune_super_cache( $cache_path . 'blogs/', true );
678 + } else {
679 + prune_super_cache( $cache_path . 'supercache/', true );
680 + prune_super_cache( $cache_path, true );
681 + }
682 + }
683 + }
684 +
685 + /**
686 + * @param $post WP_Post
687 + *
688 + * @return string
689 + * @since 2.4.0
690 + */
691 + public static function get_where_use_text( $post ) {
692 + global $winp_snippets_locations;
693 + $snippet_scope = self::getMetaOption( $post->ID, 'snippet_scope' );
694 + $result = '';
695 +
696 + if ( $snippet_scope == 'evrywhere' ) {
697 + $result = __( 'Run everywhere', 'insert-php' );
698 + } elseif ( $snippet_scope == 'auto' ) {
699 + $items = $winp_snippets_locations->getList();
700 +
701 + $snippet_location = self::getMetaOption( $post->ID, 'snippet_location', '' );
702 +
703 + if ( ! empty( $snippet_location ) ) {
704 + $text = $items[ $snippet_location ][0] ?? '';
705 + } else {
706 + $text = __( 'Everywhere', 'insert-php' );
707 + }
708 +
709 + $result = esc_html( $text );
710 + } else {
711 + $result = self::get_shortcode_text( $post );
712 + }
713 +
714 + return $result;
715 + }
716 +
717 + /**
718 + * @param $post WP_Post
719 + *
720 + * @return string
721 + */
722 + public static function get_shortcode_text( $post ) {
723 + $snippet_type = self::get_snippet_type( $post->ID );
724 + $snippet_type = ( $snippet_type == WINP_SNIPPET_TYPE_UNIVERSAL ? '' : $snippet_type . '_' );
725 +
726 + return esc_html( apply_filters( 'wbcr/inp/viewtable/where_use', '[wbcr_' . $snippet_type . 'snippet id="' . $post->ID . '"]', $post->ID ) );
727 + }
728 +
729 + /**
730 + * @param $post WP_Post
731 + *
732 + * @return int
733 + */
734 + public static function get_next_snippet_priority() {
735 + global $wpdb;
736 +
737 + $max_priority = $wpdb->get_var(
738 + "
739 + SELECT MAX(CAST(meta_value AS UNSIGNED))
740 + FROM {$wpdb->postmeta}
741 + WHERE meta_key = 'wbcr_inp_snippet_priority'"
742 + );
743 +
744 + if ( is_null( $max_priority ) ) {
745 + $max_priority = 0;
746 + } else {
747 + $max_priority = (int) $max_priority;
748 + }
749 +
750 + return $max_priority + 10;
751 + }
752 +
753 + /**
754 + * @return bool
755 + *
756 + * @since 2.4.0
757 + */
758 + public static function is_woo_active() {
759 + return is_plugin_active( 'woocommerce/woocommerce.php' );
760 + }
761 +}