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