use WP_STATISTICS\Country; use WP_STATISTICS\IP; use WP_STATISTICS\Pages; use WP_Statistics\Service\Analytics\DeviceDetection\DeviceHelper; use WP_Statistics\Service\Analytics\DeviceDetection\UserAgent; use WP_Statistics\Service\Geolocation\GeolocationFactory; use WP_Statistics\Service\Admin\PrivacyAudit\Faqs\RequireConsent; use WP_STATISTICS\TimeZone; use WP_STATISTICS\User; /** * Get Current User IP */ function wp_statistics_get_user_ip() { return IP::getIP(); } /** * Get Current User Data * * @throws Exception */ function wp_statistics_get_current_user_data() { // Get Current User country and City $data = wp_statistics_get_user_location(); // Get Current User IP $data['ip'] = wp_statistics_get_user_ip(); // Get User Agent contain Browser and Platform $data['agent'] = UserAgent::getUserAgent(); // Get User info if Registered in WordPress if (User::is_login()) { $data['user'] = User::get(); } // Return return $data; } /** * Get User Statistics Data By IP * * @param bool $ip * @return array * @throws Exception */ function wp_statistics_get_user_location($ip = false) { $ip = ($ip === false ? wp_statistics_get_user_ip() : $ip); $data = array( 'country' => '', 'city' => '', ); // Get the location $location = GeolocationFactory::getLocation($ip); $country = $location['country']; $data['country'] = array( 'code' => $location, 'name' => Country::getName($country), 'flag' => Country::flag($country) ); // Get User City $data['city'] = $location['city']; return $data; } /** * Get Current Users online * * @param array $options * @return mixed */ function wp_statistics_useronline($options = array()) { global $wpdb; //Check Parameter $defaults = array( /** * Type Of Page in WordPress * @See Frontend\get_page_type * * -- Acceptable values -- * * post -> WordPress Post single page From All of public post Type * page -> WordPress page single page * product -> WooCommerce product single page * home -> Home Page website * category -> WordPress Category Page * post_tag -> WordPress Post Tags Page * tax -> WordPress Term Page for all Taxonomies * author -> WordPress Users page * 404 -> 404 Not Found Page * archive -> WordPress Archive Page * all -> All Site Page * */ 'type' => 'all', /** * WordPress Query object ID * @example array('type' => 'product', 'ID' => 5) */ 'ID' => 0, /** * Get number of logged users or all users * * -- Acceptable values -- * false -> Get Number of all users * true -> Get Number of all logged users in wordpress */ 'logged_users' => false, /** * Get number User From Custom Country * * -- Acceptable values -- * ISO Country Code -> For Get List @See \wp-statistics\includes\functions\country-code.php * */ 'location' => 'all', /** * Search Filter by User agent name * e.g : Firefox , Chrome , Safari , Unknown .. * @see wp_statistics_get_browser_list() * */ 'agent' => 'all', /** * Search filter by User Operating System name * e.g : Windows, iPad, Macintosh, Unknown, .. * */ 'platform' => 'all', /** * Return Of Data * * -- Acceptable values -- * count -> Get number of user online * all -> Get List of User Online data */ 'return' => 'count' ); // Parse incoming $args into an array and merge it with $defaults $arg = wp_parse_args($options, $defaults); //Basic SQL $type_request = ($arg['return'] == "all" ? '*' : 'COUNT(*)'); $sql = "SELECT {$type_request} FROM " . WP_STATISTICS\DB::table('useronline') . " as useronline JOIN " . WP_STATISTICS\DB::table('visitor') . " as visitor ON useronline.visitor_id = visitor.ID"; //Check Where Condition $where = []; //Check Type of Page if ($arg['type'] != "all") { $where[] = "`visitor`.`last_page` = " . $arg['ID']; } //Check Custom user if ($arg['logged_users'] === true) { $where[] = "`user_id` > 0"; } //Check Location if ($arg['location'] != "all") { $ISOCountryCode = Country::getList(); if (array_key_exists($arg['location'], $ISOCountryCode)) { $where[] = "`location` = '" . $arg['location'] . "'"; } } //Check User Agent if ($arg['agent'] != "all") { $where[] = "`agent` = '" . $arg['agent'] . "'"; } //Check User Platform if ($arg['platform'] != "all") { $where[] = "`platform` = '" . $arg['platform'] . "'"; } //Push Conditions to SQL if (!empty($where)) { $sql .= ' WHERE ' . implode(' AND ', $where); } //Return Number od user Online return ($arg['return'] == "count" ? $wpdb->get_var($sql) : $wpdb->get_results($sql)); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * This function get the visit statistics for a given time frame * * @param $time * @param null $daily * @return int */ function wp_statistics_visit($time, $daily = null) { global $wpdb; //Date Column Name in visits table $table_name = WP_STATISTICS\DB::table('visit'); $date_column = 'last_counter'; //Prepare Selector Sql $selector = 'SUM(visit)'; if ($daily == true) { $selector = '*'; } //Generate Base Sql $sql = "SELECT " . $selector . " FROM `" . $table_name . "` "; //Create Sum Views variable $sum = 0; //Check if daily Report if ($daily === true) { // Check Sanitize Datetime if (TimeZone::isValidDate($time)) { $d = $time; } else { $d = TimeZone::getCurrentDate('Y-m-d', $time); } $result = $wpdb->get_row($sql . " WHERE `$date_column` = '" . $d . "'"); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared if (null !== $result) { $sum = $result->visit; } } else { //Generate MySql Time Conditions if (is_array($time) && array_key_exists('start', $time) && array_key_exists('end', $time)) { $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions($date_column, '', $time); if (!empty($mysql_time_sql)) { $sql = $sql . ' WHERE ' . $mysql_time_sql; } } else { $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions($date_column, $time); if (!empty($mysql_time_sql)) { $sql = $sql . ' WHERE ' . $mysql_time_sql; } } //Request To database $result = $wpdb->get_var($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared //Custom Action if ($time == "total") { $result += WP_STATISTICS\Historical::get('visits'); } $sum = $result; } return !is_numeric($sum) ? 0 : $sum; } /** * This function gets the visitor statistics for a given time frame. * * @param $time * @param null $daily * @param bool $count_only * @param array $options * @return int|null|string */ function wp_statistics_visitor($time, $daily = null, $count_only = false, $options = array()) { global $wpdb; //Check Parameter $defaults = array( /** * Type Of Page in WordPress * @See Frontend\get_page_type * * -- Acceptable values -- * * post -> WordPress Post single page From All of public post Type * page -> WordPress page single page * product -> WooCommerce product single page * home -> Home Page website * category -> WordPress Category Page * post_tag -> WordPress Post Tags Page * tax -> WordPress Term Page for all Taxonomies * author -> WordPress Users page * 404 -> 404 Not Found Page * archive -> WordPress Archive Page * all -> All Site Page * */ 'type' => 'all', /** * WordPress Query object ID * @example array('type' => 'product', 'ID' => 5) */ 'ID' => 0, /** * Get number User From Custom Country * * -- Acceptable values -- * ISO Country Code -> For Get List @See \wp-statistics\includes\functions\country-code.php * */ 'location' => 'all', /** * Search Filter by User agent name * e.g : Firefox , Chrome , Safari , Unknown .. * @see wp_statistics_get_browser_list() * */ 'agent' => 'all', /** * Search filter by User Operating System name * e.g : Windows, iPad, Macintosh, Unknown, .. * */ 'platform' => 'all' ); // Parse incoming $args into an array and merge it with $defaults $arg = wp_parse_args($options, $defaults); //Create History Visitors variable $history = 0; //Prepare Selector Sql $date_column = 'last_counter'; $selector = '*'; if ($count_only == true) { $selector = 'count(last_counter)'; } //Generate Base Sql if ($arg['type'] != "all" and WP_STATISTICS\Option::get('visitors_log') == true) { $sql = "SELECT {$selector} FROM `" . WP_STATISTICS\DB::table('visitor') . "` INNER JOIN `" . WP_STATISTICS\DB::table("visitor_relationships") . "` ON `" . WP_STATISTICS\DB::table("visitor_relationships") . "`.`visitor_id` = `" . WP_STATISTICS\DB::table('visitor') . "`.`ID` INNER JOIN `" . WP_STATISTICS\DB::table('pages') . "` ON `" . WP_STATISTICS\DB::table('pages') . "`.`page_id` = `" . WP_STATISTICS\DB::table("visitor_relationships") . "` . `page_id`"; } else { $sql = "SELECT {$selector} FROM `" . WP_STATISTICS\DB::table('visitor') . "`"; } //Check Where Condition $where = []; //Check Type of Page if ($arg['type'] != "all" and WP_STATISTICS\Option::get('visitors_log') == true) { $where[] = "`" . WP_STATISTICS\DB::table('pages') . "`.`type`='" . $arg['type'] . "' AND `" . WP_STATISTICS\DB::table('pages') . "`.`page_id` = " . $arg['ID']; } //Check Location if ($arg['location'] != "all") { $ISOCountryCode = Country::getList(); if (array_key_exists($arg['location'], $ISOCountryCode)) { $where[] = "`" . WP_STATISTICS\DB::table('visitor') . "`.`location` = '" . $arg['location'] . "'"; } } //Check User Agent if ($arg['agent'] != "all") { $where[] = "`" . WP_STATISTICS\DB::table('visitor') . "`.`agent` = '" . $arg['agent'] . "'"; } //Check User Platform if ($arg['platform'] != "all") { $where[] = "`" . WP_STATISTICS\DB::table('visitor') . "`.`platform` = '" . $arg['platform'] . "'"; } //Check Date Time report if ($daily == true) { // Check Sanitize Datetime if (TimeZone::isValidDate($time)) { $d = $time; } else { $d = TimeZone::getCurrentDate('Y-m-d', $time); } //Get Only Current Day Visitors $where[] = "`" . WP_STATISTICS\DB::table('visitor') . "`.`last_counter` = '" . $d . "'"; } else { //Generate MySql Time Conditions if (is_array($time) && array_key_exists('start', $time) && array_key_exists('end', $time)) { $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions($date_column, '', $time); if (!empty($mysql_time_sql)) { $sql = $sql . ' WHERE ' . $mysql_time_sql; } } else { $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions($date_column, $time); if (!empty($mysql_time_sql)) { $where[] = $mysql_time_sql; } } } //Push Conditions to SQL if (!empty($where)) { $sql .= ' WHERE ' . implode(' AND ', $where); } //Custom Action if ($time == "total" and $arg['type'] == "all") { $history = WP_STATISTICS\Historical::get('visitors'); } // Execute the SQL call, if we're only counting we can use get_var(), otherwise we use query(). if ($count_only == true) { $sum = $wpdb->get_var($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $sum += $history; } else { $sum = $wpdb->query($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } return $sum; } /** * This function returns the statistics for a given page. * * @param $time * @param string $page_uri * @param int $id * @param null $rangestartdate * @param null $rangeenddate * @param bool $type * @return int|null|string * * @todo Replace all instances of this function with `ViewsModel->countViews()`. */ function wp_statistics_pages($time, $page_uri = '', $id = -1, $rangestartdate = null, $rangeenddate = null, $type = false) { global $wpdb; //Date Column Name in visits table $table_name = WP_STATISTICS\DB::table('pages'); $date_column = 'date'; // History Vars $history = 0; $history_key = null; $history_id = null; //Check Where Condition $where = []; //Check Query By Page ID or Page Url if ($type) { $query = $wpdb->prepare("`type` = %s", $type); if ($id != -1) { $query .= $wpdb->prepare(" AND `id` = %d", $id); $history_key = 'page'; $history_id = absint($id); } if ($page_uri != '') { $page_uri_sql = esc_sql($page_uri); $query .= $wpdb->prepare(" AND `URI` = %s", $page_uri_sql); $history_key = 'uri'; $history_id = $page_uri; } $where[] = apply_filters('wp_statistics_pages_where_type_query', $query, $id, $type); } else { // If no page URI has been passed in, get the current page URI. if ($page_uri == '') { $page_uri = Pages::get_page_uri(); } $page_uri_sql = esc_sql($page_uri); // If a page/post ID has been passed, use it to select the rows, otherwise use the URI. if ($id != -1) { $where[] = "`id`= " . absint($id); $history_key = 'page'; $history_id = absint($id); } else { $where[] = "`URI` = '{$page_uri_sql}'"; $history_key = 'uri'; $history_id = $page_uri; } } //Custom Action if ($time == "total") { if ($history_key && $history_id) { $history = WP_STATISTICS\Historical::get($history_key, $history_id); } } //Prepare Time $time_array = array(); if (is_numeric($time) || TimeZone::isValidDate($time)) { $time_array['is_day'] = true; } if (!is_null($rangestartdate) and !is_null($rangeenddate)) { $time_array = array('start' => $rangestartdate, 'end' => $rangeenddate); } //Check MySql Time Conditions $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions($date_column, $time, $time_array); if (!empty($mysql_time_sql)) { $where[] = $mysql_time_sql; } //Generate Base Sql $sql = "SELECT SUM(count) FROM {$table_name}"; //Push Conditions to SQL if (!empty($where)) { $sql .= ' WHERE ' . implode(' AND ', $where); } //Request Get data $sum = $wpdb->get_var($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $sum += $history; //Return Number Statistic return ($sum == '' ? 0 : $sum); } /** * Get top Pages between Time * * @param null $rangestartdate * @param null $rangeenddate * @param null $limit * @param null $post_type * @return array */ function wp_statistics_get_top_pages($rangestartdate = null, $rangeenddate = null, $limit = null, $post_type = null) { global $wpdb; $spliceLimit = ($limit != null ? $limit : 5); $limit = null; // Get every unique URI from the pages database. if ($rangestartdate != null && $rangeenddate != null) { $whereType = ($post_type != null ? $wpdb->prepare(" AND `type`=%s", $post_type) : ''); $result = $wpdb->get_results( $wpdb->prepare("SELECT `uri`,`id`,`type` FROM " . \WP_STATISTICS\DB::table('pages') . " WHERE `date` BETWEEN %s AND %s {$whereType} GROUP BY `id`" . ($limit != null ? ' LIMIT ' . $limit : ''), $rangestartdate, $rangeenddate), // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared ARRAY_N); } else { $limitQuery = ''; if ($limit) { $limitQuery = $wpdb->prepare(" LIMIT %d", $limit); } $whereType = ($post_type != null ? $wpdb->prepare(" WHERE `type`=%s", $post_type) : ''); $result = $wpdb->get_results("SELECT `uri`, `id`, `type` FROM " . \WP_STATISTICS\DB::table('pages') . " {$whereType} GROUP BY `id` {$limitQuery}", ARRAY_N); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } $total = 0; $uris = array(); // Now get the total page visit count for each unique URI. foreach ($result as $out) { //Prepare item list($url, $page_id, $page_type) = $out; // Check if item is of specific post type (string or part of an array) or if post type is set to null if (is_null($post_type) || $page_type == $post_type || (is_array($post_type) && in_array($page_type, $post_type))) { // Increment the total number of results. $total++; //Get Page Title $page_info = Pages::get_page_info($page_id, $page_type); $title = mb_substr($page_info['title'], 0, 200, "utf-8"); $page_url = $page_info['link']; // Check age Title if page id or type not exist if ($page_info['link'] == "") { $page_url = path_join(get_site_url(), $url); $id = WP_STATISTICS\Pages::uri_to_id($out[0]); $post = get_post($id); if (is_object($post)) { $title = esc_html($post->post_title); } else { if ($out[0] == '/') { $title = get_bloginfo(); } else { $title = ''; } } } //Check Title is empty if (empty($title)) { $title = '-'; } // Add the current post to the array. if ($rangestartdate != null && $rangeenddate != null) { $uris[] = array( urldecode_deep($out[0]), wp_statistics_pages('range', $out[0], -1, $rangestartdate, $rangeenddate, $post_type), $page_id, $title, $page_url, ); } else { $uris[] = array( urldecode_deep($out[0]), wp_statistics_pages('total', $out[0], -1, $rangestartdate, $rangeenddate, $post_type), $page_id, $title, $page_url ); } } } // If we have more than one result, let's sort them using usort. if (count($uris) > 1) { usort($uris, array('\WP_STATISTICS\Helper', 'compare_uri_hits_int')); } array_splice($uris, $spliceLimit); return array($spliceLimit, $uris); // return array($total, $uris); } /** * Returns all unique user agents in the database. * * @param null $rangestartdate * @param null $rangeenddate * @return array */ function wp_statistics_ua_list($rangestartdate = null, $rangeenddate = null) { global $wpdb; if ($rangestartdate != null && $rangeenddate != null) { if ($rangeenddate == 'CURDATE()') { $result = $wpdb->get_results( $wpdb->prepare("SELECT DISTINCT agent FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `last_counter` BETWEEN %s AND CURDATE()", $rangestartdate), ARRAY_N); } else { $result = $wpdb->get_results( $wpdb->prepare("SELECT DISTINCT agent FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `last_counter` BETWEEN %s AND %s", $rangestartdate, $rangeenddate), ARRAY_N); } } else { $result = $wpdb->get_results( "SELECT DISTINCT agent FROM `" . \WP_STATISTICS\DB::table('visitor') . "` ", ARRAY_N); } $Browsers = array(); $default_browser = DeviceHelper::getBrowserList(); foreach ($result as $out) { //Check Browser is defined in wp-statistics if (array_key_exists(strtolower($out[0]), $default_browser)) { $Browsers[] = esc_html($out[0]); } } return $Browsers; } /** * Count User By User Agent * * @param $agent * @param null $rangestartdate * @param null $rangeenddate * @return mixed */ function wp_statistics_useragent($agent, $rangestartdate = null, $rangeenddate = null) { global $wpdb; if ($rangestartdate != null || $rangeenddate != null) { if ($rangeenddate == null) { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `agent` = %s AND `last_counter` = %s", $agent, $rangestartdate) ); } else { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `agent` = %s AND `last_counter` BETWEEN %s AND %s", $agent, $rangestartdate, $rangeenddate) ); } } else { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `agent` = %s", $agent) ); } return $result; } /** * Returns all unique platform types from the database. * * @param null $rangestartdate * @param null $rangeenddate * @return array */ function wp_statistics_platform_list($rangestartdate = null, $rangeenddate = null) { global $wpdb; if ($rangestartdate != null && $rangeenddate != null) { $result = $wpdb->get_results( $wpdb->prepare("SELECT DISTINCT platform FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `last_counter` BETWEEN %s AND %s", $rangestartdate, $rangeenddate), ARRAY_N); } else { $result = $wpdb->get_results( "SELECT DISTINCT platform FROM `" . \WP_STATISTICS\DB::table('visitor') . "` ", ARRAY_N); } $Platforms = array(); foreach ($result as $out) { $Platforms[] = esc_html($out[0]); } return $Platforms; } /** * Returns the count of a given platform in the database. * * @param $platform * @param null $rangestartdate * @param null $rangeenddate * @return mixed */ function wp_statistics_platform($platform, $rangestartdate = null, $rangeenddate = null) { global $wpdb; if ($rangestartdate != null && $rangeenddate != null) { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(platform) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `platform` = %s AND `last_counter` BETWEEN %s AND %s", $platform, $rangestartdate, $rangeenddate) ); } else { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(platform) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE `platform` = %s", $platform) ); } return $result; } /** * Returns all unique versions for a given agent from the database. * * @param $agent * @param null $rangestartdate * @param null $rangeenddate * @return array */ function wp_statistics_agent_version_list($agent, $rangestartdate = null, $rangeenddate = null) { global $wpdb; if ($rangestartdate != null && $rangeenddate != null) { $result = $wpdb->get_results( $wpdb->prepare("SELECT DISTINCT `version` FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE agent = %s AND `last_counter` BETWEEN %s AND %s", $agent, $rangestartdate, $rangeenddate), ARRAY_N); } else { $result = $wpdb->get_results( $wpdb->prepare("SELECT DISTINCT `version` FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE agent = %s", $agent), ARRAY_N); } $Versions = array(); foreach ($result as $out) { $Versions[] = $out[0]; } return $Versions; } /** * Returns the statistics for a given agent/version pair from the database. * * @param $agent * @param $version * @param null $rangestartdate * @param null $rangeenddate * @return mixed */ function wp_statistics_agent_version($agent, $version, $rangestartdate = null, $rangeenddate = null) { global $wpdb; if ($rangestartdate != null && $rangeenddate != null) { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(version) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE agent = %s AND version = %s AND `last_counter` BETWEEN %s AND %s", $agent, $version, $rangestartdate, $rangeenddate) ); } else { $result = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(version) FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE agent = %s AND version = %s", $agent, $version) ); } return $result; } /** * Return the SQL WHERE clause for getting the search engine. * * @param string $search_engine * @return bool|string */ function wp_statistics_searchengine_query($search_engine = 'all') { global $wpdb; $search_query = ''; // Are we getting results for all search engines or a specific one? if (strtolower($search_engine) == 'all') { $search_query .= "`source_channel` in ('search')"; } else { // Are we getting results for all search engines or a specific one? $search_query .= $wpdb->prepare("`source_name` = %s", $search_engine); } return $search_query; } /** * Get Search engine Statistics * * @param string $search_engine * @param string $time * @param string $search_by [query / name] * @param array $range * @return mixed */ function wp_statistics_get_search_engine_query($search_engine = 'all', $time = 'total', $search_by = 'query', $range = []) { global $wpdb; //Prepare Table Name $table_name = \WP_STATISTICS\DB::table('visitor'); //Date Column table $date_column = 'last_counter'; // Get a complete list of search engines if ($search_by == "query") { $search_query = wp_statistics_searchengine_query($search_engine); } //Generate Base Sql $sql = "SELECT COUNT(ID) FROM {$table_name} WHERE ({$search_query})"; // Check Sanitize Datetime if (TimeZone::isValidDate($time)) { if (empty($range)) $range = ['is_day' => true]; } else { if (empty($range)) $range = ['current_date' => true]; } $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions($date_column, $time, $range); //Generate MySql Time Conditions if (!empty($mysql_time_sql)) { $sql = $sql . ' AND (' . $mysql_time_sql . ')'; } //Request Data return $wpdb->get_var($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * This function will return the statistics for a given search engine. * * @param string $search_engine * @param string $time * @param array $range * @return mixed */ function wp_statistics_searchengine($search_engine = 'all', $time = 'total', $range = []) { return wp_statistics_get_search_engine_query($search_engine, $time, $search_by = 'query', $range); } /** * Return Refer List * * @param null $time * @param array $range * @return int */ function wp_statistics_referrer($time = null, $range = []) { global $wpdb; $sql = "SELECT `referred` FROM `" . \WP_STATISTICS\DB::table('visitor') . "` WHERE referred <> ''"; // Check Sanitize Datetime if (TimeZone::isValidDate($time)) { if (empty($range)) $range = ['is_day' => true]; } else { if (empty($range)) $range = ['current_date' => true]; } $mysql_time_sql = WP_STATISTICS\Helper::mysql_time_conditions('last_counter', $time, $range); //Generate MySql Time Conditions if (!empty($mysql_time_sql)) { $sql = $sql . ' AND (' . $mysql_time_sql . ')'; } $result = $wpdb->get_results($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $urls = array(); foreach ($result as $item) { $url = wp_parse_url($item->referred); if (empty($url['host']) || stripos(get_bloginfo('url'), $url['host']) !== false) { continue; } $urls[] = $url['scheme'] . '://' . $url['host']; } $get_urls = array_count_values($urls); return count($get_urls); } /** * Checks if consent is required for collecting user statistics. * * This function evaluates several conditions that determine whether consent * is needed to collect and store user data for statistics purposes. If any * of the conditions are not met, it indicates that consent is required. * * @return bool Returns true if consent is required, false otherwise. * @since 14.10.1 */ function wp_statistics_needs_consent() { // Get the current status of the consent requirement $status = RequireConsent::getStatus(); // Check if consent is required if ($status == 'warning') { return true; // Consent is required } // Return false if consent is not required return false; } 美景 Archives ⋆ 晒鱼
Skip to content

晒鱼

– 活色生香 Wonderful Life –

  • 主页
  • 美食
  • 美景
  • 美剧
  • 美人
  • 美物
  • 美趣
  • 美居
  • 蔷薇闲居即事
  • 论坛
  • 搜索
  • 注册
  • 登录
  • 文章列表

分类: 美景

葡萄牙波尔图住宿推荐-亲身体验

我们这次在葡萄牙波尔图预计住宿4晚,4个月前就在booking上寻找酒店,为了能方便的游玩,我们选择了老城区一…

Read More

4K视频,暗夜保护区的日出 – 在暗夜保护区看彗星Torrance Barrens Dark Sky Preserve 1 – Sunrise

4K视频,暗夜保护区的日出 – 在暗夜保护区看彗星Torrance Barrens Dark Sk…

Read More

安省历史建筑:托马斯之家Thomas House

概要 Thomas House 最初位于现在的 Colborne Street 的 Cainsville 地区…

Read More

用Adobe Premiere 在延时摄影的照片合成里增加变形稳定器的方法

如何在你的延时摄影里是你的视频更平滑顺利的显示及播映? 在我们拍好延时摄影所用的图片后,会因为各种原因,导致最…

Read More

多伦多旅行指南,来都伦多需要到的25地方,自助旅游贴士

多伦多被认为是加拿大的大熔炉。据说居住在多伦多的人口中有一半是在国外出生的,这意味着许多不同的语言,景点和风味…

Read More

锡安国家公园旅游攻略 Zion Canyon National Park

转自:美旅通网 原文链接:https://www.meilvtong.com/viewthread.php?t…

Read More

火焰谷州立公园 Valley of Fire State Park

转自:美旅通网 原文链接:https://www.meilvtong.com/viewthread.php?t…

Read More

美国加州自由行之卡梅尔Carmel by the Sea小镇旅游攻略

我任行 卡梅尔小镇的英文名称是 Carmel by the Sea 小镇方圆1英里的范围内,聚集了大量有艺术范…

Read More

美国加州自驾游之大苏尔自驾攻略 Big Sur

我任行 Big Sur,常见中文译名是大苏尔或者大瑟尔  Big Sur 不是城镇名称,可简单理解为…

Read More

北美自驾游:加拿大十大拍摄点介绍

本文是又亨利斯撰写的。意在给摄影爱好者提供一些加拿大最好的拍摄点。亨利斯:亨利公司长期以来在加拿大的摄影行业中…

Read More

攻略 | 冰岛第1篇:上天易,入地难,火山口内部看一看?

攻略 | 冰岛第1篇:上天易,入地难,火山口内部看一看? 原创:muyihit 企鹅环游 2018.8.16-…

Read More

信息 | 值得入手的南极船票汇总

原创:muyihit 企鹅环游 目前我们已经帮103位南极群友搞定了2018-19的船票,2019-20南极季…

Read More

攻略 | 想去南极旅行?看这一篇就够了!

原创: 企鹅艺术家 企鹅环游 企鹅环游 微信号PenguinTravel 功能介绍Penguin Travel…

Read More

游记 | 百年帆船漫游北极斯瓦尔巴

原创:企鹅艺术家 企鹅环游 2018.9.9-19,企鹅环游分队在北极斯瓦尔巴探线10天。其中9.9-16和其…

Read More

信息 | 帆游北极:11天10晚斯瓦尔巴群岛

原创:muyihit  企鹅环游 话说2018.9.9-16我们组织了10个小伙伴一起坐帆…

Read More

美加西部的美景 – 我镜头里的2018

细细阅读此篇文章,既有美加西部著名景色的介绍,又有摄影师的拍摄心得,更难得的是摄影师坦露出来的心境:&#822…

Read More

冬日的加拿大班夫国家公园,美到极致才是真正的人间仙境!

转自 多伦多地产 大家都知道,加拿大自然风光无限,处处是美景。其中最出名的自然是班夫国家公园(Banff Na…

Read More

加拿大800里追枫之旅

旅拍加拿大 猫王       前言:前些天的一场暴风雪为2018年的秋…

Read More

有一种旅行叫旅拍!加拿大情侣游攻略

旅拍加拿大 猫王       提起旅拍可能大家并不陌生,不就是在旅行的时候拍拍照…

Read More

暗夜保护区-寻找多伦多最亮的星星

多伦多附近三个观星绝佳地点!寻找夜空中最亮的星 原创: 居居女孩 加国旅游购物攻略 微信号dushi-deal…

Read More

多伦多之夜(原创视频)

The Night of Toronto March, 2018 . Tomelitte.

文章导航

较旧文章

搜索

关键词

Canada DIY 做法 加拿大 攻略 菜谱 蔷薇闲居即事 食谱

近期文章

  • 2025年のベストゲームプラットフォームに関する専門家のレビュー – 注目すべき点
  • Fantastic Top Casino Opinion No deposit Bonus Rules 2025
  • 931572351759040360
  • 931572351759040360
  • 931572351759040360
  • 931572351759040360
  • Casino Online Fairspin em Portugal: Variedade de Jogos, Presentes, Experiência do Usuário
  • 阿冈昆公园两日行程的公路之旅:Kiosk、Brent 和 Achray 露营地
  • 一年后总结 – AI推荐:5只值得购买并长期持有的加拿大股票
  • HP OfficeJet Pro 8710 打印机无网络菜单 无法设置WiFi问题
  • 大疆域二不拍照问题
  • 2024年9月最新推出特斯拉推荐链接,让你省钱加元1300刀
  • 老式松下 RS-755S 开放式卷盘磁带录音机-开轮
  • AI推荐:5只值得购买并长期持有的加拿大股票
  • 2024 加拿大枫叶卡-永久居民 照片规格要求

专栏
渔夫拍世界 蔷薇闲居即事
加拿大 班夫
美国 印度 古巴

最佳手机计划推荐--- Public Mobile 40元/月60G数据美加墨共用,加拿大美国墨西哥漫游电话无限时任打,国际短信彩信无限量任发
输入优惠码(推荐码): E8P2EP 你就能接收10元返还 点击这里

The most cost-effective Public mobile phone 60G data plan $40 Canada Mexico USA
60 GB Data within Canada US Mexico at 5G Speed¹, Unlimited International Text and Picture Messaging, Voicemail & Call Display

The most cost-effective Public mobile 60G data plan $40
Public mobile promo refer code "E8P2EP" get $10 credit!,... 特斯拉推荐链接,让你省钱1300刀, 特斯拉库胖码, 特斯拉推荐码, 特斯拉推荐链接, 特斯拉折扣码, 特斯拉省钱代码, 特斯拉优惠码, 特斯拉优惠链接, 特斯拉省钱链接, 特斯拉优惠码

Airalo Referral code 推荐码 折扣码 优惠码 库胖码: JIN9547, 享3美元优惠.
Airalo coupon code Referral code: JIN9547. you can get $3 off.

推荐网站

dott.ca
89a.net
sayy.com
yeea.com
techome.ca
colormaple.com
Shop of Techome
Shop of Colormaple

PUBLICMOBILE手机计划推荐文章:

加拿大留学生手机通信公司、运营商选择指南及手机省钱计划推荐

加拿大最佳手机计划推荐用优惠码 ON9Q35,23元无限通话+全球短信+1GB 数据,Public mobile 还有很多好处,可使月费降为0元!

在加拿大的手机计划是如何做到月费$11元的

namelio.com NEW Customer coupon code “sayy” $1 off
domain search        domain pricing

Proudly powered by WordPress | Theme: Dyad 2 by WordPress.com.