Read-only, no side effects, safe to call from any template once plugins have loaded. The short owldraft_ prefix is the public surface; anything spelled owldraft_publisher_ is internal and may change.
Is any of this here?
owldraft_active() // is Publisher installed and running
owldraft_members_active() // is the membership half here
Wrap member-facing markup in the first of these, or declare null-returning stubs of the names you use inside function_exists() blocks in your theme — plugins load before themes, so ours win when we are installed and yours stand in when we are not.
Who is reading
owldraft_member() // object|null { id, email, name, tier, tier_id,
// tier_name, is_paid, subscribed }
owldraft_is_member() // bool — signed in as a reader
owldraft_tier() // string — their tier slug, '' if none
owldraft_is_paid() // bool — paying or comped
A signed-in reader who has never paid is still a member. There is no such thing here as an account that is not one.
What a post is for
owldraft_post_visibility( $post = null ) // 'public' | 'members' | 'paid' | 'tiers'
owldraft_post_tiers( $post = null ) // [ { slug, name }, … ] for 'tiers' posts
owldraft_has_access( $post = null ) // bool — may this reader read it in full
owldraft_is_locked( $post = null ) // bool — restricted AND out of reach
owldraft_is_locked() is the one a listing asks before drawing a lock badge: a public post is never locked, and a members-only post is not locked for a member.
An unset visibility reads as the site default, so these never disagree with the paywall.
One caveat worth knowing: anyone who can edit the post passes the gate, so an editor previewing their own paid story on the front end sees it. That is correct — they can read it in wp-admin anyway — but it does mean your own account is not a way to check what a reader will see. Use a private window.
Featured posts
owldraft_is_featured( $post = null ) // bool
owldraft_featured_query_args( $args = [] ) // merge into a WP_Query
owldraft_featured_posts( $args = [] ) // WP_Post[]
$hero = owldraft_featured_posts( array( 'posts_per_page' => 3 ) );
Where the member pages are
owldraft_signin_url( $redirect = '' ) // ask for a sign-in link
owldraft_signup_form_url( $redirect = '' ) // the sign-up form
owldraft_signup_url( $redirect = '' ) // the plans
owldraft_pricing_url( $redirect = '' ) // the pricing page
owldraft_account_url() // the reader's account
owldraft_signout_url( $redirect = '' ) // sign out
Always ask rather than hard-coding a path: each one walks the fallback chain in the four pages, so the link still works on a site where that page was never set.
$redirect is where the reader lands afterwards — pass the current URL to send someone back to the article they were reading.
The member nav
owldraft_get_member_nav( $args = [] ) // string
owldraft_member_nav( $args = [] ) // echoes it
Sign in and Subscribe for a stranger, Account for a reader. Renders through owldraft/member-nav.php, which your theme may replace.
If you place this yourself, declare it — otherwise Publisher adds its own set to your primary menu and readers get two:
add_theme_support( 'owldraft', array( 'nav' => true ) );
Next: licence and updates.
