PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / trunk
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts vtrunk
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 2.7.1 All 27 releases
insert-php / includes / class.helpers.php

class.helpers.php in Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts trunk, at includes/class.helpers.php

762 lines 24.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 }
762