label */ public static function enforceable() { $keys = array( 'cache_ttl' => __( 'Now-playing cache TTL (seconds)', 'streamsera' ), 'default_volume' => __( 'Default volume', 'streamsera' ), 'keyboard_shortcuts' => __( 'Keyboard shortcuts', 'streamsera' ), 'background_poll' => __( 'Background metadata polling', 'streamsera' ), 'delete_data' => __( 'Delete data on uninstall', 'streamsera' ), ); /** * Filter the settings a network admin can enforce across sites. * * @param array $keys key => label. */ return (array) apply_filters( 'streamsera_network_enforceable_settings', $keys ); } /** * Hook in (multisite only). */ public function register() { if ( ! is_multisite() ) { return; } add_filter( 'option_streamsera_settings', array( $this, 'merge' ) ); add_filter( 'default_option_streamsera_settings', array( $this, 'merge' ) ); add_action( 'network_admin_menu', array( $this, 'menu' ) ); add_action( 'network_admin_edit_' . self::SLUG, array( $this, 'save' ) ); add_filter( 'streamsera_admin_data', array( $this, 'admin_data' ) ); } /** * Stored network settings. * * @return array { values: array, enforced: string[] } */ public static function get() { $stored = get_site_option( self::OPTION, array() ); return array( 'values' => isset( $stored['values'] ) && is_array( $stored['values'] ) ? $stored['values'] : array(), 'enforced' => isset( $stored['enforced'] ) && is_array( $stored['enforced'] ) ? array_values( $stored['enforced'] ) : array(), ); } /** * Overlay enforced network values on the site option. * * @param mixed $value Site settings. * @return array */ public function merge( $value ) { $network = self::get(); if ( empty( $network['enforced'] ) ) { return $value; } $value = is_array( $value ) ? $value : array(); foreach ( $network['enforced'] as $key ) { if ( array_key_exists( $key, $network['values'] ) ) { $value[ $key ] = $network['values'][ $key ]; } } return $value; } /** * Tell the site admin app which keys are locked. * * @param array $data Data. * @return array */ public function admin_data( $data ) { $data['networkLocked'] = self::get()['enforced']; return $data; } /** * Network settings page. */ public function menu() { add_submenu_page( 'settings.php', __( 'StreamSera', 'streamsera' ), __( 'StreamSera', 'streamsera' ), 'manage_network_options', self::SLUG, array( $this, 'render' ) ); } /** * Render the (plain PHP) network form. */ public function render() { $network = self::get(); $defaults = \StreamSera\Installation::defaults(); $updated = isset( $_GET['updated'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>

$label ) : ?>
$value ) { $key = sanitize_key( $key ); if ( ! isset( $allowed[ $key ] ) || ! is_scalar( $value ) ) { continue; } $default = isset( $defaults[ $key ] ) ? $defaults[ $key ] : ''; if ( is_bool( $default ) ) { $values[ $key ] = ! empty( $value ); } elseif ( is_int( $default ) ) { $values[ $key ] = absint( $value ); } else { $values[ $key ] = sanitize_text_field( $value ); } } // Same bounds and allowed values as the per-site settings screen (volume 0-100, enums, slugs …). if ( $values ) { $bounded = \StreamSera\Api\Routes::sanitize_settings( $values, $defaults ); foreach ( array_keys( $values ) as $key ) { if ( array_key_exists( $key, $bounded ) ) { $values[ $key ] = $bounded[ $key ]; } } } $enforced = isset( $_POST['enforced'] ) && is_array( $_POST['enforced'] ) ? array_map( 'sanitize_key', wp_unslash( $_POST['enforced'] ) ) : array(); $enforced = array_values( array_intersect( $enforced, array_keys( $allowed ) ) ); update_site_option( self::OPTION, array( 'values' => $values, 'enforced' => $enforced, ) ); wp_safe_redirect( add_query_arg( array( 'page' => self::SLUG, 'updated' => 'true', ), network_admin_url( 'settings.php' ) ) ); exit; } }