130 lines
3.4 KiB
PHP
130 lines
3.4 KiB
PHP
<?php
|
|
namespace BavarianRankEngine\Admin;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
class AdminMenu {
|
|
public function register(): void {
|
|
add_action( 'admin_menu', array( $this, 'add_menus' ) );
|
|
}
|
|
|
|
public function add_menus(): void {
|
|
add_menu_page(
|
|
__( 'Bavarian Rank Engine', 'bavarian-rank-engine' ),
|
|
__( 'Bavarian Rank', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bavarian-rank',
|
|
array( $this, 'render_dashboard' ),
|
|
'dashicons-chart-area',
|
|
80
|
|
);
|
|
|
|
// First submenu replaces the parent menu link
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
__( 'Dashboard', 'bavarian-rank-engine' ),
|
|
__( 'Dashboard', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bavarian-rank',
|
|
array( $this, 'render_dashboard' )
|
|
);
|
|
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
__( 'AI Provider', 'bavarian-rank-engine' ),
|
|
__( 'AI Provider', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bre-provider',
|
|
array( new ProviderPage(), 'render' )
|
|
);
|
|
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
__( 'Meta Generator', 'bavarian-rank-engine' ),
|
|
__( 'Meta Generator', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bre-meta',
|
|
array( new MetaPage(), 'render' )
|
|
);
|
|
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
'llms.txt',
|
|
'llms.txt',
|
|
'manage_options',
|
|
'bre-llms',
|
|
array( new LlmsPage(), 'render' )
|
|
);
|
|
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
__( 'Bulk Generator', 'bavarian-rank-engine' ),
|
|
__( 'Bulk Generator', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bre-bulk',
|
|
array( new BulkPage(), 'render' )
|
|
);
|
|
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
__( 'robots.txt / AI Bots', 'bavarian-rank-engine' ),
|
|
__( 'robots.txt', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bre-robots',
|
|
array( new RobotsPage(), 'render' )
|
|
);
|
|
|
|
add_submenu_page(
|
|
'bavarian-rank',
|
|
__( 'GEO Quick Overview', 'bavarian-rank-engine' ),
|
|
__( 'GEO Block', 'bavarian-rank-engine' ),
|
|
'manage_options',
|
|
'bre-geo',
|
|
array( new GeoPage(), 'render' )
|
|
);
|
|
}
|
|
|
|
public function render_dashboard(): void {
|
|
if ( ! current_user_can( 'manage_options' ) ) {
|
|
return;
|
|
}
|
|
|
|
$settings = SettingsPage::getSettings();
|
|
$provider = $settings['provider'] ?? 'openai';
|
|
$post_types = $settings['meta_post_types'] ?? array( 'post', 'page' );
|
|
$meta_stats = $this->get_meta_stats( $post_types );
|
|
|
|
include BRE_DIR . 'includes/Admin/views/dashboard.php';
|
|
}
|
|
|
|
private function get_meta_stats( array $post_types ): array {
|
|
global $wpdb;
|
|
$stats = array();
|
|
foreach ( $post_types as $pt ) {
|
|
$total = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
|
$wpdb->prepare(
|
|
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'publish'",
|
|
$pt
|
|
)
|
|
);
|
|
$with_meta = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
|
$wpdb->prepare(
|
|
"SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
|
|
INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
|
|
WHERE p.post_type = %s AND p.post_status = 'publish'
|
|
AND pm.meta_key = %s AND pm.meta_value != ''",
|
|
$pt,
|
|
'_bre_meta_description'
|
|
)
|
|
);
|
|
$stats[ $pt ] = array(
|
|
'total' => $total,
|
|
'with_meta' => $with_meta,
|
|
'pct' => $total > 0 ? round( ( $with_meta / $total ) * 100 ) : 0,
|
|
);
|
|
}
|
|
return $stats;
|
|
}
|
|
}
|