true, 'games' => false, 'agents' => false, ); $raw = get_option( OPENSTATION_EXTENDED_OPTIONS_KEY, array() ); if ( ! is_array( $raw ) ) { return $defaults; } // Fall back to the default only when the key is ABSENT — so an // admin who explicitly saved `false` stays opted-out even though // the shipped default is now `true`. `! empty()` would wrongly // coerce an explicit `false` back to the default. $clean = array(); foreach ( $defaults as $key => $default ) { $clean[ $key ] = array_key_exists( $key, $raw ) ? (bool) $raw[ $key ] : $default; } return $clean; } /** * Persists extended options to `wp_options`. * * @param mixed $raw Incoming payload. * @return bool */ function openstation_save_extended_options( $raw ) { if ( ! is_array( $raw ) ) { return false; } // Merge over the current values so a payload that omits a key (an // older client, a partial save) can't silently reset it. $clean = openstation_get_extended_options(); foreach ( $clean as $key => $current ) { if ( array_key_exists( $key, $raw ) ) { $clean[ $key ] = ! empty( $raw[ $key ] ); } } return update_option( OPENSTATION_EXTENDED_OPTIONS_KEY, $clean, false ); } // --------------------------------------------------------------------------- // REST endpoint — admin only // --------------------------------------------------------------------------- /** * Registers the extended options REST route. */ function openstation_register_extended_options_rest_routes() { register_rest_route( 'desktop-mode/v1', '/extended-options', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => 'openstation_rest_get_extended_options', 'permission_callback' => 'openstation_rest_extended_options_permission', ), array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => 'openstation_rest_save_extended_options', 'permission_callback' => 'openstation_rest_extended_options_permission', 'args' => array( 'options' => array( 'required' => true, 'type' => 'object', ), ), ), ) ); } add_action( 'rest_api_init', 'openstation_register_extended_options_rest_routes' ); /** * Permission: admins only. * * @return bool|WP_Error */ function openstation_rest_extended_options_permission() { if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { return new WP_Error( 'openstation_extended_forbidden', 'Only administrators can manage extended options.', array( 'status' => 403 ) ); } return true; } /** * GET /desktop-mode/v1/extended-options * * @return WP_REST_Response */ function openstation_rest_get_extended_options() { return rest_ensure_response( openstation_get_extended_options() ); } /** * POST /desktop-mode/v1/extended-options * * @param WP_REST_Request $request * @return WP_REST_Response */ function openstation_rest_save_extended_options( WP_REST_Request $request ) { $payload = $request->get_param( 'options' ); openstation_save_extended_options( $payload ); return rest_ensure_response( openstation_get_extended_options() ); } // --------------------------------------------------------------------------- // Media Library enhancement enqueue // --------------------------------------------------------------------------- /** * Enqueues the media-library enhancement shim when the admin has * toggled it on. The script is a no-op on pages where wp.media isn't * loaded (it checks at runtime), so there's no harm in enqueuing * globally in the admin. */ function openstation_enqueue_media_library_enhancement() { if ( ! is_admin() || ! is_user_logged_in() ) { return; } $options = openstation_get_extended_options(); if ( empty( $options['media_library_enhanced'] ) ) { return; } wp_enqueue_script( 'os-media-library-enhanced', OPENSTATION_URL . 'assets/js/media-library-enhanced.js', array(), OPENSTATION_VERSION, true ); } add_action( 'admin_enqueue_scripts', 'openstation_enqueue_media_library_enhancement', 20 );