The theme API

Every function a theme or a child theme may call — who is reading, what a post is for, where the member pages are, and the featured flag.

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.

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 ) );

See running your own theme.

Next: licence and updates.

Last updated September 13, 2026

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