table_name = $wpdb->prefix . 'socialsnap_stats'; $this->primary_key = 'id'; } /** * Get table columns. * * @since 1.0.0 */ public function get_columns() { return array( 'id' => '%d', 'count' => '%d', 'post_id' => '%d', 'post_type' => '%s', 'date' => '%s', 'network' => '%s', 'type' => '%s', 'location' => '%s', 'url' => '%s', 'ip_address' => '%s', ); } /** * Default column values. * * @since 1.0.0 */ public function get_column_defaults() { return array( 'date' => gmdate( 'Y-m-d H:i:s' ), ); } /** * Get stats from database * * @since 1.0.0 */ public function get_stats( $args = array(), $count = false ) { global $wpdb; $defaults = array( 'number' => 30, 'offset' => 0, 'id' => 0, 'post_id' => 0, 'post_type' => '', 'date' => '', 'network' => '', 'type' => '', 'count' => '', 'location' => '', 'url' => '', 'ip_address' => '', 'date_from' => '', 'date_to' => gmdate( 'Y-m-d H:i:s' ), 'orderby' => 'date', 'order' => 'DESC', 'search' => false, ); $args = wp_parse_args( $args, $defaults ); if ( $args['number'] < 1 ) { $args['number'] = 999999999999; } $where = ''; // Allowed int arg items $keys = array( 'id', 'post_id', 'count' ); foreach ( $keys as $key ) { if ( ! empty( $args[ $key ] ) ) { if ( is_array( $args[ $key ] ) ) { $ids = implode( ',', array_map( 'intval', $args[ $key ] ) ); } else { $ids = intval( $args[ $key ] ); } $where .= empty( $where ) ? 'WHERE' : 'AND'; $where .= " `{$key}` IN( {$ids} ) "; } } // Allowed string arg items $keys = array( 'url', 'network', 'location', 'type', 'ip_address', 'post_type', 'date' ); foreach ( $keys as $key ) { if ( '' !== $args[ $key ] ) { $where .= empty( $where ) ? 'WHERE' : 'AND'; $where .= " `{$key}` = '" . esc_sql( $args[ $key ] ) . "' "; } } // Time interval if ( '' !== $args['date_from'] && '' !== $args['date_to'] ) { $where .= empty( $where ) ? 'WHERE' : 'AND'; $where .= " `date` > '" . esc_sql( $args['date_from'] ) . "' "; $where .= 'AND'; $where .= " `date` < '" . esc_sql( $args['date_to'] ) . "' "; } // Orderby $orderby = ! array_key_exists( $args['orderby'], $this->get_columns() ) ? $this->primary_key : $args['orderby']; // Order if ( 'ASC' === strtoupper( $args['order'] ) ) { $order = 'ASC'; } else { $order = 'DESC'; } // Check for primed cache if ( true === $count ) { $cache_key = md5( 'socialsnap_stats_count' . serialize( $args ) ); } else { $cache_key = md5( 'socialsnap_stats_' . serialize( $args ) ); } $results = wp_cache_get( $cache_key, 'socialsnap_stats' ); if ( false === $results ) { if ( true === $count ) { if ( false === strpos( $args['type'], 'api' ) ) { $results = absint( $wpdb->get_var( "SELECT COUNT({$this->primary_key}) FROM {$this->table_name} {$where};" ) ); } else { $results = 0; $records = $wpdb->get_results( "SELECT * FROM {$this->table_name} {$where}" ); if ( is_array( $records ) && ! empty( $records ) ) { foreach ( $records as $record ) { if ( isset( $record->count ) ) { $results += $record->count; } } } } } else { $results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$this->table_name} {$where} ORDER BY {$orderby} {$order} LIMIT %d, %d;", absint( $args['offset'] ), absint( $args['number'] ) ) ); } wp_cache_set( $cache_key, $results, 'socialsnap_stats', 3600 ); } return $results; } /** * Get top networks for selected type. * * @since 1.0.0 */ public function get_top_networks( $args = array(), $number = 4 ) { global $wpdb; $defaults = array( 'type' => 'share', 'number' => 0, ); $args = wp_parse_args( $args, $defaults ); $networks = array(); $result = $this->get_stats( $args ); if ( is_array( $result ) && ! empty( $result ) ) { foreach ( $result as $row ) { if ( 'share_api' == $args['type'] ) { if ( isset( $networks[ $row->network ] ) ) { $networks[ $row->network ] += $row->count; } else { $networks[ $row->network ] = $row->count; } } else { if ( isset( $networks[ $row->network ] ) ) { $networks[ $row->network ]++; } else { $networks[ $row->network ] = 1; } } } } arsort( $networks ); $return = array_slice( $networks, 0, $number, true ); if ( $number ) { $return['other'] = array_sum( array_values( array_slice( $networks, $number, null, true ) ) ); } return $return; } /** * Get top content entries. * * @since 1.0.0 */ public function get_top_content( $args = array() ) { global $wpdb; $defaults = array( 'number' => 0, 'offset' => 0, 'id' => 0, 'post_id' => 0, 'post_count' => 10, 'post_type' => '', 'date' => '', 'network' => '', 'type' => '', 'count' => '', 'location' => '', 'url' => '', 'ip_address' => '', 'date_from' => '', 'date_to' => gmdate( 'Y-m-d H:i:s' ), 'orderby' => 'date', 'order' => 'DESC', 'search' => false, ); $args = wp_parse_args( $args, $defaults ); if ( $args['number'] < 1 ) { $args['number'] = 999999999999; } $return = array(); $result = $this->get_stats( $args ); if ( is_array( $result ) && ! empty( $result ) ) { foreach ( $result as $row ) { if ( isset( $return[ $row->post_id ] ) ) { $return[ $row->post_id ]++; } else { $return[ $row->post_id ] = 1; } } } arsort( $return ); return array_slice( $return, 0, $args['post_count'], true ); } /** * Create statistics database table. * * @since 1.0.0 */ public function create_table() { global $wpdb; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $charset_collate = ''; if ( ! empty( $wpdb->charset ) ) { $charset_collate .= "DEFAULT CHARACTER SET {$wpdb->charset}"; } if ( ! empty( $wpdb->collate ) ) { $charset_collate .= " COLLATE {$wpdb->collate}"; } $sql = "CREATE TABLE {$this->table_name} ( id bigint(20) NOT NULL AUTO_INCREMENT, post_id bigint(20) NOT NULL, count bigint(20) NOT NULL, date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, network varchar(20) NOT NULL, post_type varchar(20) NOT NULL, type varchar(10) NOT NULL, location varchar(20) NOT NULL, ip_address varchar(45) NOT NULL, url varchar(2083) NOT NULL, UNIQUE KEY id (id) ) {$charset_collate};"; $db = dbDelta( $sql ); } }