PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.16
Yatra – Travel Booking & Tour Operator Software v3.0.16
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.16, at templates/partials/single-trip/similar-trips.php

289 lines 18.2 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_hours = (int) ($similar_trip->duration_hours ?? 0);
52 $duration = [
53 'has_duration' => $duration_days > 0 || $duration_hours > 0,
54 // Hour-based day tour → "8 hours"; otherwise the day/night wording below.
55 'formatted' => $duration_hours > 0
56 ? yatra_format_duration(0, null, $duration_hours)
57 : ($duration_nights > 0
58 /* translators: 1: number of days, 2: number of nights. */
59 ? sprintf(_n('%1$d day %2$d night', '%1$d days %2$d nights', $duration_days, 'yatra'), $duration_days, $duration_nights)
60 /* translators: %d: number of days. */
61 : sprintf(_n('%d day', '%d days', $duration_days, 'yatra'), $duration_days))
62 ];
63
64 // Difficulty — resolve classification id to label + icon (same logic as Trip::getDifficulty / quick facts)
65 $similar_difficulty_level = isset($similar_trip->difficulty_level) && $similar_trip->difficulty_level !== ''
66 ? (string) $similar_trip->difficulty_level
67 : null;
68 $similar_difficulty_name = isset($similar_trip->difficulty_name) && $similar_trip->difficulty_name !== ''
69 ? (string) $similar_trip->difficulty_name
70 : null;
71 $difficulty = \Yatra\Models\Trip::resolveDifficultyDisplay(
72 $similar_difficulty_level,
73 $similar_difficulty_name,
74 $similar_trip->difficulty_icon ?? null
75 );
76
77 // Pricing
78 $original_price = (float) ($similar_trip->original_price ?? 0);
79 $sale_price = (float) ($similar_trip->sale_price ?? $original_price);
80 $current_price = $sale_price > 0 ? $sale_price : $original_price;
81 $discount_pct = 0;
82 $has_discount = false;
83
84 if ($original_price > 0 && $sale_price < $original_price) {
85 $discount_pct = round((($original_price - $sale_price) / $original_price) * 100);
86 // Only show discount if percentage is greater than 0
87 $has_discount = $discount_pct > 0;
88 }
89
90 $pricing = [
91 'has_price' => $current_price > 0,
92 'current_price' => yatra_format_price($current_price),
93 'original_price' => $has_discount ? yatra_format_price($original_price) : '',
94 'has_discount' => $has_discount,
95 ];
96
97 $discount = [
98 'has_discount' => $has_discount,
99 'discount_text' => $has_discount ? $discount_pct . '%' : ''
100 ];
101
102 $yatra_similar_urgency = [];
103 if (!empty($yatra_similar_dp_flags['show_urgency_messages']) && function_exists('yatra_trip_card_dynamic_pricing_urgency_lines')) {
104 $yatra_similar_urgency = yatra_trip_card_dynamic_pricing_urgency_lines((int) ($similar_trip->id ?? 0), [
105 'base_sale_price' => $current_price,
106 'base_original_price' => $original_price,
107 'sale_price' => $current_price,
108 'original_price' => $original_price,
109 'departure_date' => null,
110 'spots_remaining' => null,
111 'availability_id' => null,
112 'surface' => 'similar',
113 ]);
114 }
115
116 // Image
117 $image_url = $similar_trip->featured_image_url ?? '';
118 if (empty($image_url)) {
119 $image_url = plugins_url('assets/images/trip-placeholder.svg', YATRA_PLUGIN_FILE);
120 }
121 $image = [
122 'url' => $image_url,
123 'alt' => $title
124 ];
125
126 // Permalink — use canonical helper (pretty + plain permalink structures).
127 $permalink = '';
128 if (!empty($slug) && function_exists('yatra_get_trip_permalink')) {
129 $permalink = yatra_get_trip_permalink($similar_trip);
130 }
131
132 // Empty arrays for now (can be populated later if needed)
133 $destinations = [];
134 $categories = [];
135 $activities = [];
136
137 // Rating
138 $rating = [
139 'average_rating' => 0,
140 'review_count' => 0,
141 'formatted_rating' => '0.0',
142 'has_rating' => false
143 ];
144 ?>
145 <div class="yatra-carousel-item">
146 <div class="yatra-similar-trip-card">
147 <div class="yatra-similar-trip-image">
148 <?php if (!empty($permalink)): ?>
149 <a href="<?php echo esc_url($permalink); ?>" class="yatra-similar-image-link">
150 <img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>">
151 </a>
152 <?php else: ?>
153 <img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>">
154 <?php endif; ?>
155
156 <?php if ($discount['has_discount'] && !empty($yatra_similar_dp_flags['show_savings_badge'])): ?>
157 <div class="yatra-similar-discount-badge">
158 <?php
159 printf(
160 /* translators: %s: discount text (e.g. "10%") */
161 esc_html__('%s OFF', 'yatra'),
162 esc_html($discount['discount_text'])
163 );
164 ?>
165 </div>
166 <?php endif; ?>
167
168 <?php if (function_exists('yatra_wishlist_enabled') && yatra_wishlist_enabled()) : ?>
169 <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'); ?>">
170 <svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
171 <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"/>
172 </svg>
173 </button>
174 <?php endif; ?>
175
176 <?php if (!empty($difficulty['has_difficulty'])) : ?>
177 <div class="yatra-similar-difficulty-overlay">
178 <?php
179 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
180 echo yatra_stored_picker_icon_markup($difficulty['icon_picker'] ?? null, 'mountain', 'similar-difficulty-icon');
181 ?>
182 <?php echo ' ' . esc_html($difficulty['level']); ?>
183 </div>
184 <?php endif; ?>
185 </div>
186
187 <div class="yatra-similar-trip-content">
188 <!-- Destination -->
189 <?php if (!empty($destinations)) : ?>
190 <div class="yatra-similar-destinations">
191 <?php echo yatra_svg_icon('map-pin', 'similar-location-icon'); ?>
192 <?php
193 $destination_names = [];
194 foreach ($destinations as $destination) {
195 if (isset($destination->name)) {
196 $destination_permalink = function_exists('yatra_get_destination_permalink')
197 ? yatra_get_destination_permalink($destination)
198 : '#';
199 $destination_names[] = '<a href="' . esc_url($destination_permalink) . '" class="similar-destination-link">' . esc_html($destination->name) . '</a>';
200 }
201 }
202 echo implode(', ', $destination_names);
203 ?>
204 </div>
205 <?php endif; ?>
206
207 <h3 class="yatra-similar-trip-title">
208 <?php if (!empty($permalink)): ?>
209 <a href="<?php echo esc_url($permalink); ?>" class="yatra-similar-title-link"><?php echo esc_html($title); ?></a>
210 <?php else: ?>
211 <?php echo esc_html($title); ?>
212 <?php endif; ?>
213 </h3>
214
215 <!-- Trip Stats -->
216 <div class="yatra-similar-trip-stats">
217 <?php if ($duration['has_duration']): ?>
218 <div class="yatra-similar-stat">
219 <?php echo yatra_svg_icon('calendar', 'similar-stat-icon'); ?>
220 <span><?php echo esc_html($duration['formatted']); ?></span>
221 </div>
222 <?php endif; ?>
223
224 <?php if (!empty($similar_trip->min_travelers) || !empty($similar_trip->max_travelers)): ?>
225 <div class="yatra-similar-stat">
226 <?php echo yatra_svg_icon('users', 'similar-stat-icon'); ?>
227 <span>
228 <?php
229 $min_travelers = $similar_trip->min_travelers ?? 1;
230 $max_travelers = $similar_trip->max_travelers ?? 20;
231 echo esc_html($min_travelers . '-' . $max_travelers);
232 ?>
233 </span>
234 </div>
235 <?php endif; ?>
236
237 <?php if ($rating['has_rating'] && $rating['average_rating'] > 0): ?>
238 <div class="yatra-similar-stat">
239 <?php echo yatra_svg_icon('star', 'similar-stat-icon'); ?>
240 <span><?php echo esc_html($rating['formatted_rating']); ?></span>
241 </div>
242 <?php endif; ?>
243 </div>
244
245 <!-- Categories -->
246 <?php if (!empty($categories)) : ?>
247 <div class="yatra-similar-categories">
248 <?php foreach (array_slice($categories, 0, 2) as $category) : ?>
249 <a href="<?php echo esc_url(yatra_get_category_permalink($category)); ?>" class="yatra-similar-category-tag">
250 <?php echo esc_html($category->name); ?>
251 </a>
252 <?php endforeach; ?>
253 </div>
254 <?php endif; ?>
255
256 <div class="yatra-similar-trip-footer">
257 <div class="yatra-similar-price">
258 <?php if ($pricing['has_price']): ?>
259 <div class="yatra-similar-trip-price">
260 <span class="yatra-similar-price-label"><?php esc_html_e('From', 'yatra'); ?></span>
261 <span class="yatra-similar-price-amount"><?php echo esc_html($pricing['current_price']); ?></span>
262 <?php if (!empty($yatra_similar_dp_flags['show_original_price']) && $pricing['has_discount'] && !empty($pricing['original_price'])): ?>
263 <span class="yatra-similar-original-price"><?php echo esc_html($pricing['original_price']); ?></span>
264 <?php endif; ?>
265 </div>
266 <?php if (!empty($yatra_similar_urgency)) : ?>
267 <?php foreach ($yatra_similar_urgency as $yatra_sim_urg) : ?>
268 <div style="background-color:#fef3c7;color:#92400e;padding:4px 6px;border-radius:4px;font-size:11px;line-height:1.3;margin-top:6px;">
269 <?php echo esc_html((string) $yatra_sim_urg); ?>
270 </div>
271 <?php endforeach; ?>
272 <?php endif; ?>
273 <?php else: ?>
274 <span class="yatra-similar-trip-price yatra-similar-price-contact"><?php esc_html_e('Contact for pricing', 'yatra'); ?></span>
275 <?php endif; ?>
276 </div>
277 <?php if (!empty($permalink)): ?>
278 <a href="<?php echo esc_url($permalink); ?>" class="yatra-similar-view-btn"><?php esc_html_e('View Details', 'yatra'); ?></a>
279 <?php endif; ?>
280 </div>
281 </div>
282 </div>
283 </div>
284 <?php } ?>
285 </div>
286 </div>
287 </div>
288 </section>
289