PluginProbe
Tracking Script Manager / 2.0.12
Tracking Script Manager v2.0.12
trunk 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 All 33 releases
tracking-script-manager / tracking-scripts-manager.php

tracking-scripts-manager.php in Tracking Script Manager 2.0.12, at tracking-scripts-manager.php

832 lines 30.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: Tracking Script Manager
4 * Plugin URI: http://wordpress.org/plugins/tracking-script-manager/
5 * Description: A plugin that allows you to add tracking scripts to your site.
6 * Version: 2.0.12
7 * Author: Red8 Interactive
8 * Author URI: http://red8interactive.com
9 * License: GPLv2 or later
10 */
11 /*
12 Copyright 2019 Red8 Interactive (email : james@red8interactive.com)
13
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License
16 as published by the Free Software Foundation; either version 2
17 of the License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 */
28 if ( ! defined( 'ABSPATH' ) ) {
29 exit; // Exit if accessed directly
30 }
31 if ( ! class_exists( 'Tracking_Scripts' ) ) {
32
33 class Tracking_Scripts {
34 /**
35 * @var TSM_Process_Tracking_Scripts
36 */
37 protected $process_all;
38
39 function __construct() {
40 }
41
42 public function initialize() {
43
44 // Constants
45 define( 'TRACKING_SCRIPT_PATH', plugins_url( ' ', __FILE__ ) );
46 define( 'TRACKING_SCRIPT_BASENAME', plugin_basename( __FILE__ ) );
47 define( 'TRACKING_SCRIPT_DIR_PATH', plugin_dir_path( __FILE__ ) );
48 define( 'TRACKING_SCRIPT_TEXTDOMAIN', 'tracking-scripts-manager' );
49 // Actions
50 add_action( 'init', array( $this, 'register_scripts_post_type' ) );
51 add_action( 'save_post', array( $this, 'save_post' ) );
52 add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
53 add_action( 'wp_head', array( $this, 'find_header_tracking_codes' ), 10 );
54 add_action( 'wp_footer', array( $this, 'find_footer_tracking_codes' ), 10 );
55 add_action( 'admin_menu', array( $this, 'tracking_scripts_create_menu' ) );
56 add_action( 'add_meta_boxes', array( $this, 'add_script_metaboxes' ) );
57 add_action( 'wp_ajax_tracking_scripts_get_posts', array( $this, 'tracking_scripts_posts_ajax_handler' ) );
58 add_action(
59 'manage_r8_tracking_scripts_posts_custom_column',
60 array(
61 $this,
62 'tracking_script_column_content',
63 ),
64 10,
65 2
66 );
67 add_action( 'wp_body_open', array( $this, 'find_page_tracking_codes' ) );
68 add_action( 'tsm_page_scripts', array( $this, 'find_page_tracking_codes' ) );
69 add_action( 'admin_init', array( $this, 'process_handler' ) );
70 add_action( 'admin_notices', array( $this, 'admin_notices' ) );
71 // fallback for page scripts if wp_body_open action isn't supported
72 add_action(
73 'get_footer',
74 function () {
75 if ( did_action( 'wp_body_open' ) === 0 ) {
76 add_action( 'wp_footer', array( $this, 'find_page_tracking_codes' ) );
77 }
78 }
79 );
80 // Filters
81 add_filter( 'manage_r8_tracking_scripts_posts_columns', array( $this, 'add_tracking_script_columns' ) );
82 add_filter(
83 'manage_edit-r8_tracking_scripts_sortable_columns',
84 array(
85 $this,
86 'tracking_scripts_column_sort',
87 )
88 );
89 // Includes
90 require_once plugin_dir_path( __FILE__ ) . 'classes/wp-async-request.php';
91 require_once plugin_dir_path( __FILE__ ) . 'classes/wp-background-process.php';
92 require_once plugin_dir_path( __FILE__ ) . 'classes/class-process-tracking-scripts.php';
93 $this->process_all = new TSM_Process_Tracking_Scripts();
94 }
95
96 /*************************************************
97 * Front End
98 **************************************************/
99 public function process_handler() {
100 if ( ! isset( $_GET['tsm_update_scripts'] ) || ! isset( $_GET['_wpnonce'] ) ) {
101 return;
102 }
103 if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_GET['_wpnonce'] ) ), 'tsm_update_scripts' ) ) {
104 return;
105 }
106 if ( 'true' === $_GET['tsm_update_scripts'] ) {
107 update_option( 'tsm_is_processing', true );
108 $this->handle_all();
109 }
110 }
111
112 protected function handle_all() {
113 $scripts = $this->get_tracking_scripts();
114 if ( ! empty( $scripts ) ) {
115 foreach ( $scripts as $script ) {
116 $this->process_all->push_to_queue( $script );
117 }
118 $this->process_all->save()->dispatch();
119 }
120 }
121
122
123 protected function get_tracking_scripts() {
124 $scripts = array();
125 $header_scripts = get_option( 'header_tracking_script_code' ) ? json_decode( get_option( 'header_tracking_script_code' ) ) : null;
126 $page_scripts = get_option( 'page_tracking_script_code' ) ? json_decode( get_option( 'page_tracking_script_code' ) ) : null;
127 $footer_scripts = get_option( 'footer_tracking_script_code' ) ? json_decode( get_option( 'footer_tracking_script_code' ) ) : null;
128 if ( ! empty( $header_scripts ) ) {
129 $scripts = array_merge( $scripts, $header_scripts );
130 }
131 if ( ! empty( $page_scripts ) ) {
132 $scripts = array_merge( $scripts, $page_scripts );
133 }
134 if ( ! empty( $footer_scripts ) ) {
135 $scripts = array_merge( $scripts, $footer_scripts );
136 }
137
138 return $scripts;
139 }
140
141 function admin_notices() {
142 $class = 'notice notice-info is-dismissible';
143 $header_scripts = get_option( 'header_tracking_script_code' );
144 $page_scripts = get_option( 'page_tracking_script_code' );
145 $footer_scripts = get_option( 'footer_tracking_script_code' );
146 $is_processing = get_option( 'tsm_is_processing' );
147 $has_tracking_scripts = $header_scripts || $page_scripts || $footer_scripts;
148 $is_admin = current_user_can( 'manage_options' );
149 if ( $has_tracking_scripts && $is_processing && $is_admin ) {
150 $message = __( 'Your scripts are currently processing. This may take several minutes. If you don’t see all of your scripts please wait a moment and refresh the page.', TRACKING_SCRIPT_TEXTDOMAIN );
151 $notice = sprintf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
152 echo esc_html( $notice );
153 }
154 if ( $has_tracking_scripts && ! $is_processing && $is_admin ) {
155 $url = wp_nonce_url( admin_url( 'edit.php?post_type=r8_tracking_scripts&tsm_update_scripts=true&tsm_is_processing=true' ), 'tsm_update_scripts' );
156 $message = __( 'Tracking Scripts Manager has updated to a new version, click OK to update your scripts to the updated version.', TRACKING_SCRIPT_TEXTDOMAIN );
157 $notice = sprintf( '<div class="%1$s"><p>%2$s</p><a class="button button-primary" href="%3$s" style="margin-bottom: .5em;">OK</a></div>', esc_attr( $class ), esc_html( $message ), esc_url( $url ) );
158 echo esc_html( $notice );
159 }
160 }
161
162
163
164 public function print_tsm_scripts( $script_id, $page, $page_id, $expiry_info ) {
165 $expiry_data = $this->expiry_data( $expiry_info );
166 $if_expire = $this->check_expiry_script( $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'], $script_id );
167 $script = get_post_meta( $script_id, 'r8_tsm_script_code', true );
168
169 $encoded_save = get_post_meta( $script_id, 'r8_tsm_encoded_save', true );
170 if(!$encoded_save){
171 $script=base64_encode($script);
172 $this->save_script($script_id,$script);
173 }
174
175 $page_script = $this->esc_script( $script );
176
177
178 // Check if this is the right page
179 if ( ( is_array( $page ) && in_array( intval( $page_id ), $page, true ) ) || empty( $page ) ) {
180 // Is it scheduled and not expired or set never to expire?
181 if ( 'Schedule' === $expiry_data['type'] && ! $if_expire || 'Never' === $expiry_data['type'] ) {
182 // Render script
183 echo( $page_script );
184 }
185 }
186 }
187
188 // Header Tracking Codes
189 function find_header_tracking_codes() {
190 global $wp_query;
191 $page_id = $wp_query->post->ID;
192 $args = array(
193 'post_type' => 'r8_tracking_scripts',
194 'post_status' => 'publish',
195 'posts_per_page' => - 1,
196 'meta_key' => 'r8_tsm_script_order',
197 'orderby' => 'meta_value_num',
198 'order' => 'ASC',
199 'meta_query' => array(
200 'relation' => 'AND',
201 array(
202 'key' => 'r8_tsm_script_location',
203 'value' => 'header',
204 'compare' => '=',
205 ),
206 array(
207 'key' => 'r8_tsm_active',
208 'value' => 'active',
209 'compare' => '=',
210 ),
211 ),
212 );
213 $header_scripts = new WP_Query( $args );
214
215
216 if ( $header_scripts->have_posts() ) {
217 while ( $header_scripts->have_posts() ) :
218 $header_scripts->the_post();
219 $page = get_post_meta( get_the_ID(), 'r8_tsm_script_page', true );
220 $expiry_info = get_post_meta( get_the_ID(), 'r8_tsm_script_expiry_info', true );
221 $this->print_tsm_scripts( get_the_ID(), $page, $page_id, $expiry_info );
222 endwhile;
223 wp_reset_postdata();
224 }
225 }
226
227 function find_page_tracking_codes() {
228 global $wp_query;
229 $page_id = $wp_query->post->ID;
230 $args = array(
231 'post_type' => 'r8_tracking_scripts',
232 'posts_per_page' => - 1,
233 'post_status' => 'publish',
234 'meta_key' => 'r8_tsm_script_order',
235 'orderby' => 'meta_value_num',
236 'order' => 'ASC',
237 'meta_query' => array(
238 'relation' => 'AND',
239 array(
240 'key' => 'r8_tsm_script_location',
241 'value' => 'page',
242 'compare' => '=',
243 ),
244 array(
245 'key' => 'r8_tsm_active',
246 'value' => 'active',
247 'compare' => '=',
248 ),
249 ),
250 );
251 $page_scripts = new WP_Query( $args );
252 if ( $page_scripts->have_posts() ) {
253 while ( $page_scripts->have_posts() ) :
254 $page_scripts->the_post();
255 $page = get_post_meta( get_the_ID(), 'r8_tsm_script_page', true );
256 $expiry_info = get_post_meta( get_the_ID(), 'r8_tsm_script_expiry_info', true );
257 $this->print_tsm_scripts( get_the_ID(), $page, $page_id, $expiry_info );
258 endwhile;
259 wp_reset_postdata();
260 }
261 }
262
263 function find_footer_tracking_codes() {
264 global $wp_query;
265 $page_id = $wp_query->post->ID;
266 $args = array(
267 'post_type' => 'r8_tracking_scripts',
268 'posts_per_page' => - 1,
269 'post_status' => 'publish',
270 'meta_key' => 'r8_tsm_script_order',
271 'orderby' => 'meta_value_num',
272 'order' => 'ASC',
273 'meta_query' => array(
274 'relation' => 'AND',
275 array(
276 'key' => 'r8_tsm_script_location',
277 'value' => 'footer',
278 'compare' => '=',
279 ),
280 array(
281 'key' => 'r8_tsm_active',
282 'value' => 'active',
283 'compare' => '=',
284 ),
285 ),
286 );
287 $footer_scripts = new WP_Query( $args );
288 if ( $footer_scripts->have_posts() ) {
289 while ( $footer_scripts->have_posts() ) :
290 $footer_scripts->the_post();
291 $page = get_post_meta( get_the_ID(), 'r8_tsm_script_page', true );
292 $expiry_info = get_post_meta( get_the_ID(), 'r8_tsm_script_expiry_info', true );
293 $this->print_tsm_scripts( get_the_ID(), $page, $page_id, $expiry_info );
294 endwhile;
295 wp_reset_postdata();
296 }
297 }
298
299 function add_tracking_script_columns( $columns ) {
300 $columns = array(
301 'cb' => '<input type="checkbox" />',
302 'title' => __( 'Script Title', TRACKING_SCRIPT_TEXTDOMAIN ),
303 'global' => __( 'Global', TRACKING_SCRIPT_TEXTDOMAIN ),
304 'location' => __( 'Location', TRACKING_SCRIPT_TEXTDOMAIN ),
305 'status' => __( 'Status', TRACKING_SCRIPT_TEXTDOMAIN ),
306 'schedule' => __( 'Schedule', TRACKING_SCRIPT_TEXTDOMAIN ),
307 );
308
309 return $columns;
310 }
311
312 function tracking_script_column_content( $column_name, $post_ID ) {
313 $expiry_info = get_post_meta( $post_ID, 'r8_tsm_script_expiry_info', true );
314 $expiry_data = $this->expiry_data( $expiry_info );
315 $if_expire = $this->check_expiry_script( $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'], $post_ID );
316 $scheduled_status = $this->scheduled_status( $if_expire, $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'] );
317
318 if ( $column_name === 'status' ) {
319 $active = get_post_meta( $post_ID, 'r8_tsm_active', true );
320 echo ( $active === 'inactive' ) ? '<span class="expired">' : '<span>';
321 if ( $active === 'active' ) {
322 echo 'Active';
323 } else {
324 echo 'Inactive';
325 }
326 echo esc_attr( $scheduled_status );
327 echo '</span>';
328 }
329
330 if ( $column_name === 'global' ) {
331 $global = get_post_meta( $post_ID, 'r8_tsm_script_page', true );
332 if ( empty( $global ) ) {
333 echo '&nbsp;&nbsp;&nbsp;&nbsp;&#10003;';
334 } else {
335 echo '&nbsp;&nbsp;&nbsp;&nbsp;&cross;';
336 }
337 }
338 if ( $column_name === 'location' ) {
339 $location = get_post_meta( $post_ID, 'r8_tsm_script_location', true );
340 if ( $location ) {
341 echo esc_html( ucwords( $location ) );
342 }
343 }
344 if ( $column_name === 'schedule' ) {
345 if ( $expiry_data['type'] === 'Schedule' ) {
346 echo esc_html(
347 sprintf(
348 __( 'Scheduled <b>%1$s</b> to <b>%2$s</b>', TRACKING_SCRIPT_TEXTDOMAIN ),
349 ( $expiry_data['start_date'] ),
350 ( $expiry_data['end_date'] )
351 )
352 );
353 } else {
354 esc_html_e( 'Never expires', TRACKING_SCRIPT_TEXTDOMAIN );
355 }
356 }
357 }
358
359 function tracking_scripts_column_sort( $columns ) {
360 $columns['global'] = 'global';
361 $columns['location'] = 'location';
362 $columns['status'] = 'status';
363 $columns['schedule'] = 'schedule';
364
365 return $columns;
366 }
367
368 public function add_script_metaboxes() {
369 add_meta_box(
370 'r8_tsm_script_code_wrapper',
371 __( 'Script Code', TRACKING_SCRIPT_TEXTDOMAIN ),
372 array(
373 $this,
374 'script_code_metabox',
375 ),
376 'r8_tracking_scripts',
377 'normal'
378 );
379 add_meta_box(
380 'r8_tsm_script_active',
381 __( 'Script Status', TRACKING_SCRIPT_TEXTDOMAIN ),
382 array(
383 $this,
384 'script_active_metabox',
385 ),
386 'r8_tracking_scripts',
387 'side'
388 );
389 add_meta_box(
390 'r8_tsm_script_expiry',
391 __( 'Schedule', TRACKING_SCRIPT_TEXTDOMAIN ),
392 array(
393 $this,
394 'script_expiry_metabox',
395 ),
396 'r8_tracking_scripts',
397 'side'
398 );
399 add_meta_box(
400 'r8_tsm_script_order',
401 __( 'Script Order', TRACKING_SCRIPT_TEXTDOMAIN ),
402 array(
403 $this,
404 'script_order_metabox',
405 ),
406 'r8_tracking_scripts',
407 'side'
408 );
409 add_meta_box(
410 'r8_tsm_script_location',
411 __( 'Script Location', TRACKING_SCRIPT_TEXTDOMAIN ),
412 array(
413 $this,
414 'script_location_metabox',
415 ),
416 'r8_tracking_scripts',
417 'normal'
418 );
419 add_meta_box(
420 'r8_tsm_script_page',
421 __( 'Specific Script Placement (Page(s) or Post(s))', TRACKING_SCRIPT_TEXTDOMAIN ),
422 array(
423 $this,
424 'script_page_metabox',
425 ),
426 'r8_tracking_scripts',
427 'normal'
428 );
429 }
430
431 function script_code_metabox() {
432 global $post;
433 $script_code = get_post_meta( $post->ID, 'r8_tsm_script_code', true );
434 /**
435 * Check if script was saved using base64 encode
436 */
437 $encoded_save = get_post_meta( $post->ID, 'r8_tsm_encoded_save', true );
438 if ( !$encoded_save ) {
439 $script_code=base64_encode($script_code);
440 $this->save_script($post->ID,$script_code);
441 }
442
443 if($this->is_file_modification_allowed()){
444 ?>
445 <div class="red8_script_notice" style=" padding: 1rem; border: 1px solid lightcoral; box-shadow: 0 2px 6px rgb(0 0 0 / 25%); border-radius: 11px;}">
446 <h1>Heads up!</h1>
447 <p>
448 Adding custom scripts is not recommended and could break your site.
449 </p>
450 <p>
451 Please double check that the code you are adding is secure and make sure your WordPress site is backed up
452 in the likely event that something breaks.</p>
453
454 <p>
455 <button type="button" class="button button-primary consent">I understand</button>
456 </p>
457
458 </div>
459 <script type="text/javascript">
460 jQuery(function($){
461 $(".red8_script_notice button.consent").on("click",function(){
462 $(".red8_script_notice").hide();
463 $("#red8_code_editor_wrapper")
464 .css("opacity",1)
465 .css('height','auto');
466
467 })
468 })
469 </script>
470
471 <div id="red8_code_editor_wrapper" style="opacity: 0; height: 0;">
472 <textarea name="r8_tsm_script_code" id="r8_tsm_script_code" rows="5" ><?php
473 if ( $script_code ) {
474 echo stripslashes(html_entity_decode( base64_decode($script_code), ENT_QUOTES, 'cp1252' ));
475 }
476 ?></textarea>
477 </div>
478
479 <?php
480 }
481 else{
482 ?>
483 <div class="notice notice-error ">
484 <p>File modification & custom scripts have been disallowed by your WordPress config.</p>
485 </div>
486 <?php
487 }
488
489 }
490
491 function script_active_metabox() {
492 global $post;
493 $active = get_post_meta( $post->ID, 'r8_tsm_active', true );
494 $expiry_info = get_post_meta( $post->ID, 'r8_tsm_script_expiry_info', true );
495 $expiry_data = $this->expiry_data( $expiry_info );
496 $if_expire = $this->check_expiry_script( $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'], $post->ID );
497 $scheduled_status = $this->scheduled_status( $if_expire, $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'] );
498
499 include_once TRACKING_SCRIPT_DIR_PATH . '/templates/script-active-metabox.php';
500 }
501
502 function script_expiry_metabox() {
503 global $post;
504 $expiry_info = get_post_meta( $post->ID, 'r8_tsm_script_expiry_info', true );
505 $expiry_data = $this->expiry_data( $expiry_info );
506 $if_expire = $this->check_expiry_script( $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'], $post->ID );
507 $scheduled_status = $this->scheduled_status( $if_expire, $expiry_data['type'], $expiry_data['start_date'], $expiry_data['end_date'] );
508 include_once TRACKING_SCRIPT_DIR_PATH . '/templates/script-expiry-metabox.php';
509 }
510
511 function script_order_metabox() {
512 global $post;
513 $order = get_post_meta( $post->ID, 'r8_tsm_script_order', true );
514 include_once TRACKING_SCRIPT_DIR_PATH . '/templates/script-order-metabox.php';
515 }
516
517 function script_location_metabox() {
518 global $post;
519 $location = get_post_meta( $post->ID, 'r8_tsm_script_location', true );
520 include_once TRACKING_SCRIPT_DIR_PATH . '/templates/script-location-metabox.php';
521 }
522
523 function script_page_metabox() {
524 global $post;
525 $script_page = get_post_meta( $post->ID, 'r8_tsm_script_page', true );
526
527 include_once TRACKING_SCRIPT_DIR_PATH . '/templates/script-page-metabox.php';
528 }
529
530 public function get_date_time( $timespan, $format ) {
531 $current_time = new DateTime();
532 $current_time->add( new DateInterval( $timespan ) );
533 $expire_time = $current_time->format( $format );
534
535 return $expire_time;
536 }
537
538 public function check_expiry_script( $expiry_date_type, $expiry_start_date, $expiry_end_date, $script_id ) {
539 $result = false;
540 if ( $expiry_date_type === 'Never' ) {
541 return $result;
542 }
543 if ( empty( $expiry_start_date ) ) {
544 return $result;
545 }
546 if ( empty( $expiry_end_date ) ) {
547 return $result;
548 }
549
550 $date_range = array();
551 $start_time = $expiry_start_date;
552 $interval = new DateInterval( 'P1D' );
553 $end_time = new DateTime( $expiry_end_date );
554 $end_time->add( $interval );
555 $period = new DatePeriod( new DateTime( $start_time ), $interval, $end_time );
556 $today = new DateTime();
557 $today_date = $today->format( 'Y-m-d' );
558 foreach ( $period as $key => $value ) {
559 $array[] = $value->format( 'Y-m-d' );
560 }
561 if ( ! in_array( $today_date, $array, true ) ) {
562 $result = true;
563 }
564 $this->set_script_status( $script_id, $result );
565 return $result;
566 }
567
568 public function set_script_status( $script_id, $result ) {
569 global $post;
570 if ( ! empty( $post->post_type ) ) {
571 if ( $post->post_type === 'r8_tracking_scripts' ) {
572 if ( $script_id === $post->ID ) {
573 $active = get_post_meta( $post->ID, 'r8_tsm_active', true );
574 if ( $result === true ) { // expire true
575 if ( 'active' === $active ) {
576 update_post_meta( $post->ID, 'r8_tsm_active', 'inactive' );
577 }
578 } else { // expire false
579 if ( 'inactive' === $active ) {
580 update_post_meta( $post->ID, 'r8_tsm_active', 'active' );
581 }
582 }
583 }
584 }
585 }
586 }
587
588 public function expiry_data( $expiry_info ) {
589 $type = is_object( $expiry_info ) ? $expiry_info->type : 'Never';
590 $start_date = is_object( $expiry_info ) ? $expiry_info->schedule_start : '';
591 $end_date = is_object( $expiry_info ) ? $expiry_info->schedule_end : '';
592 return array(
593 'type' => $type,
594 'start_date' => $start_date,
595 'end_date' => $end_date,
596 );
597 }
598
599 public function scheduled_status( $if_expire, $expiry_date_type, $expiry_start_date, $expiry_end_date ) {
600 $status = '';
601 $start = new DateTime( $expiry_start_date );
602 $end = new DateTime( $expiry_end_date );
603 $today = new DateTime();
604 if ( $expiry_date_type === 'Schedule' ) {
605 if ( ! $if_expire ) {
606 $status = '';
607 } else {
608 if ( $today < $start ) {
609 $diff = strtotime( $today->format( 'y-m-d' ) ) - strtotime( $start->format( 'y-m-d' ) );
610 $count = abs( round( $diff / 86400 ) );
611 $next_date = sprintf( _n( 'tomorrow', 'in %s days', $count, 'tracking-scripts-manager' ), $count );
612 $status = sprintf( '(Starting %s) ', $next_date );
613 }
614 if ( $today > $end ) {
615 $status = ' (Expired)';
616 }
617 }
618 }
619 return $status;
620 }
621
622 public function register_scripts_post_type() {
623 $labels = array(
624 'name' => _x( 'Tracking Scripts', TRACKING_SCRIPT_TEXTDOMAIN ),
625 'singular_name' => _x( 'Tracking Script', TRACKING_SCRIPT_TEXTDOMAIN ),
626 'menu_name' => _x( 'Tracking Scripts', TRACKING_SCRIPT_TEXTDOMAIN ),
627 'name_admin_bar' => _x( 'Tracking Scripts', TRACKING_SCRIPT_TEXTDOMAIN ),
628 'add_new' => _x( 'Add New Tracking Script', TRACKING_SCRIPT_TEXTDOMAIN ),
629 'add_new_item' => __( 'Add New Tracking Script', TRACKING_SCRIPT_TEXTDOMAIN ),
630 'new_item' => __( 'New Tracking Script', TRACKING_SCRIPT_TEXTDOMAIN ),
631 'edit_item' => __( 'Edit Tracking Script', TRACKING_SCRIPT_TEXTDOMAIN ),
632 'view_item' => __( 'View Tracking Script', TRACKING_SCRIPT_TEXTDOMAIN ),
633 'all_items' => __( 'All Tracking Scripts', TRACKING_SCRIPT_TEXTDOMAIN ),
634 'search_items' => __( 'Search Tracking Scripts', TRACKING_SCRIPT_TEXTDOMAIN ),
635 'parent_item_colon' => __( 'Parent Tracking Scripts:', TRACKING_SCRIPT_TEXTDOMAIN ),
636 'not_found' => __( 'No Tracking Scripts found.', TRACKING_SCRIPT_TEXTDOMAIN ),
637 'not_found_in_trash' => __( 'No Tracking Scripts found in Trash.', TRACKING_SCRIPT_TEXTDOMAIN ),
638 );
639 $args = array(
640 'labels' => $labels,
641 'description' => __( 'Description.', TRACKING_SCRIPT_TEXTDOMAIN ),
642 'public' => false,
643 'publicly_queryable' => false,
644 'show_ui' => true,
645 'show_in_menu' => false,
646 'query_var' => false,
647 'rewrite' => array( 'slug' => 'tracking-scripts' ),
648 'capability_type' => 'post',
649 'capabilities' => array(
650 'edit_post' => 'manage_options',
651 'read_post' => 'manage_options',
652 'delete_post' => 'manage_options',
653 'edit_posts' => 'manage_options',
654 'edit_others_posts' => 'manage_options',
655 'delete_posts' => 'manage_options',
656 'publish_posts' => 'manage_options',
657 'read_private_posts' => 'manage_options',
658 ),
659 'has_archive' => false,
660 'hierarchical' => false,
661 'menu_position' => null,
662 'supports' => array(
663 'title',
664 'script-code',
665 'script-active',
666 'script-location',
667 'script-order',
668 ),
669 );
670 register_post_type( 'r8_tracking_scripts', $args );
671 }
672
673 /*************************************************
674 * Admin Area
675 **************************************************/
676 function admin_enqueue_scripts( $hook ) {
677 global $post;
678 if ( $hook === 'post.php' || $hook === 'post-new.php' ) {
679 if ( ! empty( $post->post_type ) && ( $post->post_type === 'r8_tracking_scripts' ) ) {
680 wp_enqueue_style( 'r8-tsm-edit-script', plugins_url( '/css/tracking-script-edit.css', __FILE__ ), array(), md5_file( plugins_url( '/css/tracking-script-edit.css', __FILE__ ) ) );
681 wp_enqueue_style( 'r8-tsm-select2-css', plugins_url( '/css/select2.min.css', __FILE__ ), array(), md5_file( plugins_url( '/css/select2.min.css', __FILE__ ) ) );
682 wp_enqueue_script( 'r8-tsm-select2-js', plugins_url( '/js/select2.min.js', __FILE__ ), array(), md5_file( plugins_url( '/js/select2.min.js', __FILE__ ) ), true );
683 wp_enqueue_script(
684 'r8-tsm-post-edit-js',
685 plugins_url( '/js/post-edit.js', __FILE__ ),
686 array(
687 'jquery',
688 'r8-tsm-select2-js',
689 ),
690 md5_file( plugins_url( '/js/post-edit.js', __FILE__ ) ),
691 true
692 );
693 wp_enqueue_style( 'jquery-ui-css', 'https://code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css' );
694 wp_enqueue_script( 'jquery-ui-datepicker' );
695 }
696 }
697 if ( $hook === 'post.php' || $hook === 'edit.php' ) {
698 if ( ! empty( $post->post_type ) && ( $post->post_type === 'r8_tracking_scripts' ) ) {
699 wp_enqueue_style( 'r8-tsm-post-list', plugins_url( '/css/post-list.css', __FILE__ ), array(), md5_file( plugins_url( '/css/post-list.css', __FILE__ ) ) );
700 wp_enqueue_script( 'r8-tsm-post-list-js', plugins_url( '/js/post-list.js', __FILE__ ), array( 'jquery' ), md5_file( plugins_url( '/js/post-list.js', __FILE__ ) ), true );
701 }
702 }
703 if ( ! empty( $post->post_type ) && ( $post->post_type === 'r8_tracking_scripts' ) ) {
704 // code editor support
705 $html_editor = wp_enqueue_code_editor( array( 'type' => 'text/html' ) );
706 if ( false !== $html_editor ) {
707 wp_add_inline_script(
708 'code-editor',
709 sprintf(
710 'jQuery( function() { wp.codeEditor.initialize( "r8_tsm_script_code", %s ); } );',
711 wp_json_encode( $html_editor )
712 )
713 );
714 }
715 }
716 }
717
718 private function esc_script( $script ) {
719 return stripslashes(html_entity_decode( base64_decode($script), ENT_QUOTES, 'cp1252' ));
720 }
721
722 private function save_script($post_id,$script_code){
723 $script_code = stripslashes( wp_unslash($script_code));
724 update_post_meta( $post_id, 'r8_tsm_script_code', $script_code );
725 update_post_meta( $post_id, 'r8_tsm_encoded_save', true );
726 }
727
728
729 private function is_file_modification_allowed(){
730 if (defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS){
731 return false;
732 }
733 return true;
734 }
735
736 function save_post() {
737 global $post;
738 if ( ! empty( $post->post_type ) ) {
739 if ( $post->post_type === 'r8_tracking_scripts' ) {
740 $expiry_obj = new \stdClass();
741 $expiry_obj->schedule_start = '';
742 $expiry_obj->schedule_end = '';
743 $expiry_obj->type = '';
744 if ( ! empty( $_POST['r8_tsm_script_code'] ) ) {
745 $script_code = base64_encode($_POST['r8_tsm_script_code'] );
746 $this->save_script($post->ID,$script_code);
747
748 }
749 if ( ! empty( $_POST['r8_tsm_active'] ) ) {
750 $tsm_active = sanitize_text_field( wp_unslash( $_POST['r8_tsm_active'] ) );
751 update_post_meta( $post->ID, 'r8_tsm_active', $tsm_active );
752 }
753 if ( ! empty( $_POST['r8_tsm_script_order'] ) ) {
754 update_post_meta( $post->ID, 'r8_tsm_script_order', intval( $_POST['r8_tsm_script_order'] ) );
755 }
756 if ( ! empty( $_POST['r8_tsm_script_location'] ) ) {
757 update_post_meta( $post->ID, 'r8_tsm_script_location', sanitize_text_field( wp_unslash( $_POST['r8_tsm_script_location'] ) ) );
758 }
759 if ( ! empty( $_POST['r8_tsm_script_expiry'] ) || ( ! empty( $_POST['schedule_start'] ) && ! empty( $_POST['schedule_end'] ) ) ) {
760 $expiry_obj->type = sanitize_text_field( wp_unslash( $_POST['r8_tsm_script_expiry'] ) ) ? : 'Never';
761 $expiry_obj->schedule_start = sanitize_text_field( wp_unslash( $_POST['schedule_start'] ) ) ?: '';
762 $expiry_obj->schedule_end = sanitize_text_field( wp_unslash( $_POST['schedule_end'] ) ) ?: '';
763 update_post_meta( $post->ID, 'r8_tsm_script_expiry_info', $expiry_obj );
764 // status updated based on schedule
765 if ( $expiry_obj->type === 'Schedule' ) {
766 $this->check_expiry_script( $expiry_obj->type, $expiry_obj->schedule_start, $expiry_obj->schedule_end, $post->ID );
767 }
768 }
769 if ( ! empty( $_POST['r8_tsm_script_page'] ) && is_array( $_POST['r8_tsm_script_page'] ) ) {
770
771 $script_pages = array_map( 'intval', wp_unslash($_POST['r8_tsm_script_page']) );
772
773 update_post_meta( $post->ID, 'r8_tsm_script_page', $script_pages );
774 } else {
775 update_post_meta( $post->ID, 'r8_tsm_script_page', array() );
776 }
777 }
778 }
779 }
780
781 public function tracking_scripts_create_menu() {
782 add_menu_page( 'Tracking Script Manager', 'Tracking Script Manager', 'manage_options', 'edit.php?post_type=r8_tracking_scripts', null );
783 add_submenu_page( 'edit.php?post_type=r8_tracking_scripts', 'Add New Tracking Script', 'Add New Tracking Script', 'manage_options', 'post-new.php?post_type=r8_tracking_scripts', null );
784 }
785
786 // Admin Scripts
787 public function tracking_scripts_admin_scripts() {
788 wp_enqueue_script( 'jquery' );
789 wp_enqueue_script( 'tracking_script_js', plugin_dir_url( __FILE__ ) . '/js/built.min.js', array(), md5_file( plugin_dir_url( __FILE__ ) . '/js/built.min.js' ), true );
790 wp_localize_script( 'tracking_script_js', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
791 }
792
793 // Ajax Functions
794 public function tracking_scripts_posts_ajax_handler() {
795 $post_type = isset( $_POST['postType'] ) ? sanitize_text_field( wp_unslash( $_POST['postType'] ) ) : 'post';
796 $args = array(
797 'post_type' => $post_type,
798 'posts_per_page' => - 1,
799 'orderby' => 'name',
800 'order' => 'ASC',
801 );
802 ob_start();
803 $query = new WP_Query( $args );
804 echo '<option value="none" id="none">Choose ' . esc_html( ucwords( $post_type ) ) . '</option>';
805 while ( $query->have_posts() ) :
806 $query->the_post();
807 echo '<option value="' . esc_attr( get_the_ID() ) . '" id="' . esc_attr( get_the_ID() ) . '">' . esc_html( ucwords( get_the_title() ) ) . '</option>';
808 endwhile;
809 wp_reset_postdata();
810 echo esc_html( ob_get_clean() );
811 die();
812 }
813 }
814
815 function tracking_scripts() {
816
817 // globals
818 global $tracking_scripts;
819 // initialize
820 if ( ! isset( $tracking_scripts ) ) {
821 $tracking_scripts = new Tracking_Scripts();
822 $tracking_scripts->initialize();
823 }
824
825 // return
826 return $tracking_scripts;
827 }
828
829 // initialize
830 tracking_scripts();
831 }
832