'object', 'properties' => array( 'query' => array( 'type' => 'string', 'description' => 'Search keywords.', ), 'category' => array( 'type' => 'string', 'description' => 'Optional category slug.', ), 'limit' => array( 'type' => 'integer', 'description' => 'Maximum number of results (1-5).', ), ), 'required' => array( 'query' ), ); } public function is_enabled(): bool { return (bool) Aivexa_Settings::get( 'enable_post_search', true ); } /** * Execute post search. * * @param array $arguments Arguments. */ public function execute( array $arguments ) { $query = isset( $arguments['query'] ) ? sanitize_text_field( (string) $arguments['query'] ) : ''; $category = isset( $arguments['category'] ) ? sanitize_title( (string) $arguments['category'] ) : ''; $limit = isset( $arguments['limit'] ) ? absint( $arguments['limit'] ) : 5; $limit = max( 1, min( 5, $limit ) ); if ( '' === $query ) { return new WP_Error( 'aivexa_post_search_empty', __( 'Search query is required.', 'aivexa' ) ); } $args = array( 's' => $query, 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => $limit, 'no_found_rows' => true, ); if ( '' !== $category ) { $args['category_name'] = $category; } $search = new WP_Query( $args ); $results = array(); foreach ( $search->posts as $post ) { if ( ! $post instanceof WP_Post || post_password_required( $post ) ) { continue; } $results[] = array( 'title' => get_the_title( $post ), 'url' => get_permalink( $post ), 'excerpt' => wp_trim_words( wp_strip_all_tags( get_the_excerpt( $post ) ), 40, '…' ), ); } wp_reset_postdata(); return array( 'query' => $query, 'category' => $category, 'results' => $results, ); } }