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.
