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