Initial commit: PRAutoBlogger v0.1.0 with frontend posts widget

This commit is contained in:
Terence Ong
2026-04-10 23:33:42 +07:00
parent 68c6f67bcf
commit 88d674d679
65 changed files with 2178 additions and 1084 deletions

View File

@@ -2,7 +2,7 @@
/**
* Log viewer template — displays structured application log entries.
*
* Variables from Autoblogger_Log_Viewer::render_page():
* Variables from PRAutoBlogger_Log_Viewer::render_page():
* $rows — array of log entry rows.
* $total — total matching entries.
* $total_pages — total pages.
@@ -17,30 +17,30 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$base_url = admin_url( 'admin.php?page=autoblogger-logs' );
$base_url = admin_url( 'admin.php?page=prautoblogger-logs' );
$level_counts = [
'all' => __( 'All', 'autoblogger' ),
'error' => __( 'Errors', 'autoblogger' ),
'warning' => __( 'Warnings', 'autoblogger' ),
'info' => __( 'Info', 'autoblogger' ),
'debug' => __( 'Debug', 'autoblogger' ),
'all' => __( 'All', 'prautoblogger' ),
'error' => __( 'Errors', 'prautoblogger' ),
'warning' => __( 'Warnings', 'prautoblogger' ),
'info' => __( 'Info', 'prautoblogger' ),
'debug' => __( 'Debug', 'prautoblogger' ),
];
?>
<div class="wrap ab-wrap">
<div class="ab-header">
<div class="ab-header-left">
<span class="dashicons dashicons-list-view ab-header-icon"></span>
<h1 class="ab-header-title"><?php esc_html_e( 'Activity Log', 'autoblogger' ); ?></h1>
<h1 class="ab-header-title"><?php esc_html_e( 'Activity Log', 'prautoblogger' ); ?></h1>
</div>
<div class="ab-header-actions">
<button type="button" id="autoblogger-clear-logs" class="ab-btn ab-btn-outline" data-nonce="<?php echo esc_attr( wp_create_nonce( 'autoblogger_clear_logs' ) ); ?>">
<button type="button" id="prautoblogger-clear-logs" class="ab-btn ab-btn-outline" data-nonce="<?php echo esc_attr( wp_create_nonce( 'prautoblogger_clear_logs' ) ); ?>">
<span class="dashicons dashicons-trash"></span>
<?php esc_html_e( 'Clear Logs (30d+)', 'autoblogger' ); ?>
<?php esc_html_e( 'Clear Logs (30d+)', 'prautoblogger' ); ?>
</button>
</div>
</div>
<div id="autoblogger-log-status" class="hidden"></div>
<div id="prautoblogger-log-status" class="hidden"></div>
<!-- Filters -->
<div class="ab-log-filters">
@@ -54,10 +54,10 @@ $level_counts = [
</div>
<form method="get" action="<?php echo esc_url( $base_url ); ?>" class="ab-log-search">
<input type="hidden" name="page" value="autoblogger-logs" />
<input type="hidden" name="page" value="prautoblogger-logs" />
<input type="hidden" name="level" value="<?php echo esc_attr( $level ); ?>" />
<input type="text" name="s" value="<?php echo esc_attr( $search ); ?>" placeholder="<?php esc_attr_e( 'Search logs...', 'autoblogger' ); ?>" class="ab-input ab-log-search-input" />
<button type="submit" class="ab-btn ab-btn-outline ab-btn-small"><?php esc_html_e( 'Search', 'autoblogger' ); ?></button>
<input type="text" name="s" value="<?php echo esc_attr( $search ); ?>" placeholder="<?php esc_attr_e( 'Search logs...', 'prautoblogger' ); ?>" class="ab-input ab-log-search-input" />
<button type="submit" class="ab-btn ab-btn-outline ab-btn-small"><?php esc_html_e( 'Search', 'prautoblogger' ); ?></button>
</form>
</div>
@@ -66,7 +66,7 @@ $level_counts = [
<?php
printf(
/* translators: %s: total count */
esc_html__( '%s entries found', 'autoblogger' ),
esc_html__( '%s entries found', 'prautoblogger' ),
'<strong>' . esc_html( number_format( $total ) ) . '</strong>'
);
?>
@@ -75,16 +75,16 @@ $level_counts = [
<?php if ( empty( $rows ) ) : ?>
<div class="ab-log-empty">
<span class="dashicons dashicons-yes-alt"></span>
<p><?php esc_html_e( 'No log entries match your filters.', 'autoblogger' ); ?></p>
<p><?php esc_html_e( 'No log entries match your filters.', 'prautoblogger' ); ?></p>
</div>
<?php else : ?>
<table class="widefat striped ab-log-table">
<thead>
<tr>
<th class="ab-log-col-level"><?php esc_html_e( 'Level', 'autoblogger' ); ?></th>
<th class="ab-log-col-time"><?php esc_html_e( 'Time', 'autoblogger' ); ?></th>
<th class="ab-log-col-context"><?php esc_html_e( 'Context', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Message', 'autoblogger' ); ?></th>
<th class="ab-log-col-level"><?php esc_html_e( 'Level', 'prautoblogger' ); ?></th>
<th class="ab-log-col-time"><?php esc_html_e( 'Time', 'prautoblogger' ); ?></th>
<th class="ab-log-col-context"><?php esc_html_e( 'Context', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Message', 'prautoblogger' ); ?></th>
</tr>
</thead>
<tbody>
@@ -105,7 +105,7 @@ $level_counts = [
<td>
<?php echo esc_html( $row['message'] ?? '' ); ?>
<?php if ( ! empty( $row['meta_json'] ) ) : ?>
<button type="button" class="ab-log-meta-toggle" title="<?php esc_attr_e( 'Show details', 'autoblogger' ); ?>">
<button type="button" class="ab-log-meta-toggle" title="<?php esc_attr_e( 'Show details', 'prautoblogger' ); ?>">
<span class="dashicons dashicons-arrow-down-alt2"></span>
</button>
<pre class="ab-log-meta"><?php echo esc_html( wp_json_encode( json_decode( $row['meta_json'], true ), JSON_PRETTY_PRINT ) ); ?></pre>

View File

@@ -1,6 +1,6 @@
<?php
/**
* Post metabox template showing AutoBlogger generation metadata.
* Post metabox template showing PRAutoBlogger generation metadata.
*
* @see admin/class-post-metabox.php — Renders this template.
*
@@ -12,63 +12,63 @@ if ( ! defined( 'ABSPATH' ) ) {
}
$meta = [
'topic' => get_post_meta( $post->ID, '_autoblogger_topic', true ),
'type' => get_post_meta( $post->ID, '_autoblogger_article_type', true ),
'model' => get_post_meta( $post->ID, '_autoblogger_model_used', true ),
'pipeline' => get_post_meta( $post->ID, '_autoblogger_pipeline_mode', true ),
'verdict' => get_post_meta( $post->ID, '_autoblogger_editor_verdict', true ),
'editor_notes' => get_post_meta( $post->ID, '_autoblogger_editor_notes', true ),
'quality_score' => get_post_meta( $post->ID, '_autoblogger_quality_score', true ),
'seo_score' => get_post_meta( $post->ID, '_autoblogger_seo_score', true ),
'generated_at' => get_post_meta( $post->ID, '_autoblogger_generated_at', true ),
'keywords' => get_post_meta( $post->ID, '_autoblogger_target_keywords', true ),
'topic' => get_post_meta( $post->ID, '_prautoblogger_topic', true ),
'type' => get_post_meta( $post->ID, '_prautoblogger_article_type', true ),
'model' => get_post_meta( $post->ID, '_prautoblogger_model_used', true ),
'pipeline' => get_post_meta( $post->ID, '_prautoblogger_pipeline_mode', true ),
'verdict' => get_post_meta( $post->ID, '_prautoblogger_editor_verdict', true ),
'editor_notes' => get_post_meta( $post->ID, '_prautoblogger_editor_notes', true ),
'quality_score' => get_post_meta( $post->ID, '_prautoblogger_quality_score', true ),
'seo_score' => get_post_meta( $post->ID, '_prautoblogger_seo_score', true ),
'generated_at' => get_post_meta( $post->ID, '_prautoblogger_generated_at', true ),
'keywords' => get_post_meta( $post->ID, '_prautoblogger_target_keywords', true ),
];
?>
<div class="autoblogger-metabox">
<div class="prautoblogger-metabox">
<p>
<strong><?php esc_html_e( 'Generated:', 'autoblogger' ); ?></strong>
<?php echo esc_html( $meta['generated_at'] ?: __( 'Unknown', 'autoblogger' ) ); ?>
<strong><?php esc_html_e( 'Generated:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( $meta['generated_at'] ?: __( 'Unknown', 'prautoblogger' ) ); ?>
</p>
<p>
<strong><?php esc_html_e( 'Topic:', 'autoblogger' ); ?></strong>
<strong><?php esc_html_e( 'Topic:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( $meta['topic'] ?: '—' ); ?>
</p>
<p>
<strong><?php esc_html_e( 'Type:', 'autoblogger' ); ?></strong>
<strong><?php esc_html_e( 'Type:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( ucfirst( $meta['type'] ?: 'article' ) ); ?>
</p>
<p>
<strong><?php esc_html_e( 'Model:', 'autoblogger' ); ?></strong>
<strong><?php esc_html_e( 'Model:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( $meta['model'] ?: '—' ); ?>
</p>
<p>
<strong><?php esc_html_e( 'Pipeline:', 'autoblogger' ); ?></strong>
<?php echo esc_html( 'multi_step' === $meta['pipeline'] ? __( 'Multi-step', 'autoblogger' ) : __( 'Single-pass', 'autoblogger' ) ); ?>
<strong><?php esc_html_e( 'Pipeline:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( 'multi_step' === $meta['pipeline'] ? __( 'Multi-step', 'prautoblogger' ) : __( 'Single-pass', 'prautoblogger' ) ); ?>
</p>
<p>
<strong><?php esc_html_e( 'Editor Verdict:', 'autoblogger' ); ?></strong>
<span class="autoblogger-verdict-<?php echo esc_attr( $meta['verdict'] ?: 'unknown' ); ?>">
<?php echo esc_html( ucfirst( $meta['verdict'] ?: __( 'Unknown', 'autoblogger' ) ) ); ?>
<strong><?php esc_html_e( 'Editor Verdict:', 'prautoblogger' ); ?></strong>
<span class="prautoblogger-verdict-<?php echo esc_attr( $meta['verdict'] ?: 'unknown' ); ?>">
<?php echo esc_html( ucfirst( $meta['verdict'] ?: __( 'Unknown', 'prautoblogger' ) ) ); ?>
</span>
</p>
<?php if ( $meta['quality_score'] ) : ?>
<p>
<strong><?php esc_html_e( 'Quality:', 'autoblogger' ); ?></strong>
<strong><?php esc_html_e( 'Quality:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( number_format( (float) $meta['quality_score'] * 100, 0 ) ); ?>%
&nbsp;|&nbsp;
<strong><?php esc_html_e( 'SEO:', 'autoblogger' ); ?></strong>
<strong><?php esc_html_e( 'SEO:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( number_format( (float) $meta['seo_score'] * 100, 0 ) ); ?>%
</p>
<?php endif; ?>
<?php if ( $meta['editor_notes'] ) : ?>
<p>
<strong><?php esc_html_e( 'Editor Notes:', 'autoblogger' ); ?></strong><br>
<strong><?php esc_html_e( 'Editor Notes:', 'prautoblogger' ); ?></strong><br>
<?php echo esc_html( $meta['editor_notes'] ); ?>
</p>
<?php endif; ?>
<?php if ( $meta['keywords'] ) : ?>
<p>
<strong><?php esc_html_e( 'Keywords:', 'autoblogger' ); ?></strong>
<strong><?php esc_html_e( 'Keywords:', 'prautoblogger' ); ?></strong>
<?php echo esc_html( implode( ', ', json_decode( $meta['keywords'], true ) ?: [] ) ); ?>
</p>
<?php endif; ?>

View File

@@ -9,9 +9,9 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$cost_tracker = new Autoblogger_Cost_Tracker();
$cost_tracker = new PRAutoBlogger_Cost_Tracker();
$monthly_spend = $cost_tracker->get_monthly_spend();
$budget = (float) get_option( 'autoblogger_monthly_budget_usd', 50.00 );
$budget = (float) get_option( 'prautoblogger_monthly_budget_usd', 50.00 );
$utilization = $cost_tracker->get_budget_utilization();
$daily_spend = $cost_tracker->get_daily_spend( 30 );
@@ -19,64 +19,64 @@ $first_of_month = gmdate( 'Y-m-01' );
$today = gmdate( 'Y-m-d' );
$stage_breakdown = $cost_tracker->get_spend_by_stage( $first_of_month, $today );
?>
<div class="wrap autoblogger-metrics">
<h1><?php esc_html_e( 'AutoBlogger — Metrics & Costs', 'autoblogger' ); ?></h1>
<div class="wrap prautoblogger-metrics">
<h1><?php esc_html_e( 'PRAutoBlogger — Metrics & Costs', 'prautoblogger' ); ?></h1>
<!-- Budget Overview Cards -->
<div class="autoblogger-cards">
<div class="autoblogger-card">
<h3><?php esc_html_e( 'Monthly Spend', 'autoblogger' ); ?></h3>
<div class="autoblogger-card-value">
<div class="prautoblogger-cards">
<div class="prautoblogger-card">
<h3><?php esc_html_e( 'Monthly Spend', 'prautoblogger' ); ?></h3>
<div class="prautoblogger-card-value">
$<?php echo esc_html( number_format( $monthly_spend, 4 ) ); ?>
</div>
<div class="autoblogger-card-sub">
<div class="prautoblogger-card-sub">
<?php
printf(
/* translators: %s: budget amount */
esc_html__( 'of $%s budget', 'autoblogger' ),
esc_html__( 'of $%s budget', 'prautoblogger' ),
esc_html( number_format( $budget, 2 ) )
);
?>
</div>
</div>
<div class="autoblogger-card <?php echo $utilization >= 100 ? 'autoblogger-card-danger' : ( $utilization >= 80 ? 'autoblogger-card-warning' : '' ); ?>">
<h3><?php esc_html_e( 'Budget Used', 'autoblogger' ); ?></h3>
<div class="autoblogger-card-value">
<div class="prautoblogger-card <?php echo $utilization >= 100 ? 'prautoblogger-card-danger' : ( $utilization >= 80 ? 'prautoblogger-card-warning' : '' ); ?>">
<h3><?php esc_html_e( 'Budget Used', 'prautoblogger' ); ?></h3>
<div class="prautoblogger-card-value">
<?php echo esc_html( number_format( $utilization, 1 ) ); ?>%
</div>
<div class="autoblogger-budget-bar">
<div class="autoblogger-budget-fill" style="width: <?php echo esc_attr( (string) min( 100, $utilization ) ); ?>%"></div>
<div class="prautoblogger-budget-bar">
<div class="prautoblogger-budget-fill" style="width: <?php echo esc_attr( (string) min( 100, $utilization ) ); ?>%"></div>
</div>
</div>
<div class="autoblogger-card">
<h3><?php esc_html_e( 'Next Generation', 'autoblogger' ); ?></h3>
<div class="autoblogger-card-value autoblogger-card-value-small">
<div class="prautoblogger-card">
<h3><?php esc_html_e( 'Next Generation', 'prautoblogger' ); ?></h3>
<div class="prautoblogger-card-value prautoblogger-card-value-small">
<?php
$next_run = wp_next_scheduled( 'autoblogger_daily_generation' );
$next_run = wp_next_scheduled( 'prautoblogger_daily_generation' );
echo false !== $next_run
? esc_html( wp_date( 'M j, g:i A', $next_run ) )
: esc_html__( 'Not scheduled', 'autoblogger' );
: esc_html__( 'Not scheduled', 'prautoblogger' );
?>
</div>
</div>
</div>
<!-- Cost by Stage -->
<h2><?php esc_html_e( 'Cost by Pipeline Stage (This Month)', 'autoblogger' ); ?></h2>
<h2><?php esc_html_e( 'Cost by Pipeline Stage (This Month)', 'prautoblogger' ); ?></h2>
<table class="widefat striped">
<thead>
<tr>
<th><?php esc_html_e( 'Stage', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'API Calls', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Total Tokens', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Cost (USD)', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Stage', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'API Calls', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Total Tokens', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Cost (USD)', 'prautoblogger' ); ?></th>
</tr>
</thead>
<tbody>
<?php if ( empty( $stage_breakdown ) ) : ?>
<tr><td colspan="4"><?php esc_html_e( 'No data yet.', 'autoblogger' ); ?></td></tr>
<tr><td colspan="4"><?php esc_html_e( 'No data yet.', 'prautoblogger' ); ?></td></tr>
<?php else : ?>
<?php foreach ( $stage_breakdown as $stage => $data ) : ?>
<tr>
@@ -91,17 +91,17 @@ $stage_breakdown = $cost_tracker->get_spend_by_stage( $first_of_month, $today );
</table>
<!-- Daily Spend Chart (simple HTML table — upgrade to Chart.js later) -->
<h2><?php esc_html_e( 'Daily Spend (Last 30 Days)', 'autoblogger' ); ?></h2>
<h2><?php esc_html_e( 'Daily Spend (Last 30 Days)', 'prautoblogger' ); ?></h2>
<table class="widefat striped">
<thead>
<tr>
<th><?php esc_html_e( 'Date', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Cost (USD)', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Date', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Cost (USD)', 'prautoblogger' ); ?></th>
</tr>
</thead>
<tbody>
<?php if ( empty( $daily_spend ) ) : ?>
<tr><td colspan="2"><?php esc_html_e( 'No data yet.', 'autoblogger' ); ?></td></tr>
<tr><td colspan="2"><?php esc_html_e( 'No data yet.', 'prautoblogger' ); ?></td></tr>
<?php else : ?>
<?php foreach ( array_reverse( $daily_spend, true ) as $date => $cost ) : ?>
<tr>

View File

@@ -2,7 +2,7 @@
/**
* Review queue template — lists generated drafts awaiting editorial approval.
*
* Variables available from Autoblogger_Review_Queue::render_page():
* Variables available from PRAutoBlogger_Review_Queue::render_page():
* $query (WP_Query) — the pending draft posts.
*
* @see admin/class-review-queue.php — Renders this template.
@@ -12,11 +12,11 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$bulk_done = isset( $_GET['autoblogger_bulk_done'] ) ? absint( $_GET['autoblogger_bulk_done'] ) : 0;
$bulk_type = isset( $_GET['autoblogger_bulk_type'] ) ? sanitize_text_field( wp_unslash( $_GET['autoblogger_bulk_type'] ) ) : '';
$bulk_done = isset( $_GET['prautoblogger_bulk_done'] ) ? absint( $_GET['prautoblogger_bulk_done'] ) : 0;
$bulk_type = isset( $_GET['prautoblogger_bulk_type'] ) ? sanitize_text_field( wp_unslash( $_GET['prautoblogger_bulk_type'] ) ) : '';
?>
<div class="wrap autoblogger-review-queue">
<h1><?php esc_html_e( 'AutoBlogger — Review Queue', 'autoblogger' ); ?></h1>
<div class="wrap prautoblogger-review-queue">
<h1><?php esc_html_e( 'PRAutoBlogger — Review Queue', 'prautoblogger' ); ?></h1>
<?php if ( $bulk_done > 0 && '' !== $bulk_type ) : ?>
<div class="notice notice-success is-dismissible">
@@ -25,13 +25,13 @@ $bulk_type = isset( $_GET['autoblogger_bulk_type'] ) ? sanitize_text_field( wp_u
if ( 'approve' === $bulk_type ) {
printf(
/* translators: %d: number of posts */
esc_html( _n( '%d post published.', '%d posts published.', $bulk_done, 'autoblogger' ) ),
esc_html( _n( '%d post published.', '%d posts published.', $bulk_done, 'prautoblogger' ) ),
$bulk_done
);
} else {
printf(
/* translators: %d: number of posts */
esc_html( _n( '%d post rejected.', '%d posts rejected.', $bulk_done, 'autoblogger' ) ),
esc_html( _n( '%d post rejected.', '%d posts rejected.', $bulk_done, 'prautoblogger' ) ),
$bulk_done
);
}
@@ -40,71 +40,71 @@ $bulk_type = isset( $_GET['autoblogger_bulk_type'] ) ? sanitize_text_field( wp_u
</div>
<?php endif; ?>
<div id="autoblogger-queue-status" class="autoblogger-status-message hidden"></div>
<div id="prautoblogger-queue-status" class="prautoblogger-status-message hidden"></div>
<?php if ( ! $query->have_posts() ) : ?>
<div class="autoblogger-empty-queue">
<p><?php esc_html_e( 'No generated drafts awaiting review. New posts will appear here after the next generation run.', 'autoblogger' ); ?></p>
<div class="prautoblogger-empty-queue">
<p><?php esc_html_e( 'No generated drafts awaiting review. New posts will appear here after the next generation run.', 'prautoblogger' ); ?></p>
</div>
<?php else : ?>
<form method="post" id="autoblogger-review-form">
<?php wp_nonce_field( 'autoblogger_review_queue_bulk', 'autoblogger_review_nonce' ); ?>
<form method="post" id="prautoblogger-review-form">
<?php wp_nonce_field( 'prautoblogger_review_queue_bulk', 'prautoblogger_review_nonce' ); ?>
<div class="autoblogger-queue-toolbar">
<div class="prautoblogger-queue-toolbar">
<label>
<input type="checkbox" id="autoblogger-select-all" />
<?php esc_html_e( 'Select All', 'autoblogger' ); ?>
<input type="checkbox" id="prautoblogger-select-all" />
<?php esc_html_e( 'Select All', 'prautoblogger' ); ?>
</label>
<button type="submit" name="autoblogger_bulk_action" value="approve" class="button button-primary">
<?php esc_html_e( 'Approve Selected', 'autoblogger' ); ?>
<button type="submit" name="prautoblogger_bulk_action" value="approve" class="button button-primary">
<?php esc_html_e( 'Approve Selected', 'prautoblogger' ); ?>
</button>
<button type="submit" name="autoblogger_bulk_action" value="reject" class="button">
<?php esc_html_e( 'Reject Selected', 'autoblogger' ); ?>
<button type="submit" name="prautoblogger_bulk_action" value="reject" class="button">
<?php esc_html_e( 'Reject Selected', 'prautoblogger' ); ?>
</button>
<span class="autoblogger-queue-count">
<span class="prautoblogger-queue-count">
<?php
printf(
/* translators: %d: number of drafts */
esc_html( _n( '%d draft', '%d drafts', $query->found_posts, 'autoblogger' ) ),
esc_html( _n( '%d draft', '%d drafts', $query->found_posts, 'prautoblogger' ) ),
$query->found_posts
);
?>
</span>
</div>
<table class="widefat striped autoblogger-queue-table">
<table class="widefat striped prautoblogger-queue-table">
<thead>
<tr>
<th class="check-column"><span class="screen-reader-text"><?php esc_html_e( 'Select', 'autoblogger' ); ?></span></th>
<th><?php esc_html_e( 'Title', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Topic', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Type', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Editor Verdict', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Quality', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Generated', 'autoblogger' ); ?></th>
<th><?php esc_html_e( 'Actions', 'autoblogger' ); ?></th>
<th class="check-column"><span class="screen-reader-text"><?php esc_html_e( 'Select', 'prautoblogger' ); ?></span></th>
<th><?php esc_html_e( 'Title', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Topic', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Type', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Editor Verdict', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Quality', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Generated', 'prautoblogger' ); ?></th>
<th><?php esc_html_e( 'Actions', 'prautoblogger' ); ?></th>
</tr>
</thead>
<tbody>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<?php
$post_id = get_the_ID();
$verdict = get_post_meta( $post_id, '_autoblogger_editor_verdict', true );
$topic = get_post_meta( $post_id, '_autoblogger_topic', true );
$article_type = get_post_meta( $post_id, '_autoblogger_article_type', true );
$quality_score = get_post_meta( $post_id, '_autoblogger_quality_score', true );
$generated_at = get_post_meta( $post_id, '_autoblogger_generated_at', true );
$editor_notes = get_post_meta( $post_id, '_autoblogger_editor_notes', true );
$verdict_class = 'autoblogger-verdict-' . sanitize_html_class( $verdict ?: 'pending' );
$verdict = get_post_meta( $post_id, '_prautoblogger_editor_verdict', true );
$topic = get_post_meta( $post_id, '_prautoblogger_topic', true );
$article_type = get_post_meta( $post_id, '_prautoblogger_article_type', true );
$quality_score = get_post_meta( $post_id, '_prautoblogger_quality_score', true );
$generated_at = get_post_meta( $post_id, '_prautoblogger_generated_at', true );
$editor_notes = get_post_meta( $post_id, '_prautoblogger_editor_notes', true );
$verdict_class = 'prautoblogger-verdict-' . sanitize_html_class( $verdict ?: 'pending' );
?>
<tr data-post-id="<?php echo esc_attr( (string) $post_id ); ?>">
<td class="check-column">
<input type="checkbox" name="autoblogger_post_ids[]" value="<?php echo esc_attr( (string) $post_id ); ?>" />
<input type="checkbox" name="prautoblogger_post_ids[]" value="<?php echo esc_attr( (string) $post_id ); ?>" />
</td>
<td>
<strong><?php the_title(); ?></strong>
<?php if ( $editor_notes ) : ?>
<div class="autoblogger-editor-notes"><?php echo esc_html( $editor_notes ); ?></div>
<div class="prautoblogger-editor-notes"><?php echo esc_html( $editor_notes ); ?></div>
<?php endif; ?>
</td>
<td><?php echo esc_html( $topic ?: '—' ); ?></td>
@@ -112,18 +112,18 @@ $bulk_type = isset( $_GET['autoblogger_bulk_type'] ) ? sanitize_text_field( wp_u
<td><span class="<?php echo esc_attr( $verdict_class ); ?>"><?php echo esc_html( ucfirst( $verdict ?: 'pending' ) ); ?></span></td>
<td><?php echo '' !== $quality_score ? esc_html( $quality_score . '/10' ) : '—'; ?></td>
<td><?php echo $generated_at ? esc_html( wp_date( 'M j, g:i A', strtotime( $generated_at ) ) ) : '—'; ?></td>
<td class="autoblogger-queue-actions">
<button type="button" class="button button-small button-primary autoblogger-approve-btn" data-post-id="<?php echo esc_attr( (string) $post_id ); ?>">
<?php esc_html_e( 'Approve', 'autoblogger' ); ?>
<td class="prautoblogger-queue-actions">
<button type="button" class="button button-small button-primary prautoblogger-approve-btn" data-post-id="<?php echo esc_attr( (string) $post_id ); ?>">
<?php esc_html_e( 'Approve', 'prautoblogger' ); ?>
</button>
<a href="<?php echo esc_url( get_edit_post_link( $post_id ) ); ?>" class="button button-small">
<?php esc_html_e( 'Edit', 'autoblogger' ); ?>
<?php esc_html_e( 'Edit', 'prautoblogger' ); ?>
</a>
<a href="<?php echo esc_url( get_preview_post_link( $post_id ) ); ?>" class="button button-small" target="_blank">
<?php esc_html_e( 'Preview', 'autoblogger' ); ?>
<?php esc_html_e( 'Preview', 'prautoblogger' ); ?>
</a>
<button type="button" class="button button-small autoblogger-reject-btn" data-post-id="<?php echo esc_attr( (string) $post_id ); ?>">
<?php esc_html_e( 'Reject', 'autoblogger' ); ?>
<button type="button" class="button button-small prautoblogger-reject-btn" data-post-id="<?php echo esc_attr( (string) $post_id ); ?>">
<?php esc_html_e( 'Reject', 'prautoblogger' ); ?>
</button>
</td>
</tr>
@@ -138,7 +138,7 @@ $bulk_type = isset( $_GET['autoblogger_bulk_type'] ) ? sanitize_text_field( wp_u
$total_pages = $query->max_num_pages;
if ( $total_pages > 1 ) :
$current_page = isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
echo '<div class="autoblogger-pagination">';
echo '<div class="prautoblogger-pagination">';
echo wp_kses_post( paginate_links( [
'base' => add_query_arg( 'paged', '%#%' ),
'format' => '',

View File

@@ -2,7 +2,7 @@
/**
* Settings page template — modern tabbed UI.
*
* Variables from Autoblogger_Admin_Page::render_page():
* Variables from PRAutoBlogger_Admin_Page::render_page():
* $sections — tab definitions from Settings_Fields::get_sections().
* $fields — all field definitions (unused here, WP renders via do_settings_fields).
*
@@ -13,12 +13,12 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$active_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'autoblogger_api';
$cost_tracker = new Autoblogger_Cost_Tracker();
$active_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'prautoblogger_api';
$cost_tracker = new PRAutoBlogger_Cost_Tracker();
$monthly_spend = $cost_tracker->get_monthly_spend();
$budget = (float) get_option( 'autoblogger_monthly_budget_usd', 50.00 );
$budget = (float) get_option( 'prautoblogger_monthly_budget_usd', 50.00 );
$utilization = $budget > 0 ? ( $monthly_spend / $budget ) * 100.0 : 0;
$next_run = wp_next_scheduled( 'autoblogger_daily_generation' );
$next_run = wp_next_scheduled( 'prautoblogger_daily_generation' );
?>
<div class="wrap ab-wrap">
@@ -27,18 +27,18 @@ $next_run = wp_next_scheduled( 'autoblogger_daily_generation' );
<div class="ab-header-left">
<span class="dashicons dashicons-edit-page ab-header-icon"></span>
<div>
<h1 class="ab-header-title"><?php esc_html_e( 'AutoBlogger', 'autoblogger' ); ?></h1>
<span class="ab-header-version">v<?php echo esc_html( AUTOBLOGGER_VERSION ); ?></span>
<h1 class="ab-header-title"><?php esc_html_e( 'PRAutoBlogger', 'prautoblogger' ); ?></h1>
<span class="ab-header-version">v<?php echo esc_html( PRAUTOBLOGGER_VERSION ); ?></span>
</div>
</div>
<div class="ab-header-actions">
<button type="button" id="autoblogger-test-connection" class="ab-btn ab-btn-outline">
<button type="button" id="prautoblogger-test-connection" class="ab-btn ab-btn-outline">
<span class="dashicons dashicons-yes-alt"></span>
<?php esc_html_e( 'Test Connections', 'autoblogger' ); ?>
<?php esc_html_e( 'Test Connections', 'prautoblogger' ); ?>
</button>
<button type="button" id="autoblogger-generate-now" class="ab-btn ab-btn-primary">
<button type="button" id="prautoblogger-generate-now" class="ab-btn ab-btn-primary">
<span class="dashicons dashicons-update"></span>
<?php esc_html_e( 'Generate Now', 'autoblogger' ); ?>
<?php esc_html_e( 'Generate Now', 'prautoblogger' ); ?>
</button>
</div>
</div>
@@ -46,27 +46,27 @@ $next_run = wp_next_scheduled( 'autoblogger_daily_generation' );
<!-- Quick stats bar -->
<div class="ab-stats-bar">
<div class="ab-stat">
<span class="ab-stat-label"><?php esc_html_e( 'Monthly Spend', 'autoblogger' ); ?></span>
<span class="ab-stat-label"><?php esc_html_e( 'Monthly Spend', 'prautoblogger' ); ?></span>
<span class="ab-stat-value <?php echo $utilization >= 90 ? 'ab-text-danger' : ( $utilization >= 70 ? 'ab-text-warning' : '' ); ?>">
$<?php echo esc_html( number_format( $monthly_spend, 2 ) ); ?>
<small>/ $<?php echo esc_html( number_format( $budget, 2 ) ); ?></small>
</span>
</div>
<div class="ab-stat">
<span class="ab-stat-label"><?php esc_html_e( 'Next Run', 'autoblogger' ); ?></span>
<span class="ab-stat-label"><?php esc_html_e( 'Next Run', 'prautoblogger' ); ?></span>
<span class="ab-stat-value">
<?php echo false !== $next_run ? esc_html( wp_date( 'M j, g:i A', $next_run ) ) : '<em>' . esc_html__( 'Not scheduled', 'autoblogger' ) . '</em>'; ?>
<?php echo false !== $next_run ? esc_html( wp_date( 'M j, g:i A', $next_run ) ) : '<em>' . esc_html__( 'Not scheduled', 'prautoblogger' ) . '</em>'; ?>
</span>
</div>
<div class="ab-stat">
<span class="ab-stat-label"><?php esc_html_e( 'Review Queue', 'autoblogger' ); ?></span>
<a href="<?php echo esc_url( admin_url( 'admin.php?page=autoblogger-review-queue' ) ); ?>" class="ab-stat-value ab-stat-link">
<?php esc_html_e( 'View Drafts →', 'autoblogger' ); ?>
<span class="ab-stat-label"><?php esc_html_e( 'Review Queue', 'prautoblogger' ); ?></span>
<a href="<?php echo esc_url( admin_url( 'admin.php?page=prautoblogger-review-queue' ) ); ?>" class="ab-stat-value ab-stat-link">
<?php esc_html_e( 'View Drafts →', 'prautoblogger' ); ?>
</a>
</div>
</div>
<div id="autoblogger-status-message" class="hidden"></div>
<div id="prautoblogger-status-message" class="hidden"></div>
<!-- Tab navigation + settings form -->
<div class="ab-layout">
@@ -84,7 +84,7 @@ $next_run = wp_next_scheduled( 'autoblogger_daily_generation' );
<div class="ab-content">
<form method="post" action="options.php" id="ab-settings-form">
<?php settings_fields( 'autoblogger_settings_group' ); ?>
<?php settings_fields( 'prautoblogger_settings_group' ); ?>
<?php foreach ( $sections as $sid => $sec ) : ?>
<div class="ab-panel <?php echo $active_tab === $sid ? 'ab-panel-active' : ''; ?>"
@@ -97,13 +97,13 @@ $next_run = wp_next_scheduled( 'autoblogger_daily_generation' );
<?php endif; ?>
</div>
<table class="form-table ab-form-table" role="presentation">
<?php do_settings_fields( 'autoblogger-settings', $sid ); ?>
<?php do_settings_fields( 'prautoblogger-settings', $sid ); ?>
</table>
</div>
<?php endforeach; ?>
<div class="ab-save-bar">
<?php submit_button( __( 'Save Settings', 'autoblogger' ), 'ab-btn ab-btn-primary', 'submit', false ); ?>
<?php submit_button( __( 'Save Settings', 'prautoblogger' ), 'ab-btn ab-btn-primary', 'submit', false ); ?>
</div>
</form>
</div>