How to Create a Custom Display with Subscription Info on WordPress

Quick Answer

To display subscription info on WordPress, use WooCommerce Subscriptions for e-commerce or MemberPress for content. For a fully custom display, register a shortcode that queries user meta and subscription post data, then output it anywhere in your theme.

What Is a Subscription-Based Website?

A subscription-based website charges users a recurring fee — monthly, quarterly, or annually — in exchange for ongoing access to content, services, products, or software. Think streaming platforms, online courses, digital newsletters, and SaaS tools. WordPress has powered subscription sites since the early days of membership plugins, and today the ecosystem is mature enough to handle everything from a simple paywall to a fully featured subscription management dashboard.

The key challenge isn’t taking the payment — WooCommerce Subscriptions, MemberPress, and Stripe handle that reliably. The challenge is displaying that subscription data to the right user, at the right time, in a way that builds trust and reduces churn. A subscriber who can clearly see their plan details, renewal date, usage metrics, and upgrade options is far less likely to cancel out of confusion or frustration.

In this article, I’ll walk through the WordPress-specific techniques I use to build custom subscription displays — from simple shortcodes to full CPT-based dashboards. Every approach shown here is something I’ve shipped on real production sites.

WordPress Options for Displaying Subscription Info

Before writing a single line of code, it’s worth understanding the available options. WordPress gives you three broad paths:

Plugin-provided account pages: WooCommerce Subscriptions adds subscription details to the standard WooCommerce “My Account” area. MemberPress has its own member dashboard. These work out of the box but are limited in how much you can customize their display without diving into template overrides.

Template overrides: You can copy WooCommerce or MemberPress templates into your child theme and modify the HTML/PHP directly. This gives you pixel-level control but ties you to the plugin’s data structure and requires maintenance on plugin updates.

Custom shortcodes and blocks: The most flexible approach. You write PHP functions that query subscription data directly and output whatever HTML you want. Embed them via shortcode on any page or create a custom Gutenberg block. This is what I recommend for any site that needs a branded, non-generic subscription dashboard.

Using Custom Post Types for Subscriber Content

One underused pattern in WordPress subscription sites is storing subscription-gated content as Custom Post Types (CPTs) with access rules tied to subscription tiers. Instead of hiding existing posts behind a paywall, you register a protected_resource CPT whose archive and single templates only render content for users with an active subscription.

This approach has several advantages: the content is cleanly separated from public posts, you can assign custom fields (like “required plan tier”) to each piece of content, and you can build a subscriber-only dashboard that lists exactly what they have access to. Combined with user meta that stores their subscription tier, the display logic becomes straightforward.

Register your CPT with register_post_type(), add a custom capability read_protected_resource, and assign that capability to subscriber roles when a payment is confirmed. On plan expiry, remove the capability. This keeps access control within WordPress’s native permission system rather than in scattered conditional checks throughout your templates.

Displaying Dynamic Subscription Data with Shortcodes

Shortcodes are the simplest way to display user-specific subscription information on any page without modifying theme templates. Here’s a practical example that retrieves and displays a WooCommerce subscription’s key details:

/**
 * Shortcode: [wpdev_subscription_info]
 * Displays the current user's active WooCommerce Subscription details.
 */
function wpdev_subscription_info_shortcode() {
    if ( ! is_user_logged_in() ) {
        return '<p>Please <a href="' . wp_login_url( get_permalink() ) . '">log in</a> to view your subscription.</p>';
    }

    $user_id       = get_current_user_id();
    $subscriptions = wcs_get_users_subscriptions( $user_id );

    if ( empty( $subscriptions ) ) {
        return '<p>You have no active subscriptions. <a href="/pricing">Browse plans</a>.</p>';
    }

    $output = '<div class="wpdev-subscription-display">';
    foreach ( $subscriptions as $sub ) {
        $status     = $sub->get_status();
        $plan_name  = $sub->get_items() ? current( $sub->get_items() )->get_name() : 'N/A';
        $next_date  = $sub->get_date( 'next_payment' );
        $end_date   = $sub->get_date( 'end' );

        $output .= '<div class="sub-card">';
        $output .= '<strong>' . esc_html( $plan_name ) . '</strong>';
        $output .= '<span class="sub-status status-' . esc_attr( $status ) . '">' . ucfirst( $status ) . '</span>';
        $output .= '<p>Next renewal: ' . esc_html( $next_date ? date_i18n( get_option( 'date_format' ), strtotime( $next_date ) ) : 'N/A' ) . '</p>';
        $output .= '</div>';
    }
    $output .= '</div>';

    return $output;
}
add_shortcode( 'wpdev_subscription_info', 'wpdev_subscription_info_shortcode' );

Place [wpdev_subscription_info] on any page and it renders the current user’s subscription status, plan name, and renewal date. You can style the output with CSS targeted at .wpdev-subscription-display.

WooCommerce Subscriptions vs Custom PHP Solution

WooCommerce Subscriptions is the dominant solution for e-commerce subscription businesses on WordPress. It handles the full lifecycle: trial periods, pause/resume, proration on upgrades, failed payment retries, and dunning emails. If your site sells physical or digital products on a recurring basis, WooCommerce Subscriptions is the right tool — the development cost of replicating that functionality from scratch far outweighs the license fee.

However, for non-commerce subscription use cases — a news site, a SaaS tool, a members-only community — a custom PHP solution built on top of Stripe’s API can be leaner and more tailored. You store subscription state in user meta, handle webhooks via a custom REST endpoint, and build your display layer exactly as your designers specify. This is more work upfront but gives you zero plugin dependencies and a UI that’s uniquely yours.

My general recommendation: use WooCommerce Subscriptions if you’re already running WooCommerce and selling products. Use a custom solution if the subscription is the core product, the UI needs to be highly differentiated, or the WooCommerce overhead isn’t justified by your product catalog.

Protecting Content by Subscription Level

Displaying subscription info is only half the challenge — the other half is protecting the right content behind the right tier. The most reliable approach in WordPress is to store the user’s tier in user meta (e.g., wpdev_subscription_tier with a value of free, pro, or enterprise) and then check that meta in your template or shortcode before outputting protected content.

Update this meta via a WooCommerce order status hook, a MemberPress membership event, or a Stripe webhook handler. The display logic then becomes: if the user’s tier grants access to this content, show it; otherwise, show a teaser and an upgrade prompt. This pattern is simple, fast, and doesn’t require a separate content restriction plugin.

Key Takeaway

The most reliable WordPress subscription display combines a membership plugin for payment handling with custom shortcodes or CPTs for the user-facing dashboard. This gives you the payment reliability of a battle-tested plugin and the design freedom of fully custom code.

Frequently Asked Questions

A subscription-based website charges users a recurring fee in exchange for ongoing access to content, services, or products. WordPress powers thousands of such sites through plugins like WooCommerce Subscriptions, MemberPress, and Restrict Content Pro. The key differentiator from one-time purchases is the recurring billing cycle and access management tied to subscription status.

Query the logged-in user’s subscriptions from your subscription plugin’s API (for example WooCommerce Subscriptions exposes functions to get a customer’s subscriptions) and render them in a ‘My Account’ area or a shortcode/block. Show status, next renewal date, and manage/cancel links. For a custom build, store subscription records against the user ID and template a dashboard that lists them.

The three primary subscription models are: (1) Fixed-rate — a set price for a defined tier of access, the most common model; (2) Usage-based — pricing scales with consumption (API calls, storage, seats); and (3) Freemium — a free baseline tier exists alongside paid plans with more features. Most WordPress membership sites use the fixed-rate model.

For selling recurring products, WooCommerce Subscriptions is the standard; for memberships and gated content, Paid Memberships Pro, MemberPress, or Restrict Content Pro are common. Choice depends on whether you’re billing for products vs. access, which payment gateways you need, and how much custom logic is involved. For complex or checkout-integrated needs, a custom layer on top of one of these is often the cleanest.

Gate content by checking the user’s subscription/membership status before rendering — via the plugin’s capability or membership-level checks in your templates, or with a membership plugin’s built-in content rules. For custom code, hook the_content or template_redirect, verify an active subscription for the current user, and show the content or a paywall/login prompt accordingly.

Services like Rocket Money and Truebill analyze your bank or card statements to identify recurring charges. For your own WordPress subscription site, you build a custom member dashboard using WooCommerce Subscriptions data or user meta, displaying each subscriber’s active plans, renewal dates, and usage in one place.

Subscriptions can cause subscriber fatigue, elevated churn if perceived value drops, and customer frustration with automatic renewals. Technically, subscription data adds database complexity, and you need solid cancellation, refund, and dunning workflows. Displaying clear, transparent subscription info — exactly what this article covers — directly reduces these downsides.

Yes, but weigh the cost. You’d integrate a payment gateway’s recurring-billing API (e.g. Stripe Billing), handle webhooks for renewals, failures, and cancellations, store subscription state against users, and gate content yourself. For full control or unusual logic it’s worth it; for standard recurring billing, a proven plugin is faster, safer, and cheaper to maintain.

Related Resources

Custom WordPress Development

Bespoke WordPress platforms built for membership and subscription businesses.

Custom WordPress Development

Custom PHP Development

Stripe-integrated subscription systems built with custom PHP.

Custom PHP Development

Protect Custom Post Types

How to lock CPT content behind roles and subscription tiers.

Protect Custom Post Types