'array', 'sanitize_callback' => array( $this, 'sanitize_post_types' ), 'default' => array( 'post' ), ) ); register_setting( 'super_ajax_search_settings', 'super_ajax_search_placeholder', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'default' => __( 'Search here…', 'super-ajax-search' ), ) ); register_setting( 'super_ajax_search_settings', 'super_ajax_search_limit', array( 'type' => 'integer', 'sanitize_callback' => 'absint', 'default' => 5, ) ); register_setting( 'super_ajax_search_settings', 'super_ajax_search_no_results_text', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'default' => __( 'No results found', 'super-ajax-search' ), ) ); // --- Display Settings --- register_setting( 'super_ajax_search_settings', 'super_ajax_search_show_thumbnail', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'default' => '1', ) ); register_setting( 'super_ajax_search_settings', 'super_ajax_search_show_excerpt', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'default' => '1', ) ); register_setting( 'super_ajax_search_settings', 'super_ajax_search_group_by', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_key', 'default' => 'none', ) ); register_setting( 'super_ajax_search_settings', 'super_ajax_search_enable_category_filter', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'default' => '0', ) ); // --- Performance Settings --- register_setting( 'super_ajax_search_settings', 'super_ajax_search_cache_duration', array( 'type' => 'integer', 'sanitize_callback' => 'absint', 'default' => 3600, ) ); // === Sections === add_settings_section( 'sas_general', __( 'General', 'super-ajax-search' ), null, 'super_ajax_search_settings' ); add_settings_section( 'sas_display', __( 'Display', 'super-ajax-search' ), null, 'super_ajax_search_settings' ); add_settings_section( 'sas_performance', __( 'Performance', 'super-ajax-search' ), null, 'super_ajax_search_settings' ); // === Fields === add_settings_field( 'sas_post_types', __( 'Post Types to Search', 'super-ajax-search' ), array( $this, 'render_post_types' ), 'super_ajax_search_settings', 'sas_general' ); add_settings_field( 'sas_placeholder', __( 'Search Placeholder', 'super-ajax-search' ), array( $this, 'render_placeholder' ), 'super_ajax_search_settings', 'sas_general' ); add_settings_field( 'sas_limit', __( 'Max Results', 'super-ajax-search' ), array( $this, 'render_limit' ), 'super_ajax_search_settings', 'sas_general' ); add_settings_field( 'sas_no_results', __( 'No Results Message', 'super-ajax-search' ), array( $this, 'render_no_results' ), 'super_ajax_search_settings', 'sas_general' ); add_settings_field( 'sas_thumbnail', __( 'Show Thumbnails', 'super-ajax-search' ), array( $this, 'render_thumbnail' ), 'super_ajax_search_settings', 'sas_display' ); add_settings_field( 'sas_excerpt', __( 'Show Smart Excerpts', 'super-ajax-search' ), array( $this, 'render_excerpt' ), 'super_ajax_search_settings', 'sas_display' ); add_settings_field( 'sas_group_by', __( 'Group Results By', 'super-ajax-search' ), array( $this, 'render_group_by' ), 'super_ajax_search_settings', 'sas_display' ); add_settings_field( 'sas_cat_filter', __( 'Category Filter Dropdown', 'super-ajax-search' ), array( $this, 'render_cat_filter' ), 'super_ajax_search_settings', 'sas_display' ); add_settings_field( 'sas_cache', __( 'Cache Duration (seconds)', 'super-ajax-search' ), array( $this, 'render_cache' ), 'super_ajax_search_settings', 'sas_performance' ); } /** * Sanitize post types array. * * @param mixed $input Raw input. * @return array */ public function sanitize_post_types( mixed $input ): array { return is_array( $input ) ? array_map( 'sanitize_text_field', $input ) : array(); } // ──────────── Field Renderers ──────────── /** * Render post types checkboxes. * * @return void */ public function render_post_types(): void { $selected = get_option( 'super_ajax_search_post_types', array( 'post' ) ); $types = get_post_types( array( 'public' => true ), 'objects' ); echo '
'; foreach ( $types as $type ) { $checked = in_array( $type->name, (array) $selected, true ) ? 'checked' : ''; printf( '
', esc_attr( $type->name ), esc_attr( $checked ), esc_html( $type->label ) ); } echo '
'; } /** * Render placeholder input. * * @return void */ public function render_placeholder(): void { printf( '', esc_attr( get_option( 'super_ajax_search_placeholder', __( 'Search here…', 'super-ajax-search' ) ) ) ); } /** * Render limit input. * * @return void */ public function render_limit(): void { printf( '', absint( get_option( 'super_ajax_search_limit', 5 ) ) ); } /** * Render no results text input. * * @return void */ public function render_no_results(): void { printf( '', esc_attr( get_option( 'super_ajax_search_no_results_text', __( 'No results found', 'super-ajax-search' ) ) ) ); } /** * Render show thumbnail checkbox. * * @return void */ public function render_thumbnail(): void { $val = get_option( 'super_ajax_search_show_thumbnail', '1' ); printf( '', checked( $val, '1', false ), esc_html__( 'Display featured images in search results', 'super-ajax-search' ) ); } /** * Render show excerpt checkbox. * * @return void */ public function render_excerpt(): void { $val = get_option( 'super_ajax_search_show_excerpt', '1' ); printf( '', checked( $val, '1', false ), esc_html__( 'Show smart excerpt with keyword highlighting', 'super-ajax-search' ) ); } /** * Render group-by select. * * @return void */ public function render_group_by(): void { $val = get_option( 'super_ajax_search_group_by', 'none' ); $options = array( 'none' => __( 'No Grouping', 'super-ajax-search' ), 'post_type' => __( 'Post Type', 'super-ajax-search' ), 'category' => __( 'Category', 'super-ajax-search' ), ); echo ''; } /** * Render category filter checkbox. * * @return void */ public function render_cat_filter(): void { $val = get_option( 'super_ajax_search_enable_category_filter', '0' ); printf( '', checked( $val, '1', false ), esc_html__( 'Show category dropdown next to the search bar', 'super-ajax-search' ) ); } /** * Render cache duration input. * * @return void */ public function render_cache(): void { printf( '

%s

', absint( get_option( 'super_ajax_search_cache_duration', 3600 ) ), esc_html__( 'Set to 0 to disable caching. Default: 3600 (1 hour).', 'super-ajax-search' ) ); } /** * Render settings page. * * @return void */ public function render_settings_page(): void { if ( ! current_user_can( 'manage_options' ) ) { return; } ?>