PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.6
Yatra – Travel Booking & Tour Operator Software v3.0.6
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 / partials / single-trip / similar-trips.php

similar-trips.php in Yatra – Travel Booking & Tour Operator Software 3.0.6, at templates/partials/single-trip/similar-trips.php

285 lines 17.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if (!defined('ABSPATH')) {
3 exit;
4 }
5
6 // Similar Trips Section
7 // Expected variables: $trip
8 ?>
9 <section class="yatra-similar-section">
10 <div class="yatra-similar-section-container">
11 <div class="yatra-similar-section-header">
12 <h2 class="yatra-similar-section-title">
13 <?php echo yatra_svg_icon('mountain', 'yatra-similar-section-icon'); ?>
14 <?php echo esc_html__('Similar Adventures', 'yatra'); ?>
15 </h2>
16 <div class="yatra-carousel-nav">
17 <button type="button" class="yatra-carousel-btn yatra-carousel-prev" id="similar-prev" aria-label="<?php echo esc_attr__('Previous', 'yatra'); ?>">
18 <svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24">
19 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"/>
20 </svg>
21 </button>
22 <button type="button" class="yatra-carousel-btn yatra-carousel-next" id="similar-next" aria-label="<?php echo esc_attr__('Next', 'yatra'); ?>">
23 <svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24">
24 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
25 </svg>
26 </button>
27 </div>
28 </div>
29 <div class="yatra-carousel-wrapper">
30 <div class="yatra-carousel-track" id="similar-carousel">
31 <?php
32 // Use dynamic similar trips from controller, with fallback to sample data
33 $similar_trips_data = $trip->getSimilarTrips();
34
35 // Only show real trips from database - no dummy data
36
37 $yatra_similar_dp_flags = function_exists('yatra_get_dynamic_pricing_display_flags') ? yatra_get_dynamic_pricing_display_flags() : [
38 'show_original_price' => true,
39 'show_savings_badge' => true,
40 'show_urgency_messages' => false,
41 ];
42
43 foreach ($similar_trips_data as $similar_trip) {
44 // Prepare trip data directly from object properties
45 $title = $similar_trip->title ?? '';
46 $slug = $similar_trip->slug ?? '';
47
48 // Duration
49 $duration_days = (int) ($similar_trip->duration_days ?? 0);
50 $duration_nights = (int) ($similar_trip->duration_nights ?? 0);
51 $duration = [
52 'has_duration' => $duration_days > 0,
53 'formatted' => $duration_nights > 0
54 /* translators: 1: number of days, 2: number of nights. */
55 ? sprintf(_n('%1$d day %2$d night', '%1$d days %2$d nights', $duration_days, 'yatra'), $duration_days, $duration_nights)
56 /* translators: %d: number of days. */
57 : sprintf(_n('%d day', '%d days', $duration_days, 'yatra'), $duration_days)
58 ];
59
60 // Difficulty — resolve classification id to label + icon (same logic as Trip::getDifficulty / quick facts)
61 $similar_difficulty_level = isset($similar_trip->difficulty_level) && $similar_trip->difficulty_level !== ''
62 ? (string) $similar_trip->difficulty_level
63 : null;
64 $similar_difficulty_name = isset($similar_trip->difficulty_name) && $similar_trip->difficulty_name !== ''
65 ? (string) $similar_trip->difficulty_name
66 : null;
67 $difficulty = \Yatra\Models\Trip::resolveDifficultyDisplay(
68 $similar_difficulty_level,
69 $similar_difficulty_name,
70 $similar_trip->difficulty_icon ?? null
71 );
72
73 // Pricing
74 $original_price = (float) ($similar_trip->original_price ?? 0);
75 $sale_price = (float) ($similar_trip->sale_price ?? $original_price);
76 $current_price = $sale_price > 0 ? $sale_price : $original_price;
77 $discount_pct = 0;
78 $has_discount = false;
79
80 if ($original_price > 0 && $sale_price < $original_price) {
81 $discount_pct = round((($original_price - $sale_price) / $original_price) * 100);
82 // Only show discount if percentage is greater than 0
83 $has_discount = $discount_pct > 0;
84 }
85
86 $pricing = [
87 'has_price' => $current_price > 0,
88 'current_price' => yatra_format_price($current_price),
89 'original_price' => $has_discount ? yatra_format_price($original_price) : '',
90 'has_discount' => $has_discount,
91 ];
92
93 $discount = [
94 'has_discount' => $has_discount,
95 'discount_text' => $has_discount ? $discount_pct . '%' : ''
96 ];
97
98 $yatra_similar_urgency = [];
99 if (!empty($yatra_similar_dp_flags['show_urgency_messages']) && function_exists('yatra_trip_card_dynamic_pricing_urgency_lines')) {
100 $yatra_similar_urgency = yatra_trip_card_dynamic_pricing_urgency_lines((int) ($similar_trip->id ?? 0), [
101 'base_sale_price' => $current_price,
102 'base_original_price' => $original_price,
103 'sale_price' => $current_price,
104 'original_price' => $original_price,
105 'departure_date' => null,
106 'spots_remaining' => null,
107 'availability_id' => null,
108 'surface' => 'similar',
109 ]);
110 }
111
112 // Image
113 $image_url = $similar_trip->featured_image_url ?? '';
114 if (empty($image_url)) {
115 $image_url = plugins_url('assets/images/trip-placeholder.svg', YATRA_PLUGIN_FILE);
116 }
117 $image = [
118 'url' => $image_url,
119 'alt' => $title
120 ];
121
122 // Permalink — use canonical helper (pretty + plain permalink structures).
123 $permalink = '';
124 if (!empty($slug) && function_exists('yatra_get_trip_permalink')) {
125 $permalink = yatra_get_trip_permalink($similar_trip);
126 }
127
128 // Empty arrays for now (can be populated later if needed)
129 $destinations = [];
130 $categories = [];
131 $activities = [];
132
133 // Rating
134 $rating = [
135 'average_rating' => 0,
136 'review_count' => 0,
137 'formatted_rating' => '0.0',
138 'has_rating' => false
139 ];
140 ?>
141 <div class="yatra-carousel-item">
142 <div class="yatra-similar-trip-card">
143 <div class="yatra-similar-trip-image">
144 <?php if (!empty($permalink)): ?>
145 <a href="<?php echo esc_url($permalink); ?>" class="yatra-similar-image-link">
146 <img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>">
147 </a>
148 <?php else: ?>
149 <img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>">
150 <?php endif; ?>
151
152 <?php if ($discount['has_discount'] && !empty($yatra_similar_dp_flags['show_savings_badge'])): ?>
153 <div class="yatra-similar-discount-badge">
154 <?php
155 printf(
156 /* translators: %s: discount text (e.g. "10%") */
157 esc_html__('%s OFF', 'yatra'),
158 esc_html($discount['discount_text'])
159 );
160 ?>
161 </div>
162 <?php endif; ?>
163
164 <?php if (function_exists('yatra_wishlist_enabled') && yatra_wishlist_enabled()) : ?>
165 <button type="button" class="yatra-favorite-btn yatra-similar-favorite-btn" data-trip-id="<?php echo esc_attr($similar_trip->id); ?>" title="<?php esc_attr_e('Save to wishlist', 'yatra'); ?>" aria-label="<?php esc_attr_e('Save to wishlist', 'yatra'); ?>">
166 <svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
167 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"/>
168 </svg>
169 </button>
170 <?php endif; ?>
171
172 <?php if (!empty($difficulty['has_difficulty'])) : ?>
173 <div class="yatra-similar-difficulty-overlay">
174 <?php
175 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
176 echo yatra_stored_picker_icon_markup($difficulty['icon_picker'] ?? null, 'mountain', 'similar-difficulty-icon');
177 ?>
178 <?php echo ' ' . esc_html($difficulty['level']); ?>
179 </div>
180 <?php endif; ?>
181 </div>
182
183 <div class="yatra-similar-trip-content">
184 <!-- Destination -->
185 <?php if (!empty($destinations)) : ?>
186 <div class="yatra-similar-destinations">
187 <?php echo yatra_svg_icon('map-pin', 'similar-location-icon'); ?>
188 <?php
189 $destination_names = [];
190 foreach ($destinations as $destination) {
191 if (isset($destination->name)) {
192 $destination_permalink = function_exists('yatra_get_destination_permalink')
193 ? yatra_get_destination_permalink($destination)
194 : '#';
195 $destination_names[] = '<a href="' . esc_url($destination_permalink) . '" class="similar-destination-link">' . esc_html($destination->name) . '</a>';
196 }
197 }
198 echo implode(', ', $destination_names);
199 ?>
200 </div>
201 <?php endif; ?>
202
203 <h3 class="yatra-similar-trip-title">
204 <?php if (!empty($permalink)): ?>
205 <a href="<?php echo esc_url($permalink); ?>" class="yatra-similar-title-link"><?php echo esc_html($title); ?></a>
206 <?php else: ?>
207 <?php echo esc_html($title); ?>
208 <?php endif; ?>
209 </h3>
210
211 <!-- Trip Stats -->
212 <div class="yatra-similar-trip-stats">
213 <?php if ($duration['has_duration']): ?>
214 <div class="yatra-similar-stat">
215 <?php echo yatra_svg_icon('calendar', 'similar-stat-icon'); ?>
216 <span><?php echo esc_html($duration['formatted']); ?></span>
217 </div>
218 <?php endif; ?>
219
220 <?php if (!empty($similar_trip->min_travelers) || !empty($similar_trip->max_travelers)): ?>
221 <div class="yatra-similar-stat">
222 <?php echo yatra_svg_icon('users', 'similar-stat-icon'); ?>
223 <span>
224 <?php
225 $min_travelers = $similar_trip->min_travelers ?? 1;
226 $max_travelers = $similar_trip->max_travelers ?? 20;
227 echo esc_html($min_travelers . '-' . $max_travelers);
228 ?>
229 </span>
230 </div>
231 <?php endif; ?>
232
233 <?php if ($rating['has_rating'] && $rating['average_rating'] > 0): ?>
234 <div class="yatra-similar-stat">
235 <?php echo yatra_svg_icon('star', 'similar-stat-icon'); ?>
236 <span><?php echo esc_html($rating['formatted_rating']); ?></span>
237 </div>
238 <?php endif; ?>
239 </div>
240
241 <!-- Categories -->
242 <?php if (!empty($categories)) : ?>
243 <div class="yatra-similar-categories">
244 <?php foreach (array_slice($categories, 0, 2) as $category) : ?>
245 <a href="<?php echo esc_url(yatra_get_category_permalink($category)); ?>" class="yatra-similar-category-tag">
246 <?php echo esc_html($category->name); ?>
247 </a>
248 <?php endforeach; ?>
249 </div>
250 <?php endif; ?>
251
252 <div class="yatra-similar-trip-footer">
253 <div class="yatra-similar-price">
254 <?php if ($pricing['has_price']): ?>
255 <div class="yatra-similar-trip-price">
256 <span class="yatra-similar-price-label"><?php esc_html_e('From', 'yatra'); ?></span>
257 <span class="yatra-similar-price-amount"><?php echo esc_html($pricing['current_price']); ?></span>
258 <?php if (!empty($yatra_similar_dp_flags['show_original_price']) && $pricing['has_discount'] && !empty($pricing['original_price'])): ?>
259 <span class="yatra-similar-original-price"><?php echo esc_html($pricing['original_price']); ?></span>
260 <?php endif; ?>
261 </div>
262 <?php if (!empty($yatra_similar_urgency)) : ?>
263 <?php foreach ($yatra_similar_urgency as $yatra_sim_urg) : ?>
264 <div style="background-color:#fef3c7;color:#92400e;padding:4px 6px;border-radius:4px;font-size:11px;line-height:1.3;margin-top:6px;">
265 <?php echo esc_html((string) $yatra_sim_urg); ?>
266 </div>
267 <?php endforeach; ?>
268 <?php endif; ?>
269 <?php else: ?>
270 <span class="yatra-similar-trip-price yatra-similar-price-contact"><?php esc_html_e('Contact for pricing', 'yatra'); ?></span>
271 <?php endif; ?>
272 </div>
273 <?php if (!empty($permalink)): ?>
274 <a href="<?php echo esc_url($permalink); ?>" class="yatra-similar-view-btn"><?php esc_html_e('View Details', 'yatra'); ?></a>
275 <?php endif; ?>
276 </div>
277 </div>
278 </div>
279 </div>
280 <?php } ?>
281 </div>
282 </div>
283 </div>
284 </section>
285