class CTA_Dashboard {
public function __construct() {
add_action('admin_menu', [$this, 'menu']);
}
/* =====================================================
* MENU
* ===================================================== */
public function menu() {
add_menu_page(
'CTA Analytics',
'CTA Analytics',
'manage_options',
'cta-analytics',
[$this, 'render_router'],
'dashicons-chart-line',
26
);
}
/* =====================================================
* ROUTER (dashboard / detail)
* ===================================================== */
public function render_router() {
if (!empty($_GET['cta_key'])) {
$this->render_detail();
} else {
$this->render_dashboard();
}
}
/* =====================================================
* DASHBOARD
* ===================================================== */
public function render_dashboard() {
global $wpdb;
$table = $wpdb->prefix . 'cta_stats';
$from = $_GET['from'] ?? date('Y-m-07');
$to = $_GET['to'] ?? date('Y-m-d');
$rows = $wpdb->get_results($wpdb->prepare("
SELECT
cta_key,
SUM(views) as views,
SUM(clicks) as clicks,
ROUND(SUM(clicks)/SUM(views)*100,2) as ctr
FROM $table
WHERE created_date BETWEEN %s AND %s
GROUP BY cta_key
HAVING views > 0
ORDER BY clicks DESC
LIMIT 50
", $from, $to));
echo '
';
echo '
📊 CTA Analytics
';
echo '
';
echo '
| CTA Key |
Views |
Clicks |
CTR (%) |
URL |
';
if ($rows) {
foreach ($rows as $r) {
$link = admin_url('admin.php?page=cta-analytics&cta_key=' . urlencode($r->cta_key));
echo "
| {$r->cta_key} |
{$r->views} |
{$r->clicks} |
{$r->ctr}% |
Xem link |
";
}
} else {
echo '| Không có dữ liệu |
';
}
echo '
';
echo '
';
}
/* =====================================================
* DETAIL PAGE (LIST URL)
* ===================================================== */
private function render_detail() {
global $wpdb;
$table = $wpdb->prefix . 'cta_stats';
$cta_key = sanitize_text_field($_GET['cta_key']);
// ===== PAGINATION =====
$paged = max(1, intval($_GET['paged'] ?? 1));
$per_page = 20;
$offset = ($paged - 1) * $per_page;
// ===== TOTAL =====
$total = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(DISTINCT post_url)
FROM $table
WHERE cta_key = %s
", $cta_key));
// ===== DATA =====
$rows = $wpdb->get_results($wpdb->prepare("
SELECT
post_url,
MAX(post_title) as post_title,
SUM(views) as views,
SUM(clicks) as clicks
FROM $table
WHERE cta_key = %s
GROUP BY post_url
ORDER BY clicks DESC
LIMIT %d OFFSET %d
", $cta_key, $per_page, $offset));
echo '';
echo "
🔗 Danh sách URL – {$cta_key}
";
echo '
← Quay lại';
echo '
';
echo '
| Tiêu đề |
URL |
Views |
Clicks |
';
if ($rows) {
foreach ($rows as $r) {
echo "
| {$r->post_title} |
{$r->post_url} |
{$r->views} |
{$r->clicks} |
";
}
} else {
echo '| Không có dữ liệu |
';
}
echo '
';
// ===== PAGINATION =====
$total_pages = ceil($total / $per_page);
if ($total_pages > 1) {
echo '
';
for ($i = 1; $i <= $total_pages; $i++) {
$url = admin_url('admin.php?page=cta-analytics&cta_key=' . urlencode($cta_key) . '&paged=' . $i);
$active = ($i == $paged) ? 'style="font-weight:bold;"' : '';
echo "
{$i}";
}
echo '
';
}
echo '
';
}
}