prefix . 'aa_counter'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, ip varchar(50) NOT NULL, country varchar(25) NOT NULL, visit int(11) DEFAULT 1, last_visit datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY ip (ip) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } // Get user IP address function aa_get_user_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; } return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : ''; } // Track visitor function aa_track_visitor() { if (is_admin() || defined('DOING_AJAX') && DOING_AJAX) { return; } global $wpdb; $table_name = $wpdb->prefix . 'aa_counter'; $user_ip = aa_get_user_ip(); if (empty($user_ip)) { return; } $response = wp_remote_get('http://ip-api.com/json/' . $user_ip); if (is_wp_error($response)) { return; } $data = json_decode(wp_remote_retrieve_body($response)); $user_country = isset($data->countryCode) ? sanitize_text_field($data->countryCode) : 'Unknown'; $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE ip = %s", $user_ip)); $current_time = current_time('mysql'); if ($row === null) { $wpdb->insert( $table_name, array( 'ip' => $user_ip, 'country' => $user_country, 'last_visit' => $current_time ), array('%s', '%s', '%s') ); } else { $wpdb->update( $table_name, array( 'visit' => $row->visit + 1, 'last_visit' => $current_time ), array('ip' => $user_ip), array('%d', '%s'), array('%s') ); } } add_action('template_redirect', 'aa_track_visitor'); // Visitor Counter Widget class AA_Counter_Widget extends WP_Widget { public function __construct() { parent::__construct( 'aa_counter', __('Visitor Counter', 'aa-counter'), array('description' => __('Displays visitor counts by country', 'aa-counter')) ); } public function widget($args, $instance) { echo $args['before_widget']; if (!empty($instance['title'])) { echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title']; } global $wpdb; $table_name = $wpdb->prefix . 'aa_counter'; $results = $wpdb->get_results( "SELECT country, COUNT(*) AS total FROM $table_name GROUP BY country ORDER BY total DESC" ); if (!empty($results)) { echo ''; } else { echo '

' . esc_html__('No visitor data yet.', 'aa-counter') . '

'; } echo $args['after_widget']; } public function form($instance) { $title = !empty($instance['title']) ? $instance['title'] : __('Visitor Counter', 'aa-counter'); ?>

prefix . 'aa_counter'; $wpdb->query("TRUNCATE TABLE $table_name"); echo '

' . esc_html__('Visitor counter has been reset.', 'aa-counter') . '

'; } wp_nonce_field('aa_counter_reset'); submit_button(__('Reset Counter Data', 'aa-counter'), 'delete', 'reset_counter'); ?>

prefix . 'aa_counter'; $total_visitors = (int) $wpdb->get_var("SELECT COUNT(*) FROM $table_name"); $unique_countries = (int) $wpdb->get_var("SELECT COUNT(DISTINCT country) FROM $table_name"); $last_visit = $wpdb->get_var("SELECT MAX(last_visit) FROM $table_name"); echo '

' . sprintf(__('Total unique visitors: %d', 'aa-counter'), $total_visitors) . '

'; echo '

' . sprintf(__('Countries represented: %d', 'aa-counter'), $unique_countries) . '

'; if ($last_visit) { echo '

' . sprintf( __('Last recorded visit: %s', 'aa-counter'), esc_html(date_i18n(get_option('date_format') . ' ' . get_option('time_format'), strtotime($last_visit))) ) . '

'; } ?>