Documentation

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 existlist_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.