init_hooks(); } /** * Initialize hooks */ private function init_hooks() { // Add columns to post and page lists add_filter('manage_posts_columns', array($this, 'add_columns')); add_filter('manage_pages_columns', array($this, 'add_columns')); // Populate column content add_action('manage_posts_custom_column', array($this, 'render_column_content'), 10, 2); add_action('manage_pages_custom_column', array($this, 'render_column_content'), 10, 2); // Make columns sortable add_filter('manage_edit-post_sortable_columns', array($this, 'make_sortable')); add_filter('manage_edit-page_sortable_columns', array($this, 'make_sortable')); // Handle sorting add_action('pre_get_posts', array($this, 'handle_sorting')); } /** * Add AEO/SEO columns */ public function add_columns($columns) { $new_columns = array(); foreach ($columns as $key => $value) { $new_columns[$key] = $value; // Add our columns after the title // Use unique identifiers to avoid conflicts with other plugins if ($key === 'title') { // Only add if not already present (avoid duplicates) if (!isset($columns['aeo_bob_aeo'])) { $new_columns['aeo_bob_aeo'] = __('AEO Bob', 'aeo-bob-lite'); } if (!isset($columns['aeo_bob_seo'])) { $new_columns['aeo_bob_seo'] = __('SEO Bob', 'aeo-bob-lite'); } } } return $new_columns; } /** * Render column content */ public function render_column_content($column, $post_id) { if (!in_array($column, array('aeo_bob_aeo', 'aeo_bob_seo'))) { return; } // Get scores from database $scores = $this->get_scores($post_id); if (!$scores) { echo '—'; return; } $score = $column === 'aeo_bob_aeo' ? $scores['aeo_score'] : $scores['seo_score']; $score = round($score); // Determine color class $color_class = 'poor'; if ($score >= 75) { $color_class = 'good'; } elseif ($score >= 50) { $color_class = 'fair'; } $label = $column === 'aeo_bob_aeo' ? 'AEO' : 'SEO'; $title = sprintf( /* translators: 1: score label (SEO or AEO), 2: numeric score from 0-100. */ __('%1$s Score: %2$d/100', 'aeo-bob-lite'), $label, $score ); printf( '%d', esc_attr($color_class), esc_attr($title), esc_html($score) ); } /** * Get scores from post meta (not database) */ private function get_scores($post_id) { $aeo_score = get_post_meta($post_id, '_aeo_bob_aeo_score', true); $seo_score = get_post_meta($post_id, '_aeo_bob_seo_score', true); return array( 'aeo_score' => $aeo_score ? intval($aeo_score) : 0, 'seo_score' => $seo_score ? intval($seo_score) : 0 ); } /** * Make columns sortable */ public function make_sortable($columns) { $columns['aeo_bob_aeo'] = 'aeo_bob_aeo'; $columns['aeo_bob_seo'] = 'aeo_bob_seo'; return $columns; } /** * Handle column sorting */ public function handle_sorting($query) { if (!is_admin() || !$query->is_main_query()) { return; } $orderby = $query->get('orderby'); if ($orderby === 'aeo_bob_aeo') { // Sort by AEO score meta $query->set('meta_key', '_aeo_bob_aeo_score'); $query->set('orderby', 'meta_value_num'); } elseif ($orderby === 'aeo_bob_seo') { // Sort by SEO score meta $query->set('meta_key', '_aeo_bob_seo_score'); $query->set('orderby', 'meta_value_num'); } } }