PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.8
Yatra – Travel Booking & Tour Operator Software v3.0.8
3.0.16 3.0.15 3.0.14 3.0.14.1 3.0.14.2 3.0.12 3.0.13 3.0.11 3.0.10 3.0.9 3.0.8 3.0.7 3.0.6 3.0.5 3.0.5.1 3.0.4 3.0.3 3.0.2.9 3.0.2.7 3.0.2.8 3.0.2.6 trunk 1.0.0 2.0.0 2.0.1 All 84 releases
yatra / templates / listing-trip.php

listing-trip.php in Yatra – Travel Booking & Tour Operator Software 3.0.8, at templates/listing-trip.php

873 lines 58.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Trip listing template (presentation). Data is prepared in {@see TripListingPageContextFactory} and set by {@see ListingPageHandler}.
4 *
5 * @package Yatra
6 */
7
8 use Yatra\Services\TripListingService;
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 $tripListingService = new TripListingService();
15
16 $ctx = $GLOBALS['yatra_trip_listing_context'] ?? [];
17 $filter_data = $ctx['filter_data'] ?? [];
18 if ($filter_data === []) {
19 $filter_data = $tripListingService->getFilterData();
20 }
21 $yatra_trip_list = $ctx['trip_list'] ?? ($GLOBALS['yatra_trip_list'] ?? null);
22 $trips_source = $ctx['trips'] ?? [];
23 $trip_total = (int) ($ctx['total'] ?? 0);
24 $trip_total_pages = (int) ($ctx['pages'] ?? 1);
25 $trip_current_page = (int) ($ctx['current_page'] ?? 1);
26 $trip_dest_options = $ctx['destinations'] ?? [];
27 $trip_act_options = $ctx['activities'] ?? [];
28 $active_filters = $ctx['active_filters'] ?? [];
29 $yatra_listing_title = $ctx['listing_title'] ?? __('All Trips', 'yatra');
30 $current_filter_type = $ctx['taxonomy_type'] ?? '';
31 $current_filter_slug = $ctx['taxonomy_slug'] ?? '';
32 $current_filter_name = $ctx['taxonomy_name'] ?? '';
33 $yatra_results = $ctx['results'] ?? [
34 'display_total' => 0,
35 'start_item' => 0,
36 'end_item' => 0,
37 'per_page' => yatra_get_posts_per_page(),
38 ];
39 $yatra_pagination = $ctx['pagination'] ?? [
40 'total_pages' => 1,
41 'current_page' => 1,
42 'prev_url' => null,
43 'next_url' => null,
44 'items' => [],
45 ];
46 $yatra_sort_options = $ctx['sort_options'] ?? [];
47 $show_taxonomy_context = !empty($ctx['show_taxonomy_context']);
48
49 yatra_get_header();
50 ?>
51
52 <?php if ($show_taxonomy_context) : ?>
53 <div id="yatra-trip-context"
54 data-type="<?php echo esc_attr($current_filter_type); ?>"
55 data-slug="<?php echo esc_attr($current_filter_slug); ?>"
56 data-name="<?php echo esc_attr($current_filter_name); ?>"
57 style="display:none;"></div>
58 <?php endif; ?>
59
60 <div class="yatra-listing-page yatra-trip-listing" id="yatra-trip-listing-root">
61 <!-- Trip Search Shortcode - replaces hardcoded search UI -->
62 <div class="yatra-trip-listing-search-wrap">
63 <?php
64 // Build the [yatra_search] arguments from the Search & Listing toggles so
65 // the listing bar reflects the operator's settings explicitly at the call
66 // site. Each field becomes a yes/no argument the shortcode honours, so
67 // turning a field off in Settings → Search & Listing hides it here.
68 $yatra_search_field_settings = [
69 'keyword' => 'search_show_keyword',
70 'destination' => 'search_show_destination',
71 'activities' => 'search_show_activities',
72 'duration' => 'search_show_duration',
73 'budget' => 'search_show_budget',
74 ];
75 $yatra_search_atts = '';
76 foreach ($yatra_search_field_settings as $yatra_arg => $yatra_setting_key) {
77 $yatra_search_atts .= sprintf(
78 ' %s="%s"',
79 $yatra_arg,
80 \Yatra\Services\SettingsService::isEnabled($yatra_setting_key) ? 'yes' : 'no'
81 );
82 }
83 echo do_shortcode('[yatra_search' . $yatra_search_atts . ']');
84 ?>
85 </div>
86
87 <div class="yatra-listing-wrapper yatra-listing-wrapper--overlay-host">
88 <div id="yatra-listing-loading-overlay" class="yatra-listing-loading-overlay" aria-hidden="true" role="status">
89 <div class="yatra-listing-loading-card">
90 <span class="yatra-listing-loading-spinner" aria-hidden="true"></span>
91 <p class="yatra-listing-loading-text"><?php esc_html_e('Updating trips…', 'yatra'); ?></p>
92 </div>
93 </div>
94 <div class="yatra-listing-container">
95
96 <!-- Results Header -->
97 <div class="yatra-results-header">
98 <div class="yatra-results-info">
99 <h1><?php echo esc_html($yatra_listing_title); ?></h1>
100 <?php if (empty($show_taxonomy_context)) : ?>
101 <p class="yatra-listing-archive-lede"><?php esc_html_e('Compare trips, filter by budget and trip style, then open a trip for full details and booking.', 'yatra'); ?></p>
102 <?php elseif (!empty($current_filter_name) || !empty($current_filter_slug)) : ?>
103 <p class="yatra-listing-archive-lede"><?php
104 printf(
105 /* translators: %s: applied taxonomy filter label (destination, activity, or category name). */
106 esc_html__('Filtered by: %s', 'yatra'),
107 esc_html($current_filter_name !== '' ? $current_filter_name : (string) $current_filter_slug)
108 );
109 ?></p>
110 <?php endif; ?>
111 <p class="yatra-results-count">
112 <?php
113 if ($yatra_results['display_total'] > 0) {
114 echo sprintf(
115 /* translators: 1: first item index on the page, 2: last item index on the page, 3: total trips, 4: current page number, 5: total page count. */
116 __('Showing <strong>%1$d-%2$d</strong> of %3$d trips (Page %4$d of %5$d)', 'yatra'),
117 (int) $yatra_results['start_item'],
118 (int) $yatra_results['end_item'],
119 (int) $yatra_results['display_total'],
120 $trip_current_page,
121 $trip_total_pages
122 );
123 } else {
124 echo esc_html__('No trips found', 'yatra');
125 }
126 ?>
127 </p>
128 </div>
129 <div class="yatra-results-controls">
130 <div class="yatra-sort-control">
131 <label><?php esc_html_e('Sort by:', 'yatra'); ?></label>
132 <?php
133 ?>
134 <select id="yatra-sort-filter" class="yatra-sort-filter-select">
135 <?php foreach ($yatra_sort_options as $sort_opt) : ?>
136 <option value="<?php echo esc_attr(esc_url($sort_opt['url'])); ?>"<?php echo !empty($sort_opt['selected']) ? ' selected="selected"' : ''; ?>>
137 <?php echo esc_html($sort_opt['label']); ?>
138 </option>
139 <?php endforeach; ?>
140 </select>
141 </div>
142 <div class="yatra-view-toggle">
143 <button class="yatra-view-btn active" data-view="grid" title="<?php esc_attr_e('Grid View', 'yatra'); ?>">
144 <svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
145 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"/>
146 </svg>
147 </button>
148 <button class="yatra-view-btn" data-view="list" title="<?php esc_attr_e('List View', 'yatra'); ?>">
149 <svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
150 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
151 </svg>
152 </button>
153 </div>
154 </div>
155 </div>
156
157 <div class="yatra-listing-layout">
158 <!-- Filter Sidebar - Comprehensive Filters -->
159 <aside class="yatra-filter-sidebar"<?php echo \Yatra\Services\SettingsService::isEnabled('collapse_filters_on_mobile') ? ' data-yatra-collapse-mobile="1"' : ''; ?>>
160 <div class="yatra-filter-header">
161 <h2><?php esc_html_e('Filters', 'yatra'); ?></h2>
162 <button type="button" class="yatra-clear-filters"><?php esc_html_e('Clear all', 'yatra'); ?></button>
163 </div>
164
165 <!-- Price Range -->
166 <?php
167 $price_stats = $filter_data['price_stats'] ?? $tripListingService->getPriceStats();
168
169 $min_price = $price_stats ? (int)$price_stats->min_price : 0;
170 $max_price = $price_stats ? (int)$price_stats->max_price : 10000;
171 $step = max(1, (int)($max_price / 100)); // Dynamic step based on price range
172 ?>
173 <div class="yatra-filter-section">
174 <div class="yatra-filter-title" data-toggle="price">
175 <div class="yatra-filter-title-content">
176 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
177 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/>
178 </svg>
179 <span><?php esc_html_e('Price Range', 'yatra'); ?></span>
180 </div>
181 <div class="yatra-filter-actions">
182 <span class="yatra-clear-section" data-section="price" title="<?php esc_attr_e('Clear price filters', 'yatra'); ?>">
183 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
184 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
185 </svg>
186 </span>
187 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
188 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
189 </svg>
190 </div>
191 </div>
192 <div class="yatra-filter-content">
193 <div class="yatra-price-range">
194 <div class="yatra-price-inputs">
195 <div class="yatra-price-input-group">
196 <label class="yatra-price-input-label"><?php esc_html_e('Min Price', 'yatra'); ?></label>
197 <input type="number" name="price_min" placeholder="<?php echo $min_price; ?>" min="<?php echo $min_price; ?>" max="<?php echo $max_price; ?>" value="<?php echo !empty($active_filters['price_min']) ? esc_attr($active_filters['price_min']) : ''; ?>" id="priceMin">
198 </div>
199 <div class="yatra-price-separator">—</div>
200 <div class="yatra-price-input-group">
201 <label class="yatra-price-input-label"><?php esc_html_e('Max Price', 'yatra'); ?></label>
202 <input type="number" name="price_max" placeholder="<?php echo $max_price; ?>" min="<?php echo $min_price; ?>" max="<?php echo $max_price; ?>" value="<?php echo !empty($active_filters['price_max']) ? esc_attr($active_filters['price_max']) : ''; ?>" id="priceMax">
203 </div>
204 </div>
205 <div class="yatra-price-slider">
206 <div class="yatra-price-slider-track" aria-hidden="true"></div>
207 <div class="yatra-price-slider-range" aria-hidden="true"></div>
208 <input type="range" min="<?php echo $min_price; ?>" max="<?php echo $max_price; ?>" step="<?php echo $step; ?>" value="<?php echo !empty($active_filters['price_min']) ? esc_attr($active_filters['price_min']) : $min_price; ?>" class="yatra-range-min" id="priceRangeMin" data-default="<?php echo $min_price; ?>" data-user-set="<?php echo !empty($active_filters['price_min']) ? 'true' : 'false'; ?>">
209 <input type="range" min="<?php echo $min_price; ?>" max="<?php echo $max_price; ?>" step="<?php echo $step; ?>" value="<?php echo !empty($active_filters['price_max']) ? esc_attr($active_filters['price_max']) : $max_price; ?>" class="yatra-range-max" id="priceRangeMax" data-default="<?php echo $max_price; ?>" data-user-set="<?php echo !empty($active_filters['price_max']) ? 'true' : 'false'; ?>">
210 </div>
211 <div class="yatra-price-display"><?php echo yatra_format_price($min_price); ?> - <?php echo yatra_format_price($max_price); ?></div>
212 </div>
213 </div>
214 </div>
215
216 <!-- Trip Type Filter -->
217 <div class="yatra-filter-section">
218 <div class="yatra-filter-title" data-toggle="trip-type">
219 <div class="yatra-filter-title-content">
220 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
221 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
222 </svg>
223 <span><?php esc_html_e('Trip Type', 'yatra'); ?></span>
224 </div>
225 <div class="yatra-filter-actions">
226 <span class="yatra-clear-section" data-section="trip-type" title="<?php esc_attr_e('Clear trip type filter', 'yatra'); ?>">
227 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
228 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
229 </svg>
230 </span>
231 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
232 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
233 </svg>
234 </div>
235 </div>
236 <div class="yatra-filter-content">
237 <div class="yatra-checkbox-group">
238 <?php
239 // Get trip type options from service
240 $trip_type_options = $filter_data['trip_types'] ?? [];
241
242 foreach ($trip_type_options as $type_option) :
243 ?>
244 <label class="yatra-checkbox-label">
245 <input type="radio" name="trip_type" value="<?php echo esc_attr($type_option->value); ?>" <?php echo ($active_filters['trip_type'] === $type_option->value) ? 'checked' : ''; ?>>
246 <span><?php echo esc_html($type_option->label); ?></span>
247 <span class="yatra-filter-count">(<?php echo (int)$type_option->count; ?>)</span>
248 </label>
249 <?php endforeach; ?>
250
251 <!-- All Types Option -->
252 <label class="yatra-checkbox-label">
253 <input type="radio" name="trip_type" value="" <?php echo empty($active_filters['trip_type']) ? 'checked' : ''; ?>>
254 <span><?php esc_html_e('All Types', 'yatra'); ?></span>
255 </label>
256 </div>
257 </div>
258 </div>
259
260 <!-- Difficulty Level -->
261 <?php
262 $difficulty_levels = $filter_data['difficulty_levels'] ?? [];
263 if (!empty($difficulty_levels)) :
264 ?>
265 <div class="yatra-filter-section">
266 <div class="yatra-filter-title" data-toggle="difficulty">
267 <div class="yatra-filter-title-content">
268 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
269 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"/>
270 </svg>
271 <span><?php esc_html_e('Difficulty Level', 'yatra'); ?></span>
272 </div>
273 <div class="yatra-filter-actions">
274 <span class="yatra-clear-section" data-section="difficulty" title="<?php esc_attr_e('Clear difficulty filters', 'yatra'); ?>">
275 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
276 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
277 </svg>
278 </span>
279 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
280 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
281 </svg>
282 </div>
283 </div>
284 <div class="yatra-filter-content">
285 <?php
286 $yatra_sidebar_cb_rows = [];
287 foreach ($difficulty_levels as $level) {
288 $yatra_sidebar_cb_rows[] = [
289 'value' => $level->id,
290 'label' => $level->name,
291 'count' => (int) $level->count,
292 ];
293 }
294 $yatra_sidebar_cb_input_name = 'difficulty[]';
295 $yatra_sidebar_cb_active = $active_filters['difficulty'] ?? [];
296 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
297 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
298 ?>
299 </div>
300 </div>
301 <?php endif; ?>
302
303 <!-- Rating -->
304 <div class="yatra-filter-section">
305 <div class="yatra-filter-title" data-toggle="rating">
306 <div class="yatra-filter-title-content">
307 <svg class="yatra-filter-icon" width="18" height="18" fill="#fbbf24" viewBox="0 0 24 24">
308 <path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>
309 </svg>
310 <span><?php esc_html_e('Rating', 'yatra'); ?></span>
311 </div>
312 <div class="yatra-filter-actions">
313 <span class="yatra-clear-section" data-section="rating" title="<?php esc_attr_e('Clear rating filters', 'yatra'); ?>">
314 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
315 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
316 </svg>
317 </span>
318 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
319 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
320 </svg>
321 </div>
322 </div>
323 <div class="yatra-filter-content">
324 <div class="yatra-rating-filter">
325 <?php
326 $rating_options = $filter_data['ratings'] ?? [];
327
328 foreach ($rating_options as $option) :
329 // Show all rating options, even with 0 count for better UX
330 ?>
331 <label class="yatra-rating-option">
332 <input type="checkbox" name="rating[]" value="<?php echo esc_attr($option->rating); ?>" <?php echo in_array($option->rating, $active_filters['rating'] ?? []) ? 'checked' : ''; ?>>
333 <div class="yatra-stars-display">
334 <?php for ($i = 1; $i <= 5; $i++) : ?>
335 <svg class="yatra-star <?php echo $i <= $option->rating ? 'filled' : 'empty'; ?>" width="16" height="16" viewBox="0 0 24 24">
336 <path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="<?php echo $i <= $option->rating ? '#fbbf24' : '#e5e7eb'; ?>"/>
337 </svg>
338 <?php endfor; ?>
339 <span class="yatra-rating-label"><?php echo esc_html($option->label); ?></span>
340 <span class="yatra-filter-count">(<?php echo (int)$option->count; ?>)</span>
341 </div>
342 </label>
343 <?php endforeach; ?>
344 </div>
345 </div>
346 </div>
347
348 <!-- Trip Categories -->
349 <?php
350 $categories = $filter_data['categories'] ?? [];
351 if (!empty($categories)) :
352 ?>
353 <div class="yatra-filter-section">
354 <div class="yatra-filter-title" data-toggle="categories">
355 <div class="yatra-filter-title-content">
356 <svg class="yatra-filter-icon" width="18" height="18" fill="currentColor" viewBox="0 0 20 20">
357 <path fill-rule="evenodd" d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z" clip-rule="evenodd" />
358 </svg>
359 <span><?php esc_html_e('Categories', 'yatra'); ?></span>
360 </div>
361 <div class="yatra-filter-actions">
362 <span class="yatra-clear-section" data-section="categories" title="<?php esc_attr_e('Clear category filters', 'yatra'); ?>">
363 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
364 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
365 </svg>
366 </span>
367 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
368 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
369 </svg>
370 </div>
371 </div>
372 <div class="yatra-filter-content">
373 <?php
374 $yatra_sidebar_cb_rows = [];
375 foreach ($categories as $category) {
376 $yatra_sidebar_cb_rows[] = [
377 'value' => $category->id,
378 'label' => $category->name,
379 'count' => (int) $category->count,
380 ];
381 }
382 $yatra_sidebar_cb_input_name = 'categories[]';
383 $yatra_sidebar_cb_active = $active_filters['categories'] ?? [];
384 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
385 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
386 ?>
387 </div>
388 </div>
389 <?php endif; ?>
390
391 <!-- Destinations -->
392 <?php
393 $destinations = $filter_data['destinations'] ?? [];
394 if (!empty($destinations)) :
395 ?>
396 <div class="yatra-filter-section">
397 <div class="yatra-filter-title" data-toggle="destinations">
398 <div class="yatra-filter-title-content">
399 <svg class="yatra-filter-icon" width="18" height="18" fill="currentColor" viewBox="0 0 20 20">
400 <path fill-rule="evenodd" d="M5.05 4.05a7 7 0 119.9 9.9L10 18.9l-4.95-4.95a7 7 0 010-9.9zM10 11a2 2 0 100-4 2 2 0 000 4z" clip-rule="evenodd" />
401 </svg>
402 <span><?php esc_html_e('Destinations', 'yatra'); ?></span>
403 </div>
404 <div class="yatra-filter-actions">
405 <span class="yatra-clear-section" data-section="destinations" title="<?php esc_attr_e('Clear destination filters', 'yatra'); ?>">
406 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
407 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
408 </svg>
409 </span>
410 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
411 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
412 </svg>
413 </div>
414 </div>
415 <div class="yatra-filter-content">
416 <?php
417 $yatra_sidebar_cb_rows = [];
418 foreach ($destinations as $destination) {
419 $yatra_sidebar_cb_rows[] = [
420 'value' => $destination->id,
421 'label' => $destination->name,
422 'count' => (int) $destination->count,
423 ];
424 }
425 $yatra_sidebar_cb_input_name = 'destinations[]';
426 $yatra_sidebar_cb_active = $active_filters['destinations'] ?? [];
427 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
428 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
429 ?>
430 </div>
431 </div>
432 <?php endif; ?>
433
434 <!-- Activities -->
435 <?php
436 $activities = $filter_data['activities'] ?? [];
437 if (!empty($activities)) :
438 ?>
439 <div class="yatra-filter-section">
440 <div class="yatra-filter-title" data-toggle="activities">
441 <div class="yatra-filter-title-content">
442 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
443 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
444 </svg>
445 <span><?php esc_html_e('Activities', 'yatra'); ?></span>
446 </div>
447 <div class="yatra-filter-actions">
448 <span class="yatra-clear-section" data-section="activities" title="<?php esc_attr_e('Clear activity filters', 'yatra'); ?>">
449 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
450 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
451 </svg>
452 </span>
453 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
454 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
455 </svg>
456 </div>
457 </div>
458 <div class="yatra-filter-content">
459 <?php
460 $yatra_sidebar_cb_rows = [];
461 foreach ($activities as $activity) {
462 $yatra_sidebar_cb_rows[] = [
463 'value' => $activity->id,
464 'label' => $activity->name,
465 'count' => (int) $activity->count,
466 ];
467 }
468 $yatra_sidebar_cb_input_name = 'activities[]';
469 $yatra_sidebar_cb_active = $active_filters['activities'] ?? [];
470 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
471 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
472 ?>
473 </div>
474 </div>
475 <?php endif; ?>
476
477 <!-- Accommodation Type -->
478 <?php
479 // Get accommodation types from service
480 $accommodation_types = $filter_data['accommodations'] ?? [];
481
482 if (!empty($accommodation_types)) :
483 ?>
484 <div class="yatra-filter-section">
485 <div class="yatra-filter-title" data-toggle="accommodation">
486 <div class="yatra-filter-title-content">
487 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
488 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"/>
489 </svg>
490 <span><?php esc_html_e('Accommodation', 'yatra'); ?></span>
491 </div>
492 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
493 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
494 </svg>
495 </div>
496 <div class="yatra-filter-content">
497 <?php
498 $yatra_sidebar_cb_rows = [];
499 foreach ($accommodation_types as $accommodation) {
500 $yatra_sidebar_cb_rows[] = [
501 'value' => $accommodation->name,
502 'label' => ucwords(str_replace(['_', '-'], ' ', $accommodation->name)),
503 'count' => (int) $accommodation->trip_count,
504 ];
505 }
506 $yatra_sidebar_cb_input_name = 'accommodation[]';
507 $yatra_sidebar_cb_active = $active_filters['accommodation'] ?? [];
508 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
509 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
510 ?>
511 </div>
512 </div>
513 <?php endif; ?>
514
515 <!-- Included Services -->
516 <?php
517 // Get included services from service
518 $included_services = $filter_data['included_services'] ?? [];
519
520 if (!empty($included_services)) :
521 ?>
522 <div class="yatra-filter-section">
523 <div class="yatra-filter-title" data-toggle="services">
524 <div class="yatra-filter-title-content">
525 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
526 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"/>
527 </svg>
528 <span><?php esc_html_e('Included Services', 'yatra'); ?></span>
529 </div>
530 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
531 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
532 </svg>
533 </div>
534 <div class="yatra-filter-content">
535 <?php
536 $yatra_sidebar_cb_rows = [];
537 foreach ($included_services as $service) {
538 $yatra_sidebar_cb_rows[] = [
539 'value' => $service->service_name,
540 'label' => $service->service_name,
541 'count' => (int) $service->trip_count,
542 ];
543 }
544 $yatra_sidebar_cb_input_name = 'services[]';
545 $yatra_sidebar_cb_active = $active_filters['services'] ?? [];
546 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
547 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
548 ?>
549 </div>
550 </div>
551 <?php endif; ?>
552
553 <!-- Special Offers -->
554 <?php
555 // Get special offers from service
556 $special_offers = $filter_data['special_offers'] ?? [];
557
558 if (!empty($special_offers)) :
559 ?>
560 <div class="yatra-filter-section">
561 <div class="yatra-filter-title" data-toggle="offers">
562 <div class="yatra-filter-title-content">
563 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
564 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v13m0-13V6a2 2 0 112 2h-2zm0 0V5.5A2.5 2.5 0 109.5 8H12zm-7 4h14M5 12a2 2 0 110-4h14a2 2 0 110 4M5 12v7a2 2 0 002 2h10a2 2 0 002-2v-7"/>
565 </svg>
566 <span><?php esc_html_e('Special Offers', 'yatra'); ?></span>
567 </div>
568 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
569 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
570 </svg>
571 </div>
572 <div class="yatra-filter-content">
573 <?php
574 $yatra_sidebar_cb_rows = [];
575 foreach ($special_offers as $offer) {
576 $yatra_sidebar_cb_rows[] = [
577 'value' => $offer->value,
578 'label' => $offer->label,
579 'count' => (int) $offer->count,
580 ];
581 }
582 $yatra_sidebar_cb_input_name = 'offers[]';
583 $yatra_sidebar_cb_active = $active_filters['offers'] ?? [];
584 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
585 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
586 ?>
587 </div>
588 </div>
589 <?php endif; ?>
590
591 <!-- Booking Options -->
592 <?php
593 // Get booking options from service
594 $booking_options = $filter_data['booking_options'] ?? [];
595
596 if (!empty($booking_options)) :
597 ?>
598 <div class="yatra-filter-section">
599 <div class="yatra-filter-title" data-toggle="booking">
600 <div class="yatra-filter-title-content">
601 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
602 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
603 </svg>
604 <span><?php esc_html_e('Booking Options', 'yatra'); ?></span>
605 </div>
606 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
607 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
608 </svg>
609 </div>
610 <div class="yatra-filter-content">
611 <?php
612 $yatra_sidebar_cb_rows = [];
613 foreach ($booking_options as $option) {
614 $yatra_sidebar_cb_rows[] = [
615 'value' => $option->value,
616 'label' => $option->label,
617 'count' => (int) $option->count,
618 ];
619 }
620 $yatra_sidebar_cb_input_name = 'booking[]';
621 $yatra_sidebar_cb_active = $active_filters['booking'] ?? [];
622 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
623 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
624 ?>
625 </div>
626 </div>
627 <?php endif; ?>
628
629 <!-- Age Suitability -->
630 <?php
631 // Get age restrictions from service
632 $age_options = $filter_data['age_restrictions'] ?? [];
633
634 if (!empty($age_options)) :
635 ?>
636 <div class="yatra-filter-section">
637 <div class="yatra-filter-title" data-toggle="age">
638 <div class="yatra-filter-title-content">
639 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
640 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14.828 14.828a4 4 0 01-5.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
641 </svg>
642 <span><?php esc_html_e('Age Suitability', 'yatra'); ?></span>
643 </div>
644 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
645 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
646 </svg>
647 </div>
648 <div class="yatra-filter-content">
649 <?php
650 $yatra_sidebar_cb_rows = [];
651 foreach ($age_options as $option) {
652 $yatra_sidebar_cb_rows[] = [
653 'value' => $option->value,
654 'label' => $option->label,
655 'count' => (int) $option->count,
656 ];
657 }
658 $yatra_sidebar_cb_input_name = 'age[]';
659 $yatra_sidebar_cb_active = $active_filters['age'] ?? [];
660 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
661 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
662 ?>
663 </div>
664 </div>
665 <?php endif; ?>
666
667 <!-- Trip Attributes Filter -->
668 <?php if (is_array($yatra_trip_list) && !empty($yatra_trip_list['attributes'])) : ?>
669 <div class="yatra-filter-section">
670 <div class="yatra-filter-title" data-toggle="trip-attributes">
671 <div class="yatra-filter-title-content">
672 <svg class="yatra-filter-icon" width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
673 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z"/>
674 </svg>
675 <span><?php esc_html_e('Trip Attributes', 'yatra'); ?></span>
676 </div>
677 <div class="yatra-filter-actions">
678 <span class="yatra-clear-section" data-section="trip-attributes" title="<?php esc_attr_e('Clear trip attribute filters', 'yatra'); ?>">
679 <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
680 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
681 </svg>
682 </span>
683 <svg class="yatra-filter-arrow" width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
684 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
685 </svg>
686 </div>
687 </div>
688 <div class="yatra-filter-content">
689 <?php foreach ($yatra_trip_list['attributes'] as $attribute) : ?>
690 <?php
691 $attribute_filter_name = 'attributes[' . $attribute['id'] . ']';
692 $current_values = $active_filters['attributes'][$attribute['id']] ?? [];
693
694 $field_options = [];
695 if (!empty($attribute['field_options'])) {
696 $field_options = is_array($attribute['field_options']) ?
697 $attribute['field_options'] :
698 (json_decode($attribute['field_options'], true) ?: []);
699 }
700 ?>
701
702 <div class="yatra-attribute-item">
703 <div class="yatra-attribute-label">
704 <?php if (!empty($attribute['icon'])) : ?>
705 <?php
706 $icon_data = maybe_unserialize($attribute['icon']);
707 if (is_array($icon_data) && $icon_data['type'] === 'image' && !empty($icon_data['value'])) {
708 $image_url = '';
709 if (is_numeric($icon_data['value'])) {
710 $image_url = wp_get_attachment_image_url((int) $icon_data['value'], 'thumbnail');
711 } elseif (is_string($icon_data['value']) && filter_var($icon_data['value'], FILTER_VALIDATE_URL)) {
712 $image_url = $icon_data['value'];
713 }
714 if (!empty($image_url)) {
715 echo '<img class="yatra-attribute-icon" src="' . esc_url($image_url) . '" alt="' . esc_attr($attribute['name']) . '" width="16" height="16">';
716 }
717 } elseif (is_array($icon_data) && $icon_data['type'] === 'icon' && !empty($icon_data['value'])) {
718 echo '<span class="yatra-attribute-icon">' . yatra_svg_icon($icon_data['value'], '') . '</span>';
719 }
720 ?>
721 <?php endif; ?>
722 <span class="yatra-attribute-name"><?php echo esc_html($attribute['name']); ?></span>
723 </div>
724 <div class="yatra-attribute-content">
725 <?php if (($attribute['field_type'] === 'select' || $attribute['field_type'] === 'radio') && !empty($field_options)) : ?>
726 <?php
727 $yatra_sidebar_cb_rows = [];
728 foreach ($field_options as $option) {
729 $yatra_sidebar_cb_rows[] = [
730 'value' => $option['value'],
731 'label' => $option['label'],
732 ];
733 }
734 $yatra_sidebar_cb_input_name = $attribute_filter_name . '[]';
735 $yatra_sidebar_cb_active = $current_values;
736 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
737 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
738 ?>
739
740 <?php elseif ($attribute['field_type'] === 'checkbox' && !empty($field_options)) : ?>
741 <?php
742 $yatra_sidebar_cb_rows = [];
743 foreach ($field_options as $option) {
744 $yatra_sidebar_cb_rows[] = [
745 'value' => $option['value'],
746 'label' => $option['label'],
747 ];
748 }
749 $yatra_sidebar_cb_input_name = $attribute_filter_name . '[]';
750 $yatra_sidebar_cb_active = is_array($current_values) ? $current_values : [];
751 include __DIR__ . '/partials/listing-sidebar-collapsible-checkboxes.php';
752 unset($yatra_sidebar_cb_rows, $yatra_sidebar_cb_input_name, $yatra_sidebar_cb_active);
753 ?>
754
755 <?php elseif ($attribute['field_type'] === 'checkbox') : ?>
756 <div class="yatra-checkbox-group">
757 <label class="yatra-checkbox-label">
758 <input
759 type="checkbox"
760 name="<?php echo esc_attr($attribute_filter_name); ?>"
761 value="1"
762 <?php echo in_array('1', (array) $current_values, true) ? 'checked' : ''; ?>
763 >
764 <span><?php _e('Yes', 'yatra'); ?></span>
765 </label>
766 </div>
767
768 <?php elseif ($attribute['field_type'] === 'number') : ?>
769 <div class="yatra-input-group">
770 <input
771 type="number"
772 name="<?php echo esc_attr($attribute_filter_name); ?>[min]"
773 placeholder="<?php esc_attr_e('Min', 'yatra'); ?>"
774 value="<?php echo esc_attr($current_values['min'] ?? ''); ?>"
775 class="yatra-filter-input"
776 >
777 <input
778 type="number"
779 name="<?php echo esc_attr($attribute_filter_name); ?>[max]"
780 placeholder="<?php esc_attr_e('Max', 'yatra'); ?>"
781 value="<?php echo esc_attr($current_values['max'] ?? ''); ?>"
782 class="yatra-filter-input"
783 >
784 </div>
785
786 <?php elseif ($attribute['field_type'] === 'date') : ?>
787 <div class="yatra-input-group">
788 <input
789 type="date"
790 name="<?php echo esc_attr($attribute_filter_name); ?>[from]"
791 value="<?php echo esc_attr($current_values['from'] ?? ''); ?>"
792 class="yatra-filter-input"
793 >
794 <input
795 type="date"
796 name="<?php echo esc_attr($attribute_filter_name); ?>[to]"
797 value="<?php echo esc_attr($current_values['to'] ?? ''); ?>"
798 class="yatra-filter-input"
799 >
800 </div>
801
802 <?php else : ?>
803 <input
804 type="text"
805 name="<?php echo esc_attr($attribute_filter_name); ?>"
806 placeholder="<?php esc_attr_e('Type to filter…', 'yatra'); ?>"
807 value="<?php echo esc_attr(implode(', ', $current_values)); ?>"
808 class="yatra-filter-input"
809 >
810 <?php endif; ?>
811 </div>
812 </div>
813 <?php endforeach; ?>
814 </div>
815 </div>
816 <?php endif; ?>
817
818 </aside>
819
820 <!-- Main Content Area -->
821 <main class="yatra-listing-content">
822 <?php if (count($trips_source) > 0) : ?>
823 <div class="yatra-trip-grid" id="trip-grid">
824 <?php foreach ($trips_source as $trip) : ?>
825 <!-- Use the reusable trip-listing-card.php component -->
826 <?php include(dirname(__FILE__) . '/trip-listing-card.php'); ?>
827 <?php endforeach; ?>
828 </div>
829 <?php else : ?>
830 <div class="yatra-empty-state text-center py-12">
831 <svg class="mx-auto h-8 w-8 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
832 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
833 </svg>
834 <h3 class="mt-2 text-lg font-medium text-gray-900 dark:text-gray-100"><?php esc_html_e('No trips found', 'yatra'); ?></h3>
835 <p class="mt-1 text-gray-500 dark:text-gray-400"><?php esc_html_e('Try adjusting your search or filter to find what you\'re looking for.', 'yatra'); ?></p>
836 </div>
837 <?php endif; ?>
838
839 <div class="yatra-listing-pagination yatra-listing-pagination--trip-content">
840 <?php
841 $prev_url = $yatra_pagination['prev_url'] ?? null;
842 $next_url = $yatra_pagination['next_url'] ?? null;
843 $prev_disabled = empty($prev_url);
844 $next_disabled = empty($next_url);
845 ?>
846 <a class="yatra-pagination-btn <?php echo $prev_disabled ? 'disabled' : ''; ?>" href="<?php echo $prev_disabled ? 'javascript:void(0);' : esc_url($prev_url); ?>">
847 <?php echo yatra_svg_icon('chevron-left', 'yatra-btn-icon'); ?>
848 <span><?php esc_html_e('Previous', 'yatra'); ?></span>
849 </a>
850 <?php foreach (($yatra_pagination['items'] ?? []) as $pitem) : ?>
851 <?php if (($pitem['type'] ?? '') === 'ellipsis') : ?>
852 <span class="yatra-pagination-ellipsis">...</span>
853 <?php elseif (($pitem['type'] ?? '') === 'page') : ?>
854 <a class="yatra-pagination-btn <?php echo !empty($pitem['is_current']) ? 'active' : ''; ?>" href="<?php echo esc_url((string) ($pitem['url'] ?? '')); ?>">
855 <?php echo esc_html((string) ($pitem['page'] ?? '')); ?>
856 </a>
857 <?php endif; ?>
858 <?php endforeach; ?>
859 <a class="yatra-pagination-btn <?php echo $next_disabled ? 'disabled' : ''; ?>" href="<?php echo $next_disabled ? 'javascript:void(0);' : esc_url($next_url); ?>">
860 <span><?php esc_html_e('Next', 'yatra'); ?></span>
861 <?php echo yatra_svg_icon('chevron-right', 'yatra-btn-icon'); ?>
862 </a>
863 </div>
864 </main>
865 </div>
866 </div>
867 </div>
868 </div>
869
870 <?php
871 yatra_get_footer();
872 ?>
873