Last active
July 3, 2018 11:50
-
-
Save tomjn/6089867 to your computer and use it in GitHub Desktop.
A base class used to create arbitrary content at arbitrary URLs in WordPress without needing a post or listing/archive to host it
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* A helper class to implement arbitrary content at arbitrary URLs without a supporting post or page. | |
* Inherit from this class and implement the render_page method | |
* | |
* @author: Tom J Nowell ww.tomjn.com | |
* @License: GPL 2+ | |
*/ | |
abstract class Tomjn_Custom_Page { | |
/** | |
* Saves the options container and sets up some WP hooks | |
*/ | |
public function __construct( $options ) { | |
$this->options = $options; | |
// add our rewrite rules | |
add_filter( 'generate_rewrite_rules', array( $this, 'custom_page_generate_rewrite_rules' ) ); | |
// add our custom query variable to the whitelist | |
add_filter( 'query_vars', array( $this, 'custom_page_query_vars' ) ); | |
// dont pull in a full listing of posts in the main query, there's no need | |
// ( you can comment this out if you're not using a theme template to render content ) | |
add_filter( 'pre_get_posts', array( $this, 'custom_page_paging_issue' ) ); | |
// call render_page() when needed | |
add_action( 'template_redirect', array( $this, 'custom_page_template_redirect' ) ); | |
} | |
/** | |
* Add our rewrite rules | |
*/ | |
function custom_page_generate_rewrite_rules( $wp_rewrite ) { | |
$pagename = $this->options['pagename']; | |
$custom_page_rules = array( | |
$this->options['url'] => 'index.php?custom_page='.$pagename.'&posts_per_page=1&paged=1' | |
); | |
$wp_rewrite->rules = $custom_page_rules + $wp_rewrite->rules; | |
} | |
/** | |
* Filter that inserts our query variable into the $wp_query | |
*/ | |
function custom_page_query_vars( $qvars ) { | |
$qvars[] = 'custom_page'; | |
return $qvars; | |
} | |
/** | |
* fix page loops if pulling in a theme template | |
*/ | |
function custom_page_paging_issue( $query ) { | |
if ( !empty( $query->query_vars['custom_page'] ) ) { | |
$query->set( 'posts_per_page', 1 ); | |
} | |
} | |
/** | |
* Filter that maps the query variable to a template | |
*/ | |
function custom_page_template_redirect() { | |
$pagename = $this->options['pagename']; | |
global $wp_query; | |
$custom_page = $wp_query->query_vars['custom_page']; | |
if ( $custom_page == $pagename ) { | |
// we've found our page, call render_page and exit | |
$this->render_page(); | |
exit; | |
} | |
} | |
/** | |
* Displays the content, extend this class and implement this function as needed | |
*/ | |
public abstract function render_page(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment