Skip to content
An OOP toolset for WordPress
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


An OOP toolset for WordPress.

At the moment, GutenPress it's a rough-draft for a bunch of tools for developing themes or plugins for WordPress.

Currently working:

  • A post type generator GUI that creates new custom post types as plugins
  • A custom taxonomy generator GUI that creates... well.. custom taxonomies
  • A set of metabox generator classes to add custom meta data to generated custom post types
  • A completely extendable Forms class that integrates well with WordPress, and it's actually used within GutenPress for GUI and metaboxes
  • An extendable wrapper class for WP_Query that returns instances of custom post type objects wrapped on an extendable custom class, so you can customize the post-like objects to your needs


  • Download the master archive and extract into wp-content/mu-plugins/
  • You'll need PHP 5.3 or greater, since GutenPress uses namespacing to lazy-load whenever's possible


Custom Post Type generator

  • A new sub-menu it's added to the Tools admin menu.
  • Carefully fill the form and select the required options to configure your new custom post type.
  • On submit, a new folder will be created on your plugins folder; you'll be redirected to the plugins management so you can activate the new CPT
  • The plugin activation will add the relevant permissions to the admin user
  • If you need to add permissions for other groups, check the Members plugin by Justin Tadlock
  • The generated plugin consists of three classes:
    • A custom post type definition that extends \GutenPress\Model\PostType
    • A custom query class that extends \GutenPress\Model\PostQuery, a wrapper for WP_Query that implements the Iterator interface
    • A custom object class that extends \GutenPress\Model\PostObject, a wrapper for WP_Post that you can extend with custom methods

Using the custom query class

Let's suppose we just created a Songs custom post type.

Getting a list of songs works just like directly calling WP_Query, so you can use all the arguments you could use with it, including tax queries and meta queries:

$latest_songs = new SongsQuery( array(
	'posts_per_page' => '10',
	'tax_query' => array(
			'taxonomy' => 'performed_by',
			'terms' => 'pink-floyd',
			'field' => 'slug'
	'meta_query' => array(
			'key' => 'author_composer',
			'value' => 'David Gilmour'
) );

Since SongsQuery (or whatever your generated CPT class is called) implements the Iterator interface, you can loop through the objects with a simple foreach. It also implements the Countable interface, so you can check if your query actually has items:

if ( count($latest_songs) ) :
	foreach ( $latest_songs as $song ) :
		// do stuff
		// each $song will be an instance of SongObject
		echo $song->authors;

Using and extending custom post type objects

You can extend your "Object" class to add custom methods around WP_Post:

class SongObject extends \GutenPress\Model\PostObject{
	public function getAuthors(){
		$composer = $this->post->author_composer;
		$lyrics   = $this->post->author_lyrics;
		if ( $composer === $lyrics ) {
			return 'Music and Lyrics by '. $lyrics;
		} else {
			return 'Music: '. $composer .' / Lyrics: '. $lyrics;
	 * You can also overwrite the __get() magic method
	public function __get( $key ){
		if ( $key === 'authors' ) {
			return $this->getAuthors();
		// pass it on to WP_Post
		parent::__get( $key );

Adding metaboxes

You can use the \GutenPress\Model\PostMeta class to add a metabox to your CPT:

// using the \GutenPress\Model namespace as Model;
class SongAuthors extends Model\PostMeta{
	protected function setId(){
		// will be used for the metabox ID
		// will be prepended to the metadata defined by this class
		return 'author';
	protected function setDataModel(){
		return array(
			new Model\PostMetaData(
				'\GutenPress\Forms\Element\InputText', // can be any of the Elements defined on the corresponding folder
					'placeholder' => 'Who composed the music for this song?'
			new Model\PostMetaData(
					'placeholder' => 'Who wrote the lyrics?'

// finally, register as metabox
new Model\Metabox( 'SongAuthors', 'Authorship information', 'song', array('priority' => 'high') );
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.