> */ public static function get_default_bar_fields(): array { return [ 'location' => [ 'label' => __('Where', 'advanced-connector-for-uplisting'), 'priority' => 10, 'group' => 'fields', 'enabled_default' => true, 'template' => 'location', ], 'date' => [ 'label' => __('When', 'advanced-connector-for-uplisting'), 'priority' => 20, 'group' => 'fields', 'enabled_default' => true, 'template' => 'date', ], 'guest' => [ 'label' => __('Who', 'advanced-connector-for-uplisting'), 'priority' => 30, 'group' => 'fields', 'enabled_default' => true, 'template' => 'guest', ], 'more_filters' => [ 'label' => __('More filters', 'advanced-connector-for-uplisting'), 'priority' => 10, 'group' => 'actions', 'enabled_default' => true, 'callback' => [self::class, 'render_more_filters_button'], ], 'clear' => [ 'label' => __('Clear', 'advanced-connector-for-uplisting'), 'priority' => 20, 'group' => 'actions', 'enabled_default' => true, 'callback' => [self::class, 'render_clear_button'], ], 'submit' => [ 'label' => __('Search', 'advanced-connector-for-uplisting'), 'priority' => 30, 'group' => 'actions', 'enabled_default' => true, 'callback' => [self::class, 'render_submit_button'], ], ]; } /** * Default modal filter rows. * * @return array> */ public static function get_default_modal_fields(): array { return [ 'bedrooms' => [ 'label' => __('Bedrooms', 'advanced-connector-for-uplisting'), 'priority' => 10, 'enabled_default' => true, 'callback' => [self::class, 'render_modal_bedrooms'], ], 'beds' => [ 'label' => __('Beds', 'advanced-connector-for-uplisting'), 'priority' => 20, 'enabled_default' => true, 'callback' => [self::class, 'render_modal_beds'], ], 'bathrooms' => [ 'label' => __('Bathrooms', 'advanced-connector-for-uplisting'), 'priority' => 30, 'enabled_default' => true, 'callback' => [self::class, 'render_modal_bathrooms'], ], ]; } /** * Filtered + sorted search bar fields. * * @return array> */ public static function get_bar_fields(): array { $fields = apply_filters('bizdex_uplisting_search_bar_fields', self::get_default_bar_fields()); return self::sort_fields(is_array($fields) ? $fields : []); } /** * Filtered + sorted modal fields. * * @return array> */ public static function get_modal_fields(): array { $fields = apply_filters('bizdex_uplisting_search_modal_fields', self::get_default_modal_fields()); return self::sort_fields(is_array($fields) ? $fields : []); } /** * Whether a field should render for the current search context. * * @param array $args Search template args (includes `visible`). */ public static function is_field_visible(string $field_key, array $args, array $definition = []): bool { $visible_map = is_array($args['visible'] ?? null) ? $args['visible'] : []; $default = !empty($definition['enabled_default']); if (array_key_exists($field_key, $visible_map)) { $default = (bool) $visible_map[$field_key]; } return (bool) apply_filters('bizdex_uplisting_search_field_visible', $default, $field_key, $args, $definition); } /** * Build template args for search rendering from block/shortcode attributes. * * @param array $attributes * @return array */ public static function build_args_from_attributes(array $attributes = []): array { $filters = ListingQuery::get_filters_from_request(); $listing_url = isset($attributes['listingUrl']) ? esc_url_raw((string) $attributes['listingUrl']) : ''; if ($listing_url === '') { $listing_url = FrontendManager::get_listing_page_url(); } $visible = [ 'location' => self::attr_bool($attributes, 'showLocation', true), 'date' => self::attr_bool($attributes, 'showDates', true), 'guest' => self::attr_bool($attributes, 'showGuests', true), 'more_filters' => self::attr_bool($attributes, 'showMoreFilters', true), 'clear' => self::attr_bool($attributes, 'showClear', true), 'submit' => self::attr_bool($attributes, 'showSubmit', true), 'bedrooms' => self::attr_bool($attributes, 'showModalBedrooms', true), 'beds' => self::attr_bool($attributes, 'showModalBeds', true), 'bathrooms' => self::attr_bool($attributes, 'showModalBathrooms', true), ]; /** * Filter visible search fields for the current render. * * @param array $visible * @param array $attributes */ $visible = apply_filters('bizdex_uplisting_search_visible_fields', $visible, $attributes); return [ 'selected_location' => (string) ($filters['selected_location'] ?? ''), 'selected_dates' => (string) ($filters['selected_dates'] ?? ''), 'start_date' => (string) ($filters['start_date'] ?? ''), 'end_date' => (string) ($filters['end_date'] ?? ''), 'selected_adults' => absint($filters['selected_adults'] ?? 0), 'selected_kids' => absint($filters['selected_kids'] ?? 0), 'selected_bedrooms' => absint($filters['selected_bedrooms'] ?? 0), 'selected_bathrooms' => absint($filters['selected_bathrooms'] ?? 0), 'selected_beds' => absint($filters['selected_beds'] ?? 0), 'current_view' => ListingQuery::get_request_view(''), 'locations' => ListingQuery::get_location_options(), 'listing_url' => $listing_url, 'found_posts' => 0, 'visible' => $visible, 'attributes' => $attributes, ]; } /** * Render a registered field (template or callback). * * @param array $definition * @param array $args */ public static function render_field(string $field_key, array $definition, array $args): void { if (!self::is_field_visible($field_key, $args, $definition)) { return; } if (!empty($definition['callback']) && is_callable($definition['callback'])) { call_user_func($definition['callback'], $args, $definition, $field_key); return; } $template = (string) ($definition['template'] ?? $field_key); $file = BIZDEX_UPLISTING_PLUGIN_DIR . 'templates/archive/filter/' . $template . '.php'; if (is_readable($file)) { (static function (string $template_file, array $args): void { extract($args, EXTR_SKIP); require $template_file; })($file, $args); } /** * Fires after a search field is rendered. * * @param string $field_key * @param array $definition * @param array $args */ do_action('bizdex_uplisting_after_search_field', $field_key, $definition, $args); } /** * Render the "more filters" control that opens the filters modal. * * @param array $args */ public static function render_more_filters_button(array $args): void { ?> $args */ public static function render_clear_button(array $args): void { $has_active_filters = self::has_active_filters($args); ?> $args */ public static function render_submit_button(array $args): void { ?> $args */ public static function render_modal_bedrooms(array $args): void { $selected_bedrooms = absint($args['selected_bedrooms'] ?? 0); ?>
$args */ public static function render_modal_beds(array $args): void { $selected_beds = absint($args['selected_beds'] ?? 0); ?>
$args */ public static function render_modal_bathrooms(array $args): void { $selected_bathrooms = absint($args['selected_bathrooms'] ?? 0); ?>
$args */ public static function has_active_filters(array $args): bool { return ( (string) ($args['selected_location'] ?? '') !== '' || (string) ($args['selected_dates'] ?? '') !== '' || (string) ($args['start_date'] ?? '') !== '' || (string) ($args['end_date'] ?? '') !== '' || absint($args['selected_adults'] ?? 0) > 0 || absint($args['selected_kids'] ?? 0) > 0 || absint($args['selected_bedrooms'] ?? 0) > 0 || absint($args['selected_bathrooms'] ?? 0) > 0 || absint($args['selected_beds'] ?? 0) > 0 ); } /** * Editor field toggle config for the Search block sidebar. * * @return array */ public static function get_editor_toggle_definitions(): array { $toggles = [ [ 'key' => 'location', 'attribute' => 'showLocation', 'label' => __('Show Where (location)', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'bar', ], [ 'key' => 'date', 'attribute' => 'showDates', 'label' => __('Show When (dates)', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'bar', ], [ 'key' => 'guest', 'attribute' => 'showGuests', 'label' => __('Show Who (guests)', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'bar', ], [ 'key' => 'more_filters', 'attribute' => 'showMoreFilters', 'label' => __('Show more filters button', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'actions', ], [ 'key' => 'clear', 'attribute' => 'showClear', 'label' => __('Show Clear button', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'actions', ], [ 'key' => 'submit', 'attribute' => 'showSubmit', 'label' => __('Show Search button', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'actions', ], [ 'key' => 'bedrooms', 'attribute' => 'showModalBedrooms', 'label' => __('Show Bedrooms in modal', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'modal', ], [ 'key' => 'beds', 'attribute' => 'showModalBeds', 'label' => __('Show Beds in modal', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'modal', ], [ 'key' => 'bathrooms', 'attribute' => 'showModalBathrooms', 'label' => __('Show Bathrooms in modal', 'advanced-connector-for-uplisting'), 'default' => true, 'group' => 'modal', ], ]; /** * Filter Search block sidebar toggles. * * @param array> $toggles */ return apply_filters('bizdex_uplisting_search_block_toggles', $toggles); } /** * Sort search field definitions by configured display order. * * @param array> $fields * @return array> */ private static function sort_fields(array $fields): array { uasort( $fields, static function (array $a, array $b): int { return (int) ($a['priority'] ?? 100) <=> (int) ($b['priority'] ?? 100); } ); return $fields; } /** * Read a boolean attribute with a default when unset or empty. * * @param array $attributes */ private static function attr_bool(array $attributes, string $key, bool $default): bool { if (!array_key_exists($key, $attributes)) { return $default; } $value = $attributes[$key]; if (is_bool($value)) { return $value; } if (is_string($value)) { return !in_array(strtolower($value), ['0', 'false', 'no', ''], true); } return (bool) $value; } }