Third-Party Widgets
Reviews, forms, booking and chat embeds take one of three shapes. Each has one correct home in a section.
Every embed is one of three shapes
Reviews, forms, booking widgets, chat — whatever the vendor, the snippet takes one of three forms, and each has one correct home in a section.
| Shape | Examples | Where it goes |
|---|---|---|
| Shortcode | CF7, WPForms, Gravity Forms, Fluent Forms, Trustindex (plugin active) | A shortcode_ content field |
| Script + container | Trustindex loader, Trustpilot TrustBox, Elfsight, SociableKit | Container in template_html, loader in section_js |
| Iframe | Calendly, TypeForm, Google Maps embed | Straight into template_html |
Shortcode widgets
Put the shortcode in a shortcode_-prefixed content field and reference it as a placeholder. The renderer
runs do_shortcode() on those fields automatically.
{ "shortcode_contact": "Error: Contact form not found.
" }
<div class="contact__form">{{shortcode_contact}}</div>
Keeping it in a field rather than the markup means the site owner can swap forms later without touching code.
The AI doesn't have to guess which forms exist — list_forms discovers them from CF7, WPForms, Gravity
Forms, Fluent Forms and others.
Script + container widgets
Put the vendor's container markup in template_html, with the exact class and data attributes the
loader looks for. Inject the loader <script> via section_js — not via template_html — so it runs once
per render and stays scoped.
<!-- template_html -->
<section class="reviews">
<h2>What clients say</h2>
<div class="ti-widget" data-widget-id="YOUR_WIDGET_ID"></div>
</section>
// section_js — guard against double-inserting on re-render
if (!document.querySelector('script[src*="trustindex.io"]')) {
var s = document.createElement('script');
s.src = 'https://cdn.trustindex.io/loader.js';
s.defer = true;
document.head.appendChild(s);
}
The most common failure is a container/loader mismatch. Trustindex loaders expect the widget-ID-specific container generated in their dashboard, not a generic div. Copy the embed snippet verbatim from the vendor rather than reconstructing it.
Iframe widgets
Paste the <iframe> directly into template_html. No loader needed.
A note on oEmbed
Plain URLs in template_html do not auto-oEmbed — the plugin renders pre-filter HTML. For YouTube,
Vimeo or Twitter, either hardcode the <iframe> (preferred, no external dependency), or call render_page
with apply_filters=true to preview the post-filter output.