PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / 2.2.7
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts v2.2.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 +663 -49 2.0.62.2.7 View file →
@@ -1,66 +1,680 @@
1 1 <?php
2 -
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 +
3 19 /**
4 - * Helpers tools
5 - * @author Webcraftic <wordpress.webraftic@gmail.com>
6 - * @copyright (c) 09.11.2017, Webcraftic
7 - * @version 1.0
20 + * @return bool
8 21 */
9 - class WINP_Helper {
22 + public static function is_safe_mode() {
23 + global $wbcr_inp_safe_mode;
10 24
11 - private static $meta_options = array();
25 + if ( ! WINP_Plugin::app()->currentUserCan() ) {
26 + return false;
27 + }
12 28
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;
29 + if ( $wbcr_inp_safe_mode || isset( $_COOKIE['wbcr-php-snippets-safe-mode'] ) ) {
30 + return true;
31 + }
24 32
25 - if( !isset(self::$meta_options[$post_id]) || empty(self::$meta_options[$post_id]) ) {
26 - $meta_vals = get_post_meta($post_id, '', true);
33 + return false;
34 + }
27 35
28 - foreach($meta_vals as $name => $val) {
29 - self::$meta_options[$post_id][$name] = $val[0];
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' ) {
140 + $available_tags = [ 'id', 'title' ];
141 + } else {
142 + $available_tags = [ 'id' ];
143 + }
30 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;
31 171 }
172 + }
32 173
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;
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, true );
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 );
36 194 }
37 195
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;
196 + if ( ! empty( $post_id ) ) {
197 + $_post = get_post( $post_id );
198 + }
49 199
50 - return update_post_meta($post_id, WINP_Plugin::app()->getPrefix() . $option_name, $option_value);
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;
51 203 }
52 204
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;
205 + return $snippet_type;
206 + }
63 207
64 - return delete_post_meta($post_id, WINP_Plugin::app()->getPrefix() . $option_name);
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;
65 227 }
66 - }
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 + * @since 2.1.0
238 + * @return bool
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 + * @since 2.1.0
250 + * @return bool
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 + * @author Alexander Kovalev <alex.kovalevv@gmail.com>
268 + * @since 2.2.1
269 + *
270 + * @param WP_Post $post
271 + *
272 + * @return string snippet code
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 php snippet: Disable emojis', 'insert-php' ),
395 + 'post_name' => 'simple-php-snippet',
396 + 'post_content' => self::get_simple_php_snippet(),
397 + 'meta' => [
398 + 'type' => WINP_SNIPPET_TYPE_PHP,
399 + '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' ),
400 + 'tags' => [ 'php', 'disable features' ]
401 + ]
402 + ],
403 + [
404 + 'post_title' => __( 'Simple text snippet: What is Lorem Ipsum?', 'insert-php' ),
405 + 'post_name' => 'simple-text-snippet',
406 + 'post_content' => self::get_simple_text_snippet(),
407 + 'meta' => [
408 + 'type' => WINP_SNIPPET_TYPE_TEXT,
409 + 'description' => __( 'This ordinary maintenance text. With this snippet, you can fill your pages with meaningless English text.', 'insert-php' ),
410 + '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";}}',
411 + 'tags' => [ 'text', 'lorem ipsum' ]
412 + ]
413 + ],
414 + [
415 + 'post_title' => __( 'Simple universal snippet: Google analytics tracking', 'insert-php' ),
416 + 'post_name' => 'simple-universal-snippet',
417 + 'post_content' => self::get_simple_universal_snippet(),
418 + 'meta' => [
419 + 'type' => WINP_SNIPPET_TYPE_UNIVERSAL,
420 + '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.' ),
421 + '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";}}',
422 + 'tags' => [ 'universal', 'tracking' ]
423 + ]
424 + ]
425 + ];
426 +
427 + foreach ( $posts as $post ) {
428 + // '@' here is to hide unexpected output while plugin activation
429 + $post_id = @wp_insert_post( [
430 + 'post_content' => $post['post_content'],
431 + 'post_title' => $post['post_title'],
432 + 'post_status' => 'publish',
433 + 'post_type' => WINP_SNIPPETS_POST_TYPE
434 + ] );
435 +
436 + if ( ! is_wp_error( $post_id ) ) {
437 + if ( isset( $post['meta']['type'] ) ) {
438 + WINP_Helper::updateMetaOption( $post_id, 'snippet_type', $post['meta']['type'] );
439 +
440 + if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_PHP ) {
441 + WINP_Helper::updateMetaOption( $post_id, 'snippet_scope', 'evrywhere' );
442 + }
443 + if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_TEXT ) {
444 + WINP_Helper::updateMetaOption( $post_id, 'snippet_scope', 'shortcode' );
445 + }
446 + if ( $post['meta']['type'] == WINP_SNIPPET_TYPE_UNIVERSAL ) {
447 + WINP_Helper::updateMetaOption( $post_id, 'snippet_scope', 'auto' );
448 + WINP_Helper::updateMetaOption( $post_id, 'snippet_location', 'header' );
449 + }
450 + }
451 +
452 + if ( isset( $post['meta']['description'] ) ) {
453 + WINP_Helper::updateMetaOption( $post_id, 'snippet_description', $post['meta']['description'] );
454 + }
455 +
456 + if ( isset( $post['meta']['filters'] ) && is_serialized( $post['meta']['filters'] ) ) {
457 + $unserialized_filters = unserialize( $post['meta']['filters'] );
458 + WINP_Helper::updateMetaOption( $post_id, 'snippet_filters', $unserialized_filters );
459 + WINP_Helper::updateMetaOption( $post_id, 'changed_filters', 1 );
460 + }
461 +
462 + if ( isset( $post['meta']['tags'] ) && ! empty( $post['meta']['tags'] ) ) {
463 + if ( ! taxonomy_exists( WINP_SNIPPETS_TAXONOMY ) ) {
464 + register_taxonomy( WINP_SNIPPETS_TAXONOMY, WINP_SNIPPETS_POST_TYPE, [] );
465 + }
466 +
467 + wp_set_post_terms( $post_id, $post['meta']['tags'], WINP_SNIPPETS_TAXONOMY, true );
468 + }
469 + }
470 + }
471 +
472 + update_option( WINP_Plugin::app()->getOptionName( 'demo_snippets_created' ), 1 );
473 + }
474 +
475 + /**
476 + * Returns an example php snippet content
477 + *
478 + * @return string
479 + */
480 + protected static function get_simple_php_snippet() {
481 + $output = "/**" . PHP_EOL;
482 + $output .= "* Disable WP 4.2 emoji" . PHP_EOL;
483 + $output .= "*/" . PHP_EOL;
484 + $output .= "function ace_remove_emoji() {" . PHP_EOL;
485 + $output .= "\tadd_filter( 'emoji_svg_url', '__return_false' );" . PHP_EOL;
486 + $output .= "\tremove_action( 'admin_print_styles', 'print_emoji_styles' );" . PHP_EOL;
487 + $output .= "\tremove_action( 'wp_head', 'print_emoji_detection_script', 7 );" . PHP_EOL;
488 + $output .= "\tremove_action( 'admin_print_scripts', 'print_emoji_detection_script' );" . PHP_EOL;
489 + $output .= "\tremove_action( 'wp_print_styles', 'print_emoji_styles' );" . PHP_EOL;
490 + $output .= "\tremove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );" . PHP_EOL;
491 + $output .= "\tremove_filter( 'the_content_feed', 'wp_staticize_emoji' );" . PHP_EOL;
492 + $output .= "\tremove_filter( 'comment_text_rss', 'wp_staticize_emoji' );" . PHP_EOL;
493 + $output .= "\t// filter to remove TinyMCE emojis" . PHP_EOL;
494 + $output .= "\tadd_filter( 'tiny_mce_plugins', 'ace_disable_emoji_tinymce' );" . PHP_EOL;
495 + $output .= "}" . PHP_EOL;
496 + $output .= "add_action( 'init', 'ace_remove_emoji' );" . PHP_EOL;
497 + $output .= "/**" . PHP_EOL;
498 + $output .= "* Remove tinyMCE emoji" . PHP_EOL;
499 + $output .= "*/" . PHP_EOL;
500 + $output .= "function ace_disable_emoji_tinymce( \$plugins ) {" . PHP_EOL;
501 + $output .= "\tunset( \$plugins['wpemoji'] );" . PHP_EOL;
502 + $output .= "\treturn \$plugins;" . PHP_EOL;
503 + $output .= "}" . PHP_EOL;
504 +
505 + return $output;
506 + }
507 +
508 + /**
509 + * Returns an example of the content of a text snippet.
510 + *
511 + * @return string
512 + */
513 + protected static function get_simple_text_snippet() {
514 + $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.';
515 + $output .= PHP_EOL . "{{SNIPPET_CONTENT}}" . PHP_EOL;
516 +
517 + return $output;
518 + }
519 +
520 + /**
521 + * Returns an example of the content of a universal snippet.
522 + *
523 + * @return string
524 + */
525 + protected static function get_simple_universal_snippet() {
526 + $output = "<!-- Global Site Tag (gtag.js) - Google Analytics -->" . PHP_EOL;
527 + $output .= "<script async src=\"https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID\"></script>" . PHP_EOL;
528 + $output .= "<script>" . PHP_EOL;
529 + $output .= "\twindow.dataLayer = window.dataLayer || [];" . PHP_EOL;
530 + $output .= "\tfunction gtag(){dataLayer.push(arguments);}" . PHP_EOL;
531 + $output .= "\tgtag('js', new Date());" . PHP_EOL;
532 + $output .= "\tgtag('config', 'GA_TRACKING_ID');" . PHP_EOL;
533 + $output .= "</script>" . PHP_EOL;
534 + $output .= "<!-- End global Site Tag (gtag.js) - Google Analytics -->" . PHP_EOL;
535 +
536 + return $output;
537 + }
538 +
539 + /**
540 + * Wrapper for register shortcode
541 + *
542 + * @param $name
543 + * @param $obj
544 + */
545 + public static function register_shortcode( $name, $obj ) {
546 + Wbcr_FactoryShortcodes329::register( $name, $obj );
547 + }
548 +
549 + /**
550 + * Wrapper for get factory class for container
551 + *
552 + * @return string
553 + */
554 + public static function get_factory_class() {
555 + return "factory-bootstrap-420 factory-fontawesome-000";
556 + }
557 +
558 + /**
559 + * Wrapper for Wbcr_FactoryForms417_OptionsValueProvider object
560 + *
561 + * @param $plugin
562 + *
563 + * @return Wbcr_FactoryForms417_OptionsValueProvider
564 + */
565 + public static function get_options_value_provider( $plugin ) {
566 + return new Wbcr_FactoryForms417_OptionsValueProvider( $plugin );
567 + }
568 +
569 + /**
570 + * Wrapper for get factory form object
571 + *
572 + * @param $options
573 + * @param $plugin
574 + *
575 + * @return Wbcr_FactoryForms417_Form
576 + */
577 + public static function get_factory_form( $options, $plugin ) {
578 + return new Wbcr_FactoryForms417_Form( $options, $plugin );
579 + }
580 +
581 + /**
582 + * Wrapper for register factory metaboxes
583 + *
584 + * @param $class_name_or_object
585 + * @param $post_type
586 + * @param $plugin
587 + */
588 + public static function register_factory_metaboxes( $class_name_or_object, $post_type, $plugin ) {
589 + Wbcr_FactoryMetaboxes409::registerFor( $class_name_or_object, $post_type, $plugin );
590 + }
591 +
592 + /**
593 + * Render html for purchase button
594 + */
595 + public static function get_purchase_button( $utm_tracking_location = 'snippet-library-page' ) {
596 + $price_url = WINP_Plugin::app()->get_support()->get_pricing_url( true, $utm_tracking_location );
597 + $price = WINP_Plugin::app()->premium->get_price();
598 + $price = empty( $price ) ? 19 : $price;
599 + ?>
600 + <p class="winp-purchase-button">
601 + <a class="button" id="winp-library-buy-button" href="<?php echo esc_url( $price_url ) ?>" target="_blank">
602 + <span><?php echo __( 'Purchase premium for', 'insert-php' ) . ' $' . esc_attr( $price ); ?></span>
603 + </a>
604 + </p>
605 + <?php
606 + }
607 +
608 + /**
609 + * Check if current user is admin or editor
610 + * todo: удалить этот метод, потому что он дублирует функционал WINP_Plugin::app()->currentUserCan
611 + *
612 + * @return bool
613 + */
614 + public static function winp_check_user_admin() {
615 + return current_user_can( 'manage_options' ) || current_user_can( 'administrator' );
616 + }
617 +
618 + /*
619 + * Flushes as many page cache plugin's caches as possible.
620 + *
621 + * @return void
622 + */
623 + public static function flush_page_cache() {
624 + if ( function_exists( 'wp_cache_clear_cache' ) ) {
625 + if ( is_multisite() ) {
626 + $blog_id = get_current_blog_id();
627 + wp_cache_clear_cache( $blog_id );
628 + } else {
629 + wp_cache_clear_cache();
630 + }
631 + } else if ( has_action( 'cachify_flush_cache' ) ) {
632 + do_action( 'cachify_flush_cache' );
633 + } else if ( function_exists( 'w3tc_pgcache_flush' ) ) {
634 + w3tc_pgcache_flush();
635 + } else if ( function_exists( 'wp_fast_cache_bulk_delete_all' ) ) {
636 + wp_fast_cache_bulk_delete_all();
637 + } else if ( class_exists( 'WpFastestCache' ) ) {
638 + $wpfc = new WpFastestCache();
639 + $wpfc->deleteCache();
640 + } else if ( class_exists( 'c_ws_plugin__qcache_purging_routines' ) ) {
641 + c_ws_plugin__qcache_purging_routines::purge_cache_dir(); // quick cache
642 + } else if ( class_exists( 'zencache' ) ) {
643 + zencache::clear();
644 + } else if ( class_exists( 'comet_cache' ) ) {
645 + comet_cache::clear();
646 + } else if ( class_exists( 'WpeCommon' ) ) {
647 + // WPEngine cache purge/flush methods to call by default
648 + $wpe_methods = [
649 + 'purge_varnish_cache',
650 + ];
651 +
652 + // More agressive clear/flush/purge behind a filter
653 + if ( apply_filters( 'wbcr/factory/flush_wpengine_aggressive', false ) ) {
654 + $wpe_methods = array_merge( $wpe_methods, [ 'purge_memcached', 'clear_maxcdn_cache' ] );
655 + }
656 +
657 + // Filtering the entire list of WpeCommon methods to be called (for advanced usage + easier testing)
658 + $wpe_methods = apply_filters( 'wbcr/factory/wpengine_methods', $wpe_methods );
659 +
660 + foreach ( $wpe_methods as $wpe_method ) {
661 + if ( method_exists( 'WpeCommon', $wpe_method ) ) {
662 + WpeCommon::$wpe_method();
663 + }
664 + }
665 + } else if ( function_exists( 'sg_cachepress_purge_cache' ) ) {
666 + sg_cachepress_purge_cache();
667 + } else if ( file_exists( WP_CONTENT_DIR . '/wp-cache-config.php' ) && function_exists( 'prune_super_cache' ) ) {
668 + // fallback for WP-Super-Cache
669 + global $cache_path;
670 + if ( is_multisite() ) {
671 + $blog_id = get_current_blog_id();
672 + prune_super_cache( get_supercache_dir( $blog_id ), true );
673 + prune_super_cache( $cache_path . 'blogs/', true );
674 + } else {
675 + prune_super_cache( $cache_path . 'supercache/', true );
676 + prune_super_cache( $cache_path, true );
677 + }
678 + }
679 + }
680 +}