Supporter Wall
The Supporter Wall is a public page on your site that displays a grid or list of subscribers who have opted in to be shown publicly. Each card shows the subscriber’s avatar, display name, tier badges, and optionally a short message from them. It’s a social recognition surface for your most engaged listeners and a trust signal for prospective subscribers.
Note: The Supporter Wall ships with the feature/internal-membership-supporter-wall batch. The avatar and badge infrastructure it depends on is already in place — this feature plugs directly into it.
Enabling the Wall
Go to Benecaster → Shows → [Your Show] → Subscription → Supporter Wall and toggle Enable Supporter Wall on.
Configuration Options
Once enabled, four options control how the wall is displayed:
| Option | Values | Default |
|---|---|---|
| Display name format | Display name / Username / First name only | Display name |
| Sort order | Join date / Tier / Alphabetical | Join date |
| Allow a “Why I support” message | Toggle | Off |
Display name format controls what name appears on each subscriber card. “First name only” is a privacy-friendly option for subscribers who prefer not to expose their full WordPress display name.
Allow a “Why I support” message (_benecaster_show_supporter_wall_show_why_field) — when enabled, subscribers see a text field on their account page where they can add a message that appears on their card (e.g. “I’ve been listening for three years and your deep dives changed how I think about audio.”). Messages are limited to 240 characters. The field is optional for subscribers even when this setting is on — a subscriber who has opted in but left the message blank produces no message markup on their card.
The [benecaster_supporter_wall] Shortcode
Place the wall on any page or post:
[benecaster_supporter_wall show_id="N"]
The shortcode renders only opted-in subscribers. The display respects the sort order and display name format configured in the show editor, and can be overridden per-placement using the shortcode attributes.
| Attribute | Default | Description |
|---|---|---|
show_id |
— | Required. Post ID of the show whose wall to display |
limit |
100 |
Maximum number of subscribers to render. Server-clamped to 500 — values above 500 are silently reduced to 500 |
tier |
(all) | Filter to subscribers on a specific tier slug. Supports a single slug only |
order |
(show setting) | Override the show’s configured sort order. Accepts join_date, tier, or alphabetical |
Per-card Markup
Each subscriber renders as:
<div class="benecaster-supporter-wall__card" data-user="42">
<div class="benecaster-supporter-wall__avatar">
<!-- 96 × 96 avatar img, or generated-initial fallback -->
</div>
<div class="benecaster-supporter-wall__name">Display Name</div>
<div class="benecaster-supporter-wall__badges">
<!-- badge chips — omitted entirely when the subscriber has no badges -->
</div>
<p class="benecaster-supporter-wall__message">Why I support message text</p>
</div>
The benecaster-supporter-wall__message element is only present when both the show’s Allow a “Why I support” message toggle is on AND the subscriber has written a non-empty message. Subscribers with an empty message produce no <p> element — there is no empty paragraph in the markup.
The class names are part of the stable public API — theme CSS should target these classes. The outer wall wrapper is:
<div class="benecaster-supporter-wall" data-show="N">
<!-- subscriber cards -->
</div>
Empty State
When the wall is enabled but no subscribers have opted in, the shortcode renders:
<div class="benecaster-supporter-wall benecaster-supporter-wall--empty" data-show="N">
<p class="benecaster-supporter-wall__empty-message">No supporters yet — be the first!</p>
</div>
The empty-state message is translatable and can be overridden via the benecaster_supporter_wall_empty_message filter. The shortcode renders nothing at all when the wall is disabled for the show.
Default Stylesheet
The plugin ships assets/css/supporter-wall.css and auto-enqueues it when the [benecaster_supporter_wall] shortcode emits output. The stylesheet depends on benecaster-badges so badge chips inherit the core chip styles without additional setup.
Four CSS custom properties control the grid layout and can be set from your theme or child theme’s stylesheet:
| Property | Default | Controls |
|---|---|---|
--benecaster-supporter-wall-columns |
repeat(auto-fill, minmax(8rem, 1fr)) |
Grid column template |
--benecaster-supporter-wall-gap |
1rem |
Gap between cards |
--benecaster-supporter-wall-card-padding |
0.75rem |
Padding inside each card |
--benecaster-supporter-wall-avatar-size |
4rem |
Avatar image size |
Example — wider cards on a full-width page:
.my-wall-page .benecaster-supporter-wall {
--benecaster-supporter-wall-columns: repeat(auto-fill, minmax(12rem, 1fr));
--benecaster-supporter-wall-avatar-size: 6rem;
}
The stylesheet is lightweight and does not assume a specific breakpoint — the auto-fill / minmax default adapts to any column width naturally.
Subscriber Opt-In
Subscribers control their own visibility. The opt-in appears on the subscriber account page as a “Show me on the Supporter Wall” checkbox inside the Profile Picture section — but only when the Supporter Wall is active on at least one of their shows.
When a subscriber opts in:
- Their avatar and badge chips become visible on the wall
- If “Allow a ‘Why I support’ message” is enabled, a message textarea appears below the opt-in checkbox for them to write their message
When a subscriber opts out:
- They are removed from the wall immediately
- Their avatar and badges are unaffected on other surfaces (account page, admin list)
- If they re-opt-in later, their avatar and badges reappear
Subscribers without an uploaded avatar appear with a generated initial based on their display name.
Writing a “Why I Support” Message
When both Enable Supporter Wall and Allow a “Why I support” message are turned on for a show, subscribers see a message textarea on their account page:
- The textarea appears below the “Show me on the Supporter Wall” checkbox, but only when the subscriber has checked the opt-in box. Unchecking the opt-in box hides the textarea immediately via JavaScript — no page reload required.
- A live 240-character counter below the textarea counts down as the subscriber types. Messages over 240 characters cannot be saved.
- A “Save message” button commits the text. The message is saved independently of the opt-in checkbox — checking in and writing a message are two separate actions, each with their own save.
- The message appears on the subscriber’s wall card immediately after saving.
- Subscribers can update or clear their message at any time. Clearing the message removes it from the wall card — no empty paragraph is displayed.
- Writing a message is always optional, even when the feature is enabled by the show admin.
Privacy
- Opt-in is required. No subscriber appears on the wall without explicitly checking the opt-in box. No subscriber is enrolled automatically.
- When the wall is enabled on a show, the avatar upload UI shows a disclosure: “Your avatar will be visible on the Supporter Wall.” This runs before the subscriber decides whether to opt in.
- Subscribers can opt out at any time from their account page. The removal is immediate — no waiting for a cache flush.
- Only subscribers with an active token on a wall-enabled show see the opt-in checkbox.
For Developers
benecaster_supporter_wall_enabled( int $show_id )— action that fires when the wall is enabled for a show (0 → 1 transition only; same-value saves do not fire).benecaster_supporter_wall_disabled( int $show_id )— action that fires when the wall is disabled (1 → 0 transition only). Use both to invalidate page caches.benecaster_subscriber_wall_visible( int $user_id, bool $visible )— action that fires after every subscriber opt-in or opt-out write, including same-value saves. Use to sync consent state to external CRMs or audit logs.benecaster_supporter_wall_active( bool $active, int $user_id )— filter that drives the avatar privacy disclosure. Returns true when any active show for the user has the wall enabled. Add-ons can override the logic.benecaster_supporter_wall_empty_message( string $message, int $show_id, array $atts )— filter to override the empty-state copy. Return an empty string to suppress the message entirely. See [benecaster_supporter_wall_empty_message](/docs/benecaster_supporter_wall_empty_message/).benecaster_supporter_wall_output( string $html, int $show_id, array $subscribers, array $atts )— filter to wrap or replace the full shortcode HTML, including both the populated and empty branches. See [benecaster_supporter_wall_output](/docs/benecaster_supporter_wall_output/).
The wall data is also available as a public REST endpoint — GET /benecaster/v1/shows/{id}/supporter-wall — for headless or JavaScript-driven rendering. See Supporter Wall REST API.
See SupporterWallManager for the class reference.