Contents
Video Testimonials — Plugixa Testimonial
Attach a video URL to any testimonial. The plugin auto-detects the video type (YouTube / Vimeo / self-hosted) and renders the appropriate player.
Adding a video
Edit a testimonial and fill in Video URL. As you type, the helper text shows the detected type.
Supported URL patterns:
| URL pattern | Detected type |
|---|---|
youtube.com/watch?v=... |
youtube |
youtu.be/... |
youtube |
youtube.com/embed/... |
youtube |
youtube.com/shorts/... |
youtube |
vimeo.com/{id} |
vimeo |
player.vimeo.com/video/{id} |
vimeo |
.mp4, .webm, .ogg, .mov |
self-hosted |
Leave blank for a text-only testimonial.
Free users see the field dimmed with a PRO chip + Upgrade button overlay — the field can’t be edited without a Pro license.
Rendering strategy
YouTube
- Displays the high-quality thumbnail from
img.youtube.com/vi/{id}/hqdefault.jpg. - Shows a YouTube-style play button overlay.
- On click, JS replaces the thumbnail with a
youtube-nocookie.comiframe withautoplay=1. - Uses privacy-enhanced mode by default to minimize third-party tracking.
Vimeo
- Displays a styled placeholder (fetching Vimeo thumbnails requires a separate API call, so we use a branded placeholder).
- On click, JS replaces with a
player.vimeo.comiframe withautoplay=1.
Self-hosted
- Renders a native
<video>element with:controls— standard player UI.preload="metadata"— loads only enough to know duration.playsinline— keeps inline playback on iOS (no full-screen auto-launch).
Lazy loading
All video embeds are lazy-loaded. No iframe is created until the user clicks the thumbnail — meaning:
- Faster initial page load — no external requests to YouTube / Vimeo on page load.
- Better privacy — YouTube / Vimeo cookies don’t set until the user opts in by clicking.
- Lower memory — idle cards don’t hold iframe contexts.
The VideoPlayer JS class in testimonials.js listens for clicks on .pxt-video-thumb elements and performs the thumbnail-to-iframe swap.
Where videos render
Videos render after the testimonial text and before the rating stars in all 4 templates (grid, slider, masonry, list).
You can hide video for a specific shortcode:
[plugixa_testimonials show_video="0"]
Or hide it globally in the saved shortcode config.
16:9 aspect ratio
All videos render in a 16:9 aspect-ratio container with a black background. The CSS uses modern aspect-ratio: 16/9 for reliable sizing across themes.
If your theme enforces unusual width constraints, the video container shrinks to fit the available card width while preserving the 16:9 ratio.
Multiple videos
Each testimonial has a single video_url field. For multiple videos per testimonial, use custom fields (Pro) — see Custom Fields — with the url field type, then render them via a template override.
Import / Export
The video_url column is included in:
- CSV headers —
video_url. - JSON export — full value preservation.
- CSV import — auto-mapped from
video,video_url, orvideo_linkcolumn names.
See Import / Export.
Admin UI
In the testimonial form:
- Text field labeled Video URL with a
PlayCircleOutlineicon. - As you type, the helper text shows “Detected: YouTube” / “Detected: Vimeo” / “Detected: Self-hosted” / “No video detected.”
- Validates the URL format on blur.
Free users see the field overlaid with a PRO chip and an Upgrade button — the underlying input is disabled.
Frontend JS
The VideoPlayer class (in assets/frontend/js/testimonials.js) is initialized by TestimonialApp on DOMContentLoaded. It:
- Finds all
.pxt-video-thumbelements. - Attaches a click listener.
- On click, builds the appropriate iframe (YouTube, Vimeo) or triggers
<video>playback (self-hosted). - Handles nested nesting inside slider slides — re-initializes when Swiper creates new slide DOM.
Troubleshooting
YouTube thumbnail not appearing
- The YouTube video ID extraction may have failed — check the URL format.
- YouTube occasionally returns 404 for
hqdefault.jpg. Try a different quality suffix:hqdefault.jpg(default, 480×360)mqdefault.jpg(320×180)sddefault.jpg(640×480)maxresdefault.jpg(1280×720, not guaranteed to exist)
Vimeo iframe not loading after click
- Check the Vimeo video ID in the URL — should be numeric.
- Private Vimeo videos require embed permissions — enable “Where can this be embedded?” in Vimeo privacy settings.
Self-hosted video doesn’t play on iOS
playsinlineshould already be on the video element.- iOS requires MIME type
video/mp4— ensure the file has a.mp4extension and the server sends the correct Content-Type header.
Video container is the wrong size
.pxt-video-wrapperusesaspect-ratio: 16 / 9. If your theme’s CSS resets this, add a rule in Settings → Custom CSS:
.pxt-video-wrapper { aspect-ratio: 16/9; }
Related
- Testimonials Management
- Shortcodes —
show_videoattribute - Free vs Pro