plugin_name = $plugin_name; $this->version = $version; $this->core = $core; } public function render_tab() { ?>
render_frozen_links_report(); ?>

' . esc_html__('Links Report', 'ailinkmaster-internal-auto-manager') . '

'; $cache_key = 'ailm_all_link_rules'; $rules = wp_cache_get($cache_key, 'ailm_cache_group'); if (false === $rules) { if (class_exists('AILM_Link_Repository')) { $rules = AILM_Link_Repository::get_all_rules(); } else { $rules = []; } wp_cache_set($cache_key, $rules, 'ailm_cache_group', HOUR_IN_SECONDS); } if (empty($rules)) { echo '

' . esc_html__('No links found in the database. Run "Apply & Freeze" or wait for the daily background job.', 'ailinkmaster-internal-auto-manager') . '

'; return; } $stats = ['urls' => [], 'cats' => [], 'tags' => [], 'total_links' => 0]; foreach ($rules as $rule) { if (empty($rule->target_url)) { continue; } $url = strtok($rule->target_url, '?'); if (empty($url)) { continue; } if (!isset($stats['urls'][$url])) { $stats['urls'][$url] = 0; } $stats['urls'][$url]++; $stats['total_links']++; } $final_stats = []; foreach ($stats['urls'] as $url => $count) { $id = url_to_postid($url); $final_stats[] = ['url' => $url, 'title' => $id ? html_entity_decode(get_the_title($id), ENT_QUOTES, 'UTF-8') : $url, 'count' => $count]; if (!$id) continue; $terms = get_the_terms($id, 'category'); if ($terms && !is_wp_error($terms)) foreach ($terms as $t) $stats['cats'][$t->name] = ($stats['cats'][$t->name] ?? 0) + $count; $terms = get_the_terms($id, 'post_tag'); if ($terms && !is_wp_error($terms)) foreach ($terms as $t) $stats['tags'][$t->name] = ($stats['tags'][$t->name] ?? 0) + $count; } // Sort recipients from largest to smallest usort($final_stats, function ($a, $b) { return $b['count'] - $a['count']; }); arsort($stats['cats']); arsort($stats['tags']); echo '
'; // Block 1: By Categories echo '

' . esc_html__('By Category', 'ailinkmaster-internal-auto-manager') . '

'; foreach (array_slice($stats['cats'], 0, 20, true) as $name => $cnt) echo ''; echo '
' . esc_html__('Category', 'ailinkmaster-internal-auto-manager') . '' . esc_html__('Links', 'ailinkmaster-internal-auto-manager') . '
' . esc_html($name) . '' . esc_html(number_format_i18n($cnt)) . '
'; // Block 2: By Tags echo '

' . esc_html__('By Tag', 'ailinkmaster-internal-auto-manager') . '

'; foreach (array_slice($stats['tags'], 0, 20, true) as $name => $cnt) echo ''; echo '
' . esc_html__('Tag', 'ailinkmaster-internal-auto-manager') . '' . esc_html__('Links', 'ailinkmaster-internal-auto-manager') . '
' . esc_html($name) . '' . esc_html(number_format_i18n($cnt)) . '
'; // Block 3: Top articles (Dynamic Pagination) echo '
'; echo '
'; echo '

' . esc_html__('Top Recipients (from Frozen Links)', 'ailinkmaster-internal-auto-manager') . '

' . esc_html__('Total frozen links:', 'ailinkmaster-internal-auto-manager') . ' ' . esc_html(number_format_i18n($stats['total_links'])) . '  |  ' . esc_html__('Total unique articles linked to:', 'ailinkmaster-internal-auto-manager') . ' ' . esc_html(count($stats['urls'])) . '

'; // Pagination control for recipients echo '
'; echo ''; echo ''; echo '' . esc_html__('1 of 1', 'ailinkmaster-internal-auto-manager') . ''; echo ''; echo '
'; echo '
'; echo '
'; echo ''; echo '
' . esc_html__('Article', 'ailinkmaster-internal-auto-manager') . '' . esc_html__('Links', 'ailinkmaster-internal-auto-manager') . '
' . esc_html__('Loading data...', 'ailinkmaster-internal-auto-manager') . '
'; echo '
'; // Close grid echo '
' . esc_html__('← Back', 'ailinkmaster-internal-auto-manager') . ''; // INJECT JSON DATA FOR JS (Safe encoding) echo ''; } }