PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / 2.4.2
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts v2.4.2
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 2.4.2, at includes/class.helpers.php

803 lines 26.9 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 * @author Webcraftic <wordpress.webraftic@gmail.com>
6 * @copyright (c) 09.11.2017, Webcraftic
7 * @version 1.0
8 */
9
10 // Exit if accessed directly
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit;
13 }
14
15 class WINP_Helper {
16
17 private static $meta_options = [];
18
19 /**
20 * @return bool
21 */
22 public static function is_safe_mode() {
23 global $wbcr_inp_safe_mode;
24
25 if ( ! WINP_Plugin::app()->currentUserCan() ) {
26 return false;
27 }
28
29 if ( $wbcr_inp_safe_mode || isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) {
30 return true;
31 }
32
33 return false;
34 }
35
36 /**
37 * Enables safe mode, in which the php code will not be executed.
38 */
39 public static function enable_safe_mode() {
40 global $wbcr_inp_safe_mode;
41
42 if ( ! WINP_Plugin::app()->currentUserCan() ) {
43 return false;
44 }
45
46 if ( ( ! $wbcr_inp_safe_mode || ! isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) ) {
47 $wbcr_inp_safe_mode = true;
48 setcookie( "wbcr-php-snippets-safe-mode", 1, time() + 3600, '/' );
49
50 return true;
51 }
52
53 return false;
54 }
55
56 /**
57 * Disable safe mode, in which the php code will not be executed.
58 */
59 public static function disable_safe_mode() {
60 global $wbcr_inp_safe_mode;
61
62 if ( ! WINP_Plugin::app()->currentUserCan() ) {
63 return false;
64 }
65
66 if ( $wbcr_inp_safe_mode || isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) {
67 $wbcr_inp_safe_mode = false;
68
69 unset( $_COOKIE['wbcr-php-snippets-safe-mode'] );
70
71 setcookie( 'wbcr-php-snippets-safe-mode', null, - 1, '/' );
72 setcookie( 'wbcr-php-snippets-safe-mode', null, - 1, '/wp-admin' );
73
74 return true;
75 }
76
77 return false;
78 }
79
80 /**
81 * Should show a page about the plugin or not.
82 *
83 * @return bool
84 */
85 public static function is_need_show_about_page() {
86 $need_show_about = (int) get_option( WINP_Plugin::app()->getOptionName( 'what_new_210' ) );
87
88 $is_ajax = WINP_Helper::doing_ajax();
89 $is_cron = WINP_Helper::doing_cron();
90 $is_rest = WINP_Helper::doing_rest_api();
91
92 if ( $need_show_about && ! $is_ajax && ! $is_cron && ! $is_rest ) {
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 'post_type' => WINP_SNIPPETS_POST_TYPE,
110 'meta_query' => [
111 'relation' => 'AND',
112 [
113 'key' => WINP_Plugin::app()->getPrefix() . 'snippet_scope',
114 'value' => 'shortcode'
115 ],
116 [
117 'key' => WINP_Plugin::app()->getPrefix() . 'snippet_activate',
118 'value' => 1
119 ]
120 ],
121 'post_status' => 'publish',
122 'numberposts' => - 1
123 ] );
124
125 $result = [];
126
127 if ( ! empty( $snippets ) ) {
128 foreach ( (array) $snippets as $snippet ) {
129 $tag_names = [ 'id' ];
130 $snippet_type = WINP_Helper::get_snippet_type( $snippet->ID );
131
132 $available_tags = WINP_Helper::getMetaOption( $snippet->ID, 'snippet_tags' );
133 $available_tags = trim( rtrim( $available_tags ) );
134
135 if ( ! empty( $available_tags ) ) {
136 $available_tags = array_map( 'trim', explode( ',', $available_tags ) );
137 $available_tags = array_unique( $available_tags );
138 } else {
139 if ( $snippet_type !== 'text' && $snippet_type !== 'advert' ) {
140 $available_tags = [ 'id', 'title' ];
141 } else {
142 $available_tags = [ 'id' ];
143 }
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 } else if ( '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 null $post_id
181 *
182 * @return array|mixed|string
183 */
184 public static function get_snippet_type( $post_id = null ) {
185 global $post;
186
187 $_post = $post;
188
189 $snippet_type = WINP_Plugin::app()->request->get( 'winp_item', WINP_SNIPPET_TYPE_PHP, 'sanitize_key' );
190 $get_post = WINP_Plugin::app()->request->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
200 if ( ! empty( $_post ) && WINP_SNIPPETS_POST_TYPE === $_post->post_type ) {
201 $_snippet_type = get_post_meta( $_post->ID, WINP_Plugin::app()->getPrefix() . 'snippet_type', true );
202 $snippet_type = $_snippet_type ? $_snippet_type : $snippet_type;
203 }
204
205 return $snippet_type;
206 }
207
208 /**
209 * Checks if the current request is a WP REST API request.
210 *
211 * Case #1: After WP_REST_Request initialisation
212 * Case #2: Support "plain" permalink settings
213 * Case #3: URL Path begins with wp-json/ (your REST prefix)
214 * Also supports WP installations in subfolders
215 *
216 * @author matzeeable https://wordpress.stackexchange.com/questions/221202/does-something-like-is-rest-exist
217 * @since 2.1.0
218 * @return boolean
219 */
220 public static function doing_rest_api() {
221 $prefix = rest_get_url_prefix();
222 $rest_route = WINP_Plugin::app()->request->get( 'rest_route', null );
223 if ( defined( 'REST_REQUEST' ) && REST_REQUEST // (#1)
224 || ! is_null( $rest_route ) // (#2)
225 && strpos( trim( $rest_route, '\\/' ), $prefix, 0 ) === 0 ) {
226 return true;
227 }
228
229 // (#3)
230 $rest_url = wp_parse_url( site_url( $prefix ) );
231 $current_url = wp_parse_url( add_query_arg( [] ) );
232
233 return strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
234 }
235
236 /**
237 * @return bool
238 * @since 2.1.0
239 */
240 public static function doing_ajax() {
241 if ( function_exists( 'wp_doing_ajax' ) ) {
242 return wp_doing_ajax();
243 }
244
245 return defined( 'DOING_AJAX' ) && DOING_AJAX;
246 }
247
248 /**
249 * @return bool
250 * @since 2.1.0
251 */
252 public static function doing_cron() {
253 if ( function_exists( 'wp_doing_cron' ) ) {
254 return wp_doing_cron();
255 }
256
257 return defined( 'DOING_CRON' ) && DOING_CRON;
258 }
259
260 /**
261 * In the new version of the plugin, we moved the code of the snippets
262 * from the meta data to the post table, to the post_content cell.
263 *
264 * If the migration was an error, we need to reliably get the
265 * snippet code if the post_content cell is empty.
266 *
267 * @param WP_Post $post
268 *
269 * @return string snippet code
270 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
271 * @since 2.2.1
272 *
273 */
274 public static function get_snippet_code( $post ) {
275 if ( empty( $post->post_content ) ) {
276 return WINP_Helper::getMetaOption( $post->ID, 'snippet_code' );
277 }
278
279 return $post->post_content;
280 }
281
282 /**
283 * Get meta option
284 *
285 * @param int $post_id
286 * @param string $option_name
287 * @param mixed $default
288 *
289 * @return mixed|array
290 */
291 public static function getMetaOption( $post_id, $option_name, $default = null ) {
292 $post_id = (int) $post_id;
293
294 if ( ! isset( self::$meta_options[ $post_id ] ) || empty( self::$meta_options[ $post_id ] ) ) {
295 $meta_vals = get_post_meta( $post_id, '', true );
296
297 if ( ! empty( $meta_vals ) && is_array( $meta_vals ) ) {
298 foreach ( $meta_vals as $name => $val ) {
299 self::$meta_options[ $post_id ][ $name ] = $val[0];
300 }
301 }
302 }
303
304 return isset( self::$meta_options[ $post_id ][ WINP_Plugin::app()->getPrefix() . $option_name ] ) ? self::$meta_options[ $post_id ][ WINP_Plugin::app()->getPrefix() . $option_name ] : $default;
305 }
306
307 /**
308 * Udpdate meta option
309 *
310 * @param int $post_id
311 * @param string $option_name
312 * @param mixed $option_value
313 *
314 * @return bool|int
315 */
316 public static function updateMetaOption( $post_id, $option_name, $option_value ) {
317 $post_id = (int) $post_id;
318
319 return update_post_meta( $post_id, WINP_Plugin::app()->getPrefix() . $option_name, $option_value );
320 }
321
322 /**
323 * Remove meta option
324 *
325 * @param int $post_id
326 * @param string $option_name
327 *
328 * @return bool|int
329 */
330 public static function removeMetaOption( $post_id, $option_name ) {
331 $post_id = (int) $post_id;
332
333 return delete_post_meta( $post_id, WINP_Plugin::app()->getPrefix() . $option_name );
334 }
335
336 /**
337 * Check capabilities for snippets post type.
338 *
339 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
340 * @since 2.2.0
341 */
342 public static function has_post_capabilities() {
343 $role = get_role( 'administrator' );
344
345 if ( ! $role ) {
346 return false;
347 }
348
349 return $role->has_cap( 'edit_' . WINP_SNIPPETS_POST_TYPE );
350 }
351
352 /**
353 * Set capabilities for snippets post type.
354 *
355 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
356 * @since 2.2.0
357 */
358 public static function set_post_capabilities() {
359 $role = get_role( 'administrator' );
360
361 if ( ! $role ) {
362 return false;
363 }
364
365 $role->add_cap( 'edit_' . WINP_SNIPPETS_POST_TYPE );
366 $role->add_cap( 'read_' . WINP_SNIPPETS_POST_TYPE );
367 $role->add_cap( 'delete_' . WINP_SNIPPETS_POST_TYPE );
368 $role->add_cap( 'edit_' . WINP_SNIPPETS_POST_TYPE . 's' );
369 $role->add_cap( 'edit_others_' . WINP_SNIPPETS_POST_TYPE . 's' );
370 $role->add_cap( 'publish_' . WINP_SNIPPETS_POST_TYPE . 's' );
371 $role->add_cap( 'read_private_' . WINP_SNIPPETS_POST_TYPE . 's' );
372
373 return true;
374 }
375
376 /**
377 * Create a demo snippets with examples of use
378 */
379 public static function create_demo_snippets() {
380
381 update_option( WINP_Plugin::app()->getOptionName( 'activate_by_default' ), 1 );
382 update_option( WINP_Plugin::app()->getOptionName( 'complete_uninstall' ), 0 );
383 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_theme' ), 'default' );
384 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_indent_with_tabs' ), 1 );
385 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_tab_size' ), 4 );
386 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_indent_unit' ), 4 );
387 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_wrap_lines' ), 1 );
388 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_line_numbers' ), 1 );
389 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_auto_close_brackets' ), 1 );
390 update_option( WINP_Plugin::app()->getOptionName( 'code_editor_highlight_selection_matches' ), 0 );
391
392 $posts = [
393 [
394 'post_title' => __( 'Simple universal snippet: Google analytics tracking', 'insert-php' ),
395 'post_name' => 'simple-universal-snippet',
396 'post_content' => self::get_simple_universal_snippet(),
397 'meta' => [
398 'type' => WINP_SNIPPET_TYPE_UNIVERSAL,
399 '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.' ),
400 '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";}}',
401 'tags' => [ 'universal', 'tracking' ],
402 'priority' => 10
403 ]
404 ],
405 [
406 'post_title' => __( 'Simple text snippet: What is Lorem Ipsum?', 'insert-php' ),
407 'post_name' => 'simple-text-snippet',
408 'post_content' => self::get_simple_text_snippet(),
409 'meta' => [
410 'type' => WINP_SNIPPET_TYPE_TEXT,
411 'description' => __( 'This ordinary maintenance text. With this snippet, you can fill your pages with meaningless English text.', 'insert-php' ),
412 '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";}}',
413 'tags' => [ 'text', 'lorem ipsum' ],
414 'priority' => 20
415 ]
416 ],
417 [
418 'post_title' => __( 'Simple php snippet: Disable emojis', 'insert-php' ),
419 'post_name' => 'simple-php-snippet',
420 'post_content' => self::get_simple_php_snippet(),
421 'meta' => [
422 'type' => WINP_SNIPPET_TYPE_PHP,
423 'description' => __( 'Emojis are little icons used to express ideas or emotions. While these icons are fun and all, are they really necessary for your WordPress site? This snippet to disable emojis on your site to make it faster.', 'insert-php' ),
424 'tags' => [ 'php', 'disable features' ],
425 'priority' => 30
426 ]
427 ],
428 [
429 'post_title' => __( 'Add Facebook Pixel to the Order success page', 'insert-php' ),
430 'post_name' => 'simple-uni-snippet-for-woocommerce',
431 'post_content' => self::get_woo_snippet(),
432 'meta' => [
433 'type' => WINP_SNIPPET_TYPE_UNIVERSAL,
434 'description' => __( 'Add Facebook Pixel to the Order success page.', 'insert-php' ),
435 '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";}}',
436 'tags' => [ 'woocommerce' ],
437 'priority' => 40
438 ]
439 ],
440 ];
441
442 foreach ( $posts as $post ) {
443 // '@' here is to hide unexpected output while plugin activation
444 $post_id = @wp_insert_post( [
445 'post_content' => $post['post_content'],
446 'post_title' => $post['post_title'],
447 'post_status' => 'publish',
448 'post_type' => WINP_SNIPPETS_POST_TYPE
449 ] );
450
451 if ( ! is_wp_error( $post_id ) ) {
452 if ( isset( $post['meta']['type'] ) ) {
453 WINP_Helper::updateMetaOption( $post_id, 'snippet_type', $post['meta']['type'] );
454
455 if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_PHP ) {
456 WINP_Helper::updateMetaOption( $post_id, 'snippet_scope', 'evrywhere' );
457 }
458 if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_TEXT ) {
459 WINP_Helper::updateMetaOption( $post_id, 'snippet_scope', 'shortcode' );
460 }
461 if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_UNIVERSAL ) {
462 WINP_Helper::updateMetaOption( $post_id, 'snippet_scope', 'auto' );
463 WINP_Helper::updateMetaOption( $post_id, 'snippet_location', 'header' );
464 }
465 }
466
467 if ( isset( $post['meta']['description'] ) ) {
468 WINP_Helper::updateMetaOption( $post_id, 'snippet_description', $post['meta']['description'] );
469 }
470
471 if ( isset( $post['meta']['filters'] ) && is_serialized( $post['meta']['filters'] ) ) {
472 $unserialized_filters = unserialize( $post['meta']['filters'] );
473 WINP_Helper::updateMetaOption( $post_id, 'snippet_filters', $unserialized_filters );
474 WINP_Helper::updateMetaOption( $post_id, 'changed_filters', 1 );
475 }
476
477 if ( isset( $post['meta']['tags'] ) && ! empty( $post['meta']['tags'] ) ) {
478 if ( ! taxonomy_exists( WINP_SNIPPETS_TAXONOMY ) ) {
479 register_taxonomy( WINP_SNIPPETS_TAXONOMY, WINP_SNIPPETS_POST_TYPE, [] );
480 }
481
482 wp_set_post_terms( $post_id, $post['meta']['tags'], WINP_SNIPPETS_TAXONOMY, true );
483 }
484
485 if ( isset( $post['meta']['priority'] ) ) {
486 WINP_Helper::updateMetaOption( $post_id, 'snippet_priority', $post['meta']['priority'] );
487 }
488 }
489 }
490
491 update_option( WINP_Plugin::app()->getOptionName( 'demo_snippets_created' ), 1 );
492 }
493
494 /**
495 * Returns an example php snippet content
496 *
497 * @return string
498 */
499 protected static function get_simple_php_snippet() {
500 $output = "/**" . PHP_EOL;
501 $output .= "* Disable WP 4.2 emoji" . PHP_EOL;
502 $output .= "*/" . PHP_EOL;
503 $output .= "function ace_remove_emoji() {" . PHP_EOL;
504 $output .= "\tadd_filter( 'emoji_svg_url', '__return_false' );" . PHP_EOL;
505 $output .= "\tremove_action( 'admin_print_styles', 'print_emoji_styles' );" . PHP_EOL;
506 $output .= "\tremove_action( 'wp_head', 'print_emoji_detection_script', 7 );" . PHP_EOL;
507 $output .= "\tremove_action( 'admin_print_scripts', 'print_emoji_detection_script' );" . PHP_EOL;
508 $output .= "\tremove_action( 'wp_print_styles', 'print_emoji_styles' );" . PHP_EOL;
509 $output .= "\tremove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );" . PHP_EOL;
510 $output .= "\tremove_filter( 'the_content_feed', 'wp_staticize_emoji' );" . PHP_EOL;
511 $output .= "\tremove_filter( 'comment_text_rss', 'wp_staticize_emoji' );" . PHP_EOL;
512 $output .= "\t// filter to remove TinyMCE emojis" . PHP_EOL;
513 $output .= "\tadd_filter( 'tiny_mce_plugins', 'ace_disable_emoji_tinymce' );" . PHP_EOL;
514 $output .= "}" . PHP_EOL;
515 $output .= "add_action( 'init', 'ace_remove_emoji' );" . PHP_EOL;
516 $output .= "/**" . PHP_EOL;
517 $output .= "* Remove tinyMCE emoji" . PHP_EOL;
518 $output .= "*/" . PHP_EOL;
519 $output .= "function ace_disable_emoji_tinymce( \$plugins ) {" . PHP_EOL;
520 $output .= "\tunset( \$plugins['wpemoji'] );" . PHP_EOL;
521 $output .= "\treturn \$plugins;" . PHP_EOL;
522 $output .= "}" . PHP_EOL;
523
524 return $output;
525 }
526
527 /**
528 * Returns an example of the content of a text snippet.
529 *
530 * @return string
531 */
532 protected static function get_simple_text_snippet() {
533 $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.';
534 $output .= PHP_EOL . "{{SNIPPET_CONTENT}}" . PHP_EOL;
535
536 return $output;
537 }
538
539 /**
540 * Returns an example of the content of a universal snippet.
541 *
542 * @return string
543 */
544 protected static function get_simple_universal_snippet() {
545 $output = "<!-- Global Site Tag (gtag.js) - Google Analytics -->" . PHP_EOL;
546 $output .= "<script async src=\"https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID\"></script>" . PHP_EOL;
547 $output .= "<script>" . PHP_EOL;
548 $output .= "\twindow.dataLayer = window.dataLayer || [];" . PHP_EOL;
549 $output .= "\tfunction gtag(){dataLayer.push(arguments);}" . PHP_EOL;
550 $output .= "\tgtag('js', new Date());" . PHP_EOL;
551 $output .= "\tgtag('config', 'GA_TRACKING_ID');" . PHP_EOL;
552 $output .= "</script>" . PHP_EOL;
553 $output .= "<!-- End global Site Tag (gtag.js) - Google Analytics -->" . PHP_EOL;
554
555 return $output;
556 }
557
558 /**
559 * Returns an example of the content of a woocommerce snippet.
560 *
561 * @return string
562 */
563 protected static function get_woo_snippet() {
564 $output = <<<SCRIPT
565 <script type="text/javascript">
566 var pixel_id = ''; // Add you FB pixel ID!
567 !function (f, b, e, v, n, t, s) {
568 if (f.fbq) return; n = f.fbq = function () {
569 n.callMethod ?
570 n.callMethod.apply(n, arguments) : n.queue.push(arguments)
571 }; if (!f._fbq) f._fbq = n;
572 n.push = n; n.loaded = !0; n.version = '2.0'; n.queue = []; t = b.createElement(e); t.async = !0;
573 t.src = v; s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s)
574 }(window,document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
575
576 fbq('init', pixel_id);
577 fbq('track', 'PageView');
578 </script>
579 SCRIPT;
580
581 return $output;
582 }
583
584 /**
585 * Wrapper for register shortcode
586 *
587 * @param $name
588 * @param $obj
589 */
590 public static function register_shortcode( $name, $obj ) {
591 Wbcr_FactoryShortcodes329::register( $name, $obj );
592 }
593
594 /**
595 * Wrapper for get factory class for container
596 *
597 * @return string
598 */
599 public static function get_factory_class() {
600 return "factory-bootstrap-450 factory-fontawesome-000";
601 }
602
603 /**
604 * Wrapper for Wbcr_FactoryForms447_OptionsValueProvider object
605 *
606 * @param $plugin
607 *
608 * @return Wbcr_FactoryForms447_OptionsValueProvider
609 */
610 public static function get_options_value_provider( $plugin ) {
611 return new Wbcr_FactoryForms447_OptionsValueProvider( $plugin );
612 }
613
614 /**
615 * Wrapper for get factory form object
616 *
617 * @param $options
618 * @param $plugin
619 *
620 * @return Wbcr_FactoryForms447_Form
621 */
622 public static function get_factory_form( $options, $plugin ) {
623 return new Wbcr_FactoryForms447_Form( $options, $plugin );
624 }
625
626 /**
627 * Wrapper for register factory metaboxes
628 *
629 * @param $class_name_or_object
630 * @param $post_type
631 * @param $plugin
632 */
633 public static function register_factory_metaboxes( $class_name_or_object, $post_type, $plugin ) {
634 Wbcr_FactoryMetaboxes409::registerFor( $class_name_or_object, $post_type, $plugin );
635 }
636
637 /**
638 * Render html for purchase button
639 */
640 public static function get_purchase_button( $utm_tracking_location = 'snippet-library-page' ) {
641 $price_url = WINP_Plugin::app()->get_support()->get_pricing_url( true, $utm_tracking_location );
642 $price = WINP_Plugin::app()->premium->get_price();
643 $price = empty( $price ) ? 19 : $price;
644 ?>
645 <p class="winp-purchase-button">
646 <a class="button" id="winp-library-buy-button" href="<?php echo esc_url( $price_url ) ?>" target="_blank">
647 <span><?php echo __( 'Purchase premium for', 'insert-php' ) . ' $' . esc_attr( $price ); ?></span>
648 </a>
649 </p>
650 <?php
651 }
652
653 /**
654 * Check if current user is admin or editor
655 * todo: удалить этот метод, потому что он дублирует функционал WINP_Plugin::app()->currentUserCan
656 *
657 * @return bool
658 */
659 public static function winp_check_user_admin() {
660 return current_user_can( 'manage_options' ) || current_user_can( 'administrator' );
661 }
662
663 /*
664 * Flushes as many page cache plugin's caches as possible.
665 *
666 * @return void
667 */
668 public static function flush_page_cache() {
669 if ( function_exists( 'wp_cache_clear_cache' ) ) {
670 if ( is_multisite() ) {
671 $blog_id = get_current_blog_id();
672 wp_cache_clear_cache( $blog_id );
673 } else {
674 wp_cache_clear_cache();
675 }
676 } else if ( has_action( 'cachify_flush_cache' ) ) {
677 do_action( 'cachify_flush_cache' );
678 } else if ( function_exists( 'w3tc_pgcache_flush' ) ) {
679 w3tc_pgcache_flush();
680 } else if ( function_exists( 'wp_fast_cache_bulk_delete_all' ) ) {
681 wp_fast_cache_bulk_delete_all();
682 } else if ( class_exists( 'WpFastestCache' ) ) {
683 $wpfc = new WpFastestCache();
684 $wpfc->deleteCache();
685 } else if ( class_exists( 'c_ws_plugin__qcache_purging_routines' ) ) {
686 c_ws_plugin__qcache_purging_routines::purge_cache_dir(); // quick cache
687 } else if ( class_exists( 'zencache' ) ) {
688 zencache::clear();
689 } else if ( class_exists( 'comet_cache' ) ) {
690 comet_cache::clear();
691 } else if ( class_exists( 'WpeCommon' ) ) {
692 // WPEngine cache purge/flush methods to call by default
693 $wpe_methods = [
694 'purge_varnish_cache',
695 ];
696
697 // More agressive clear/flush/purge behind a filter
698 if ( apply_filters( 'wbcr/factory/flush_wpengine_aggressive', false ) ) {
699 $wpe_methods = array_merge( $wpe_methods, [ 'purge_memcached', 'clear_maxcdn_cache' ] );
700 }
701
702 // Filtering the entire list of WpeCommon methods to be called (for advanced usage + easier testing)
703 $wpe_methods = apply_filters( 'wbcr/factory/wpengine_methods', $wpe_methods );
704
705 foreach ( $wpe_methods as $wpe_method ) {
706 if ( method_exists( 'WpeCommon', $wpe_method ) ) {
707 WpeCommon::$wpe_method();
708 }
709 }
710 } else if ( function_exists( 'sg_cachepress_purge_cache' ) ) {
711 sg_cachepress_purge_cache();
712 } else if ( file_exists( WP_CONTENT_DIR . '/wp-cache-config.php' ) && function_exists( 'prune_super_cache' ) ) {
713 // fallback for WP-Super-Cache
714 global $cache_path;
715 if ( is_multisite() ) {
716 $blog_id = get_current_blog_id();
717 prune_super_cache( get_supercache_dir( $blog_id ), true );
718 prune_super_cache( $cache_path . 'blogs/', true );
719 } else {
720 prune_super_cache( $cache_path . 'supercache/', true );
721 prune_super_cache( $cache_path, true );
722 }
723 }
724 }
725
726 /**
727 * @param $post WP_Post
728 *
729 * @return string
730 * @since 2.4.0
731 *
732 */
733 public static function get_where_use_text( $post ) {
734 global $winp_snippets_locations;
735 $snippet_scope = self::getMetaOption( $post->ID, 'snippet_scope' );
736 $result = "";
737
738 if ( $snippet_scope == 'evrywhere' ) {
739 $result = __( 'Run everywhere', 'insert-php' );
740 } else if ( $snippet_scope == 'auto' ) {
741 $items = $winp_snippets_locations->getList();
742
743 $snippet_location = self::getMetaOption( $post->ID, 'snippet_location', '' );
744
745 if ( ! empty( $snippet_location ) ) {
746 $text = $items[ $snippet_location ][0] ?? '';
747 } else {
748 $text = __( 'Everywhere', 'insert-php' );
749 }
750
751 $result = esc_html( $text );
752 } else {
753 $result = self::get_shortcode_text( $post );
754 }
755
756 return $result;
757 }
758
759 /**
760 * @param $post WP_Post
761 *
762 * @return string
763 */
764 public static function get_shortcode_text( $post ) {
765 $snippet_type = self::get_snippet_type( $post->ID );
766 $snippet_type = ( $snippet_type == WINP_SNIPPET_TYPE_UNIVERSAL ? '' : $snippet_type . '_' );
767
768 return esc_html( apply_filters( 'wbcr/inp/viewtable/where_use', '[wbcr_' . $snippet_type . 'snippet id="' . $post->ID . '"]', $post->ID ) );
769 }
770
771 /**
772 * @param $post WP_Post
773 *
774 * @return int
775 */
776 public static function get_next_snippet_priority() {
777 global $wpdb;
778
779 $max_priority = $wpdb->get_var( "
780 SELECT MAX(CAST(meta_value AS UNSIGNED))
781 FROM {$wpdb->postmeta}
782 WHERE meta_key = '" . WINP_Plugin::app()->getPrefix() . "snippet_priority'" );
783
784 if ( is_null( $max_priority ) ) {
785 $max_priority = 0;
786 } else {
787 $max_priority = (int) $max_priority;
788 }
789
790 return $max_priority + 10;
791 }
792
793 /**
794 * @return bool
795 *
796 * @since 2.4.0
797 */
798 public static function is_woo_active() {
799 return is_plugin_active( 'woocommerce/woocommerce.php' );
800 }
801
802 }
803