Skip to main content

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, two options control how the wall is displayed:

Option Values Default
Sort order Join date / Tier / Alphabetical Join date
Allow a “Why I support” message Toggle Off

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.

How Names Are Resolved

The name shown on each subscriber’s card follows this resolution chain:

  1. Wall name (_benecaster_wall_display_name) — the name the subscriber has set specifically for community surfaces, via the wall name field on their account page
  2. First + last namefirst_name and last_name from WordPress user meta, space-joined, when no wall name is set
  3. WordPress display name (wp_users.display_name) — the final fallback

Subscribers set their wall name from their account page when the Supporter Wall is enabled on one of their shows. If a subscriber has never set a wall name and has no first/last name on record, their WordPress display name is used. There is no per-show format dropdown — the same name appears everywhere the wall is shown.

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 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 is-subscriber" data-user="42" data-token-type="subscriber">
  <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>

Every card carries an is-follower or is-subscriber class and a matching data-token-type attribute, so a theme can style the two differently. A listener whose token type an add-on registered is classified by the base that type behaves like, never by the add-on’s own slug, so your theme’s existing CSS keeps working. A follower who opts in appears on the wall exactly like a paying subscriber — this is by design, not an oversight — but their badges include a muted Follower chip in the slot a paying subscriber’s tier badge fills, so the two are never visually identical. For a listener with an add-on’s token type, that chip reads the add-on’s own wording instead (a type labelled Superfan shows “Superfan”, not “Follower”). If the add-on is later deactivated, the chip falls back to the label of the base type, never a raw slug and never an empty chip. Sort order is unaffected by token type. See Customizing the Supporter Wall for the styling hooks this enables.

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 Benecaster 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 resolved wall 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.
  • 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.

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.

See Also

Need this built rather than just documented? See our services →