Skip to content

EP Testimonials

EP Testimonials lets you collect customer testimonials through a form on your site, moderate them, and display approved testimonials in carousel, grid, or list layouts. Star ratings and Schema.org Review markup are included.

Published by ElmsPark Studio.

  • Submission form for customers to leave testimonials.
  • Star rating (1-5).
  • Photo upload (optional) for the testifier’s picture.
  • Moderation queue — approve, reject, mark as spam.
  • Display shortcodes — carousel, grid, single, or list.
  • Schema.org Review structured data.
  • Import from CSV for migrating existing testimonials.
  • PageMotor 0.8.2b or later
  • EP Email (for admin alerts on new submissions)
  • EP Suite base class
  1. Install EP Email.
  2. ep-testimonials.zip comes with an EP Suite licence — ElmsPark supplies it directly (see EP Suite plugins); after install it updates through your site’s Updates screen.
  3. Upload via Plugins → Manage Plugins. Activate.
ShortcodePurpose
[testimonials-submit]Submission form for new testimonials.
[testimonials]List/grid display of approved testimonials.
[testimonials style=carousel]Rotating carousel.
[testimonials style=grid columns=3]Grid layout.
[testimonials limit=6]Only show 6.
[testimonials featured=true]Only featured testimonials.

Drop [testimonials-submit] on a page like /leave-a-review/. The form collects:

  • Name
  • Email (not displayed publicly)
  • Company (optional)
  • Testimonial text
  • Star rating
  • Photo (optional)

On submit, the testimonial queues for admin moderation.

From Plugin Settings → EP Testimonials → Pending:

  • Review each submission.
  • Approve, reject, or mark as spam.
  • Optionally feature notable testimonials so they appear first.

An email notification fires to admin on each new submission (via EP Email).

Rotating display, one testimonial at a time. Auto-advance or manual controls. Good for homepage hero areas.

Multiple testimonials in columns. Good for dedicated testimonials pages.

Stacked, one per row. Good for long-form reviews.

Show a specific testimonial by ID. For hero quotes or case-study page highlights.

Each testimonial renders with Review schema plus an aggregate AggregateRating schema on pages with multiple testimonials. Google’s rich result snippets can pick these up.

“Submission form shows but submissions don’t arrive”

Section titled ““Submission form shows but submissions don’t arrive””

Check EP Email is configured. Without EP Email, admin notifications fail silently.

Check the uploads directory has write permission. Also check file sizes — uploads over the PHP limit fail.

Check browser console for JS errors. Also check the carousel has at least 2 testimonials — 1-item carousels don’t rotate.

“Testimonials appear but without star rating icons”

Section titled ““Testimonials appear but without star rating icons””

CSS might not be loading. Check the plugin’s stylesheet is enqueued. Hard refresh to bypass cache.

“Imported CSV assigns all testimonials to the wrong person”

Section titled ““Imported CSV assigns all testimonials to the wrong person””

CSV needs specific headers: name,email,company,body,rating,featured. Case-sensitive. Check your CSV.

For a quick question about this plugin, EP Support inside your admin is the fastest option. The chat widget sits on every EP plugin settings page and knows which one you’re on, with starter questions and links preloaded for that exact screen.

For anything bigger — a bug report, a feature request, or a “how do I…” that needs a real reply — open a ticket at help.elmspark.com. A real person, helped by AI, writes the reply. Usually within a few hours. Tickets don’t disappear into the void.

  • The new-testimonial email now includes the testimonial. The notification sent to you when someone submits a testimonial arrived with a subject line but an empty body. It now shows the name, rating and the testimonial itself.
  • Settings language menu. The language menu in this plugin’s settings now lists only the languages it is actually translated into, plus English, so you can no longer pick a language that changes nothing.
  • Danish. Adds a Danish translation.
  • Fixes a doubled cache-busting tag on its stylesheet. On PageMotor 0.11 and later the page asked for the file with two version tags on the end of its address (?v=…?v=…), because the core had started adding its own tag and the plugin was still adding one too. The file loaded correctly, so nothing was visibly broken; the address was just malformed and every cache saw a longer key than it needed. The plugin now leaves the tag to the core on 0.11 and later, and still adds its own on older cores, where nothing else would.
  • No change to what that stylesheet does.
  • Fixes the review markup so search engines can actually read it. On PageMotor 0.10.x the testimonials were published in a shape that is not valid schema.org, so Google and other engines discarded every one of them. Star ratings could never have appeared in search results on those sites.
  • Reviews now attach to your site’s Organization and carry the average rating and the review count with them. That is the part that earns stars in search, and it was missing entirely.
  • This needs an Organization Name. Review markup is now published only when Site Settings has one set, because that is the entry that tells PageMotor to publish an Organization at all. If yours is blank the plugin stays silent rather than inventing an identity for your site. Set it in Site Settings, Structured Data, Organization Name.
  • No visible change on the page. The testimonial cards render exactly as before; this is the invisible markup underneath them.
  • Worth re-testing in Google’s Rich Results Test after updating, because previously published pages were being rejected.
  • Fixes a crash on the testimonial form when an older EP plugin is installed on the same site. Submitting the form returned an internal error and nothing was saved or sent. EP plugins share one common code library, and whichever copy loads first is the one every EP plugin on that site uses, so a single out-of-date plugin could leave this one calling a spam check its copy did not have. The check now carries its own fallback and no longer depends on another plugin being up to date.
  • No change on a site where this never happened: the same spam check runs, and nothing else changed.
  • Blocks a spam bot that was getting past the form honeypot. The scraper changed its network address on every single request, so blocking by address never caught it, but it always sent a malformed browser identifier that no real browser sends. Forms now reject anything carrying that signature, with the same silent response a caught bot already got.
  • It was not theoretical. One client site had taken 57 fake signups before this went in, and the same bot had hit 17 sites.