*/ public function get(): array { $stored = get_option( self::OPTION_NAME, array() ); return wp_parse_args( is_array( $stored ) ? $stored : array(), self::defaults() ); } /** * @param array $settings */ public function update( array $settings ): bool { return update_option( self::OPTION_NAME, self::sanitize( wp_parse_args( $settings, self::defaults() ) ) ); } /** * @return array */ private static function defaults(): array { return array( 'blocked_bots' => array(), 'custom_rules' => '', ); } /** * @param array $settings * * @return array */ private static function sanitize( array $settings ): array { $known_agents = wp_list_pluck( KnownBots::all(), 'agent' ); $blocked = array(); foreach ( (array) $settings['blocked_bots'] as $agent ) { $agent = sanitize_text_field( (string) $agent ); if ( in_array( $agent, $known_agents, true ) ) { $blocked[] = $agent; } } return array( 'blocked_bots' => array_values( array_unique( $blocked ) ), // NOT sanitize_textarea_field — robots.txt paths are legitimately // percent-encoded ("Disallow: /szukaj?q=%ab") and core would strip those // octets silently (M49). TemplateSanitizer keeps them, still strips tags. 'custom_rules' => \AcezSeo\Support\TemplateSanitizer::sanitize_multiline( $settings['custom_rules'] ), ); } }