Running your own theme

Publisher works on any theme that renders content properly. What it places for you, how to take that over, and which parts of the markup you can replace.

Stoat is what Publisher is developed against, so the two need no configuration. Nothing breaks if you use your own theme, or a stock one: every Publisher feature is reachable on Twenty Twenty-Five, out of the box.

What changes is who places the member-facing furniture.

What you get for free

On a theme that says nothing about Publisher:

Sign in / Subscribe in the menu Added to your primary menu — Account for a signed-in reader, Sign in and Subscribe for everybody else. Menu locations named primary, menu-1 or main are found automatically; filter owldraft_nav_fallback_locations for anything else.
The lock on a restricted post The teaser, then a heading, a line of explanation and a subscribe button.
Locked badges in listings So a reader can see what they are choosing before they click.
A small stylesheet Enough for all of the above to look deliberate rather than unstyled.

The paywall’s cut is never a theme’s business: the body of a locked post is removed from the content before any theme sees it, so no theme can leak a post by getting its markup wrong. What a theme can change is what stands in its place.

Taking parts over

Declare what you handle yourself, in functions.php:

add_theme_support( 'owldraft', array(
    'nav'    => true,   // I place sign-in / subscribe myself
    'badges' => true,   // and I mark locked posts in my own listings
    'styles' => false,  // but keep your stylesheet
) );

A bare add_theme_support( 'owldraft' ) means I handle all of it — the WooCommerce convention, and the least surprising reading.

Claim a part and Publisher stops placing it. Claim nav without placing anything, and readers have no way to sign in, so claim it and then place it:

<?php if ( function_exists( 'owldraft_member_nav' ) ) { owldraft_member_nav(); } ?>

Replacing the markup

Drop a file of the same name into an owldraft/ folder in your theme and it wins. Child theme first, then parent, then the plugin’s own default.

Template What it is
owldraft/paywall-cta.php The lock that replaces the body of a restricted post.
owldraft/member-nav.php The sign-in / account links.

The plugin default always exists, which is what makes every feature work on a theme that has never heard of us — plainly, but working.

Writing member-aware templates

Wrap anything member-facing so the theme survives the plugin being switched off:

<?php if ( function_exists( 'owldraft_active' ) && owldraft_active() ) : ?>
    <?php if ( owldraft_is_paid() ) : ?>
        …
    <?php endif; ?>
<?php endif; ?>

Plugins load before themes, so a theme can also declare its own null-returning stubs inside function_exists() blocks and call the names unguarded. That is what our own themes do. Either way, never test for OWLDRAFT_PUBLISHER_VERSION — the function names are the public surface.

Every function a theme may call is in the theme API.

Blocks, not templates

The reader-facing screens — sign in, sign up, account, newsletter — are blocks on ordinary pages, so a theme never has to template them. See the three blocks.

Next: the theme API.

Last updated September 13, 2026

Something missing or out of date? Ask us and we will fix the page.