Files
igny8/igny8-ai-seo-wp-plugin/modules/components/kpi-tpl.php
2025-11-11 21:16:37 +05:00

141 lines
4.5 KiB
PHP

<?php
/**
* ==========================
* 🔐 IGNY8 FILE RULE HEADER
* ==========================
* @file : kpi-tpl.php
* @location : /modules/components/kpi-tpl.php
* @type : Component
* @scope : Cross-Module
* @allowed : KPI rendering, metrics display
* @reusability : Shared
* @notes : Dynamic KPI component for all modules
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
/**
* Get KPI data for a specific submodule
*
* @param string $table_id The table ID (e.g., 'planner_keywords')
* @param array $kpi_config The KPI configuration array
* @return array KPI data array
*/
function igny8_get_kpi_data($table_id, $kpi_config) {
global $wpdb;
$kpi_data = [];
// Get table name from table_id
$table_name = igny8_get_table_name($table_id);
if (empty($table_name) || empty($kpi_config)) {
return $kpi_data;
}
// Execute each KPI query
foreach ($kpi_config as $kpi_key => $kpi_info) {
if (!isset($kpi_info['query'])) {
continue;
}
// Replace placeholders with actual values
$query = str_replace('{table_name}', $table_name, $kpi_info['query']);
$query = str_replace('{prefix}', $wpdb->prefix, $query);
// Execute query safely
$result = $wpdb->get_var($query);
// Store result (handle null/empty results)
$kpi_data[$kpi_key] = $result !== null ? (int) $result : 0;
}
return $kpi_data;
}
/**
* Get actual table name from table ID
*
* @param string $table_id The table ID (e.g., 'planner_keywords')
* @return string The actual table name (e.g., 'wp_igny8_keywords')
*/
function igny8_get_table_name($table_id) {
global $wpdb;
// Map table IDs to actual table names
$table_mapping = [
'planner_home' => $wpdb->prefix . 'igny8_keywords', // Uses keywords table as base for home metrics
'planner_keywords' => $wpdb->prefix . 'igny8_keywords',
'planner_clusters' => $wpdb->prefix . 'igny8_clusters',
'planner_ideas' => $wpdb->prefix . 'igny8_content_ideas',
'writer_home' => $wpdb->prefix . 'igny8_content_ideas', // Uses ideas table as base for home metrics
'writer_drafts' => $wpdb->prefix . 'igny8_tasks',
'writer_published' => $wpdb->prefix . 'igny8_tasks',
'writer_templates' => $wpdb->prefix . 'igny8_prompts',
'writer_tasks' => $wpdb->prefix . 'igny8_tasks',
'optimizer_audits' => $wpdb->prefix . 'igny8_logs',
'optimizer_suggestions' => $wpdb->prefix . 'igny8_suggestions',
'linker_backlinks' => $wpdb->prefix . 'igny8_backlinks',
'linker_campaigns' => $wpdb->prefix . 'igny8_campaigns',
'linker_links' => $wpdb->prefix . 'igny8_links',
'personalize_rewrites' => $wpdb->prefix . 'igny8_variations',
'personalize_tones' => $wpdb->prefix . 'igny8_sites',
'personalize_data' => $wpdb->prefix . 'igny8_personalization',
'personalize_variations' => $wpdb->prefix . 'igny8_variations',
'personalize_records' => $wpdb->prefix . 'igny8_personalization',
'thinker_prompts' => '' // No table needed for prompts submodule
];
$table_name = $table_mapping[$table_id] ?? '';
// Throw error if unknown table ID (except for special cases that don't need tables)
if (empty($table_name) && !in_array($table_id, ['thinker_prompts'])) {
throw new InvalidArgumentException("Unknown table ID: {$table_id}");
}
return $table_name;
}
/**
* Check if a table exists in the database
*
* @param string $table_name The table name to check
* @return bool True if table exists, false otherwise
*/
function igny8_table_exists($table_name) {
global $wpdb;
$result = $wpdb->get_var($wpdb->prepare(
"SHOW TABLES LIKE %s",
$table_name
));
return $result === $table_name;
}
/**
* Get KPI data with fallback for missing tables
*
* @param string $table_id The table ID
* @param array $kpi_config The KPI configuration
* @return array KPI data array with fallback values
*/
function igny8_get_kpi_data_safe($table_id, $kpi_config) {
$table_name = igny8_get_table_name($table_id);
// If table doesn't exist, return empty data
if (!igny8_table_exists($table_name)) {
$fallback_data = [];
foreach ($kpi_config as $kpi_key => $kpi_info) {
$fallback_data[$kpi_key] = 0;
}
return $fallback_data;
}
// Get real data
return igny8_get_kpi_data($table_id, $kpi_config);
}