prepare(): values and ID lists as placeholders, table and // column names as %i. Fragments added to a query are code (Scope::sql()) or are prepared // where they are built (Scope::type_sql(), Lang::sql(), SeoMeta joins). /** * SettingsPage — renders and saves the Clusterlane Settings admin page. */ class SettingsPage { public function __construct( private \Clusterlane\Core\Plugin $plugin ) {} public function handle_save(): void { $settings = $this->plugin->get('settings'); $this->save( $settings ); } public function render(): void { $settings = $this->plugin->get('settings'); if ( isset( $_GET['settings-updated'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only display flag echo '
' . esc_html__( 'Settings saved.', 'clusterlane' ) . ( isset( $_GET['recomputed'] ) ? ' ' . esc_html__( 'Clusters were recalculated with the new thresholds.', 'clusterlane' ) : '' ) . '