1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438:
<?php
class Inbound_Analytics {
static $templates;
static $range;
static $dates;
static $automated_report;
public function __construct() {
self::load_hooks();
}
public static function load_hooks() {
add_action('admin_init', array(__CLASS__, 'load_static_vars'), 10);
remove_action('init', 'inbound_load_legacy_statistics', 10);
add_action('admin_enqueue_scripts', array(__CLASS__, 'load_scripts'));
add_action('add_meta_boxes', array(__CLASS__, 'load_metaboxes'));
add_filter('manage_posts_columns', array(__CLASS__, 'register_columns'));
add_filter('manage_pages_columns', array(__CLASS__, 'register_columns'));
add_action("manage_posts_custom_column", array(__CLASS__, 'prepare_column_data'), 10, 2);
add_action("manage_pages_custom_column", array(__CLASS__, 'prepare_column_data'), 10, 2);
add_filter("manage_edit-post_sortable_columns", array(__CLASS__, 'define_sortable_columns'));
add_filter("manage_edit-page_sortable_columns", array(__CLASS__, 'define_sortable_columns'));
add_action('posts_clauses', array(__CLASS__, 'process_column_sorting'), 1, 2);
add_filter( 'screen_settings',array( __CLASS__ , 'add_screen_option_field'), 10, 2 );
add_filter( 'init', array( __CLASS__, 'set_screen_option'), 1 );
}
public static function load_static_vars() {
self::load_range();
}
public static function load_range() {
self::$range = get_user_option(
'inbound_screen_option_range',
get_current_user_id()
);
self::$range = (self::$range) ? self::$range : 90;
self::$dates = Inbound_Reporting_Templates::prepare_range(self::$range);
return array('range' => self::$range, 'dates' => self::$dates);
}
public static function load_scripts() {
global $post;
if (!isset($post) || strstr($post->post_type, 'inbound-')) {
return;
}
$screen = get_current_screen();
wp_enqueue_style('thickbox');
wp_enqueue_script('thickbox');
if (!isset($screen) || $screen->action == 'new' || $screen->action == 'add' || $screen->base == 'edit') {
return;
}
wp_register_script('bootstrap', INBOUNDNOW_SHARED_URLPATH . 'assets/includes/BootStrap/js/bootstrap.min.js');
wp_enqueue_script('bootstrap');
wp_register_style('bootstrap', INBOUNDNOW_SHARED_URLPATH . 'assets/includes/BootStrap/css/bootstrap.css');
wp_enqueue_style('bootstrap');
wp_enqueue_style('inbound-analytics-css', INBOUND_PRO_URLPATH . 'assets/css/admin/reporting.quick-view.css');
}
public static function load_metaboxes() {
$screen = get_current_screen();
if (!isset($screen) || $screen->action == 'new' || $screen->action == 'add') {
return;
}
$post_types = get_post_types(array('public' => true), 'names');
$exclude[] = 'attachment';
$exclude[] = 'revisions';
$exclude[] = 'nav_menu_item';
$exclude[] = 'wp-lead';
$exclude[] = 'automation';
$exclude[] = 'rule';
$exclude[] = 'list';
$exclude[] = 'wp-call-to-action';
$exclude[] = 'tracking-event';
$exclude[] = 'inbound-forms';
$exclude[] = 'email-template';
$exclude[] = 'inbound-log';
$exclude[] = 'landing-page';
$exclude[] = 'acf-field-group';
$exclude[] = 'email';
$exclude[] = 'inbound-email';
foreach ($post_types as $post_type) {
if (!in_array($post_type, $exclude)) {
add_meta_box('inbound-analytics', __('Inbound Analytics', 'inbound-pro'), array(__CLASS__, 'display_quick_view'), $post_type, 'side', 'high');
}
}
}
public static function add_screen_option_field($rv, $screen) {
$screen = get_current_screen();
$whitelist = array('edit-post' , 'edit-page', 'post', 'page');
if (!$screen || !in_array( $screen->id , $whitelist ) ) {
return;
}
$val = get_user_option(
'inbound_screen_option_range',
get_current_user_id()
);
$val = ($val) ? $val : 90;
$rv .= '<fieldset class="">';
$rv .= '<legend>' . __('Inbound Analytics') . '</legend>';
$rv .= __('Reporting range in days' , 'inbound-pro' ). ':';
$rv .= '<select name="inbound_screen_option_range" class="" id="" style="width:100px;" ';
$ranges = array(1,7,30,90,360);
foreach ($ranges as $range) {
$rv .= '<option value="'.$range.'" '. ( $val==$range ? 'selected="true"' : '' ).'">'.$range.' ' . __('days','inbound-pro') .'</option>';
}
$rv .= '</select></fieldset>';
return $rv;
}
public static function set_screen_option() {
if (!isset($_POST['inbound_screen_option_range'])) {
return;
}
$response = update_user_option(
get_current_user_id(),
'inbound_screen_option_range',
intval($_POST['inbound_screen_option_range'])
);
}
public static function display_quick_view() {
$template_class_name = apply_filters('inbound-ananlytics/quick-view', 'Inbound_Quick_View');
$template_class = new $template_class_name;
$template_class->load_template(array());
self::prepare_modal_container();
}
public static function prepare_modal_container() {
?>
<div class="modal" id='ia-modal-container'>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span>
</button>
</div>
<div class="modal-body">
<iframe class='ia-frame'></iframe>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<?php
}
public static function register_columns($cols) {
$cols['inbound_impressions'] = __('Impressions', 'inbound-pro');
$cols['inbound_visitors'] = __('Visitors', 'inbound-pro');
$cols['inbound_actions'] = __('Actions', 'inbound-pro');
return $cols;
}
public static function prepare_column_data($column, $post_id) {
global $post;
$screen = get_current_screen();
$hidden = get_hidden_columns($screen);
$skip_check = array('inbound_impressions' , 'inbound_visitors' , 'inbound_actions' );
if (in_array($column, $skip_check)) {
if (in_array($column, $hidden )) {
echo __('<i>refresh</i>' , 'inbound-pro');
return;
}
}
switch ($column) {
case "inbound_impressions":
$params = array(
'page_id' => $post_id,
'start_date' => self::$dates['start_date'],
'end_date' => self::$dates['end_date']
);
$results = Inbound_Events::get_page_views_count_by('page_id', $params);
?>
<a href='<?php echo admin_url('index.php?action=inbound_generate_report&page_id=' . $post->ID . '&class=Inbound_Impressions_Report&range=' . self::$range . '&tb_hide_nav=true&TB_iframe=true&width=1000&height=600'); ?>' class='thickbox inbound-thickbox' title="<?php echo sprintf(__('past %s days', 'inbound-pro'), self::$range); ?>">
<?php $results; ?>
</a>
<?php
break;
case "inbound_visitors":
$params = array(
'page_id' => $post_id,
'start_date' => self::$dates['start_date'],
'end_date' => self::$dates['end_date']
);
$results = Inbound_Events::get_visitors($params);
?>
<a href='<?php echo admin_url('index.php?action=inbound_generate_report&page_id=' . $post->ID . '&class=Inbound_Visitors_Report&range=' . self::$range . '&tb_hide_nav=true&TB_iframe=true&width=1000&height=600'); ?>' class='thickbox inbound-thickbox' title="<?php echo sprintf(__('past %s days', 'inbound-pro'), self::$range); ?>">
<?php echo count($results); ?>
</a>
<?php
break;
case "inbound_actions":
$results = Inbound_Events::get_page_actions_count($post_id, 'any', self::$dates['start_date'], self::$dates['end_date']);
?>
<a href='<?php echo admin_url('index.php?action=inbound_generate_report&page_id=' . $post->ID . '&class=Inbound_Events_Report&range=' . self::$range . '&tb_hide_nav=true&TB_iframe=true&width=1000&height=600'); ?>' class='thickbox inbound-thickbox' title="<?php echo sprintf(__('past %s days', 'inbound-pro'), self::$range); ?>">
<?php echo $results; ?>
</a>
<?php
break;
}
}
public static function process_column_sorting($pieces, $query) {
global $wpdb, $table_prefix;
if (!function_exists('get_current_screen')) {
return;
}
$screen = get_current_screen();
$whitelist = array('post', 'page');
if (!isset($screen) || !in_array($screen->post_type, $whitelist)) {
return $pieces;
}
if ($query->is_main_query() && ($orderby = $query->get('orderby'))) {
$wordpress_date_time = date_i18n('Y-m-d G:i:s');
$order = strtoupper($query->get('order'));
if (!in_array($order, array('ASC', 'DESC'))) {
$order = 'ASC';
}
switch ($orderby) {
case 'inbound_impressions':
$pieces['join'] .= " LEFT JOIN {$table_prefix}inbound_page_views ee ON ee.page_id = {$wpdb->posts}.ID AND ee.datetime >= '" . self::$dates['start_date'] . "' AND datetime <= '" . self::$dates['end_date'] . "'";
$pieces['groupby'] = " {$wpdb->posts}.ID";
$pieces['orderby'] = "COUNT(ee.page_id) $order ";
break;
case 'inbound_visitors':
$pieces['join'] .= " LEFT JOIN (select lead_id, page_id from {$table_prefix}inbound_page_views group by lead_id) ee ON ee.page_id = {$wpdb->posts}.ID AND ee.datetime >= '" . self::$dates['start_date'] . "' AND datetime <= '" . self::$dates['end_date'] . "'";
$pieces['groupby'] = " {$wpdb->posts}.ID ";
$pieces['orderby'] = "COUNT(ee.lead_id) $order ";
break;
case 'inbound_actions':
$pieces['join'] .= " LEFT JOIN {$table_prefix}inbound_events ee ON ee.page_id = {$wpdb->posts}.ID AND ee.datetime >= '" . self::$dates['start_date'] . "' AND datetime <= '" . self::$dates['end_date'] . "'";
$pieces['groupby'] = " {$wpdb->posts}.ID";
$pieces['orderby'] = "COUNT(ee.page_id) $order ";
break;
}
} else {
$pieces['orderby'] = " post_modified DESC , " . $pieces['orderby'];
}
return $pieces;
}
public static function load_email_stats($post_id) {
if (isset(self::$stats[$post_id])) {
return self::$stats[$post_id];
}
self::$stats[$post_id] = Inbound_Email_Stats::get_email_timeseries_stats();
return self::$stats[$post_id];
}
public static function define_sortable_columns($columns) {
$columns['inbound_impressions'] = 'inbound_impressions';
$columns['inbound_actions'] = 'inbound_actions';
return $columns;
}
public static function filter_profile_tabs($tabs) {
if (INBOUND_ACCESS_LEVEL > 0 && INBOUND_ACCESS_LEVEL != 9 ) {
unset($tabs['wpleads_lead_tab_activity']);
unset($tabs['wpleads_lead_tab_conversions']);
}
return $tabs;
}
}
new Inbound_Analytics();