$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); }