admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( self::NONCE_ACTION ), 'pollInterval' => $poll_interval * 1000, 'publishedWindowDays' => $published_days, 'action' => self::AJAX_ACTION, 'strings' => array( 'generating' => __( 'Generating', 'prautoblogger' ), 'inReview' => __( 'In Review', 'prautoblogger' ), 'published' => __( 'Published', 'prautoblogger' ), 'failed' => __( 'Failed', 'prautoblogger' ), 'empty' => __( 'Nothing here yet.', 'prautoblogger' ), 'cost' => __( 'Cost', 'prautoblogger' ), 'view' => __( 'View', 'prautoblogger' ), 'edit' => __( 'Edit', 'prautoblogger' ), 'viewLog' => __( 'View Log', 'prautoblogger' ), 'pollError' => __( 'Board update failed — retrying.', 'prautoblogger' ), ), ) ); } /** * AJAX handler: return the current board snapshot (all four columns). * * Nonce: `prautoblogger_board`. Requires `manage_options` capability. * * Side effects: DB reads only — no writes. * * @return void */ public function on_ajax_board_status(): void { check_ajax_referer( self::NONCE_ACTION, 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Insufficient permissions.', 'prautoblogger' ) ), 403 ); return; } $provider = new PRAutoBlogger_Board_Data_Provider(); $snapshot = $provider->get_board_snapshot(); wp_send_json_success( $snapshot ); } }