WordCamp Vancouver 2016

Do it in code!

A guide to creating a custom site structure plugin in WordPress.

Presented by:

Peter Hebert

Rex Rana Design and Development Ltd.

What is site structure?

  • Post Types
  • Metaboxes and Fields
  • Taxonomy
  • Menus
  • Permalink Structure

Why a custom plugin?

  • Functionality should live in code, not the database
  • Themes for presentation, plugins for functionality
  • Manage code in version control system (git, svn)
  • Code Portability / Deployment
    • dev / staging / production
    • re-use for multiple websites / different clients

Our Sample Plugin

We'll create a Film listing (like IMDB)

  • Custom Post Type: Film
  • Custom Taxonomy: Genre
  • Metabox: Film Info
  • Fields: Release Date, Duration, Director

github.com/rexrana/my-custom-structure

WordPress core functionality

  • Not easy to use — you have to do all the heavy lifting
    • CRUD functions (create, read, update and delete)
    • Callback functions with HTML to display fields in admin
    • Sanitization / validation of input
    • nonces
  • It's a lot to remember — time could be better spent

Thankfully, there’s a better way!

Many tools exist for simplifying the creation of site structure:

  • Plugins (Advanced Custom Fields, Pods, Meta Box, Toolset)
    • Most have an export to code functionality
  • Developer libraries: CMB2, Carbon Fields
  • Code Generators: GenerateWP, WP-CLI scaffold command

GUI-based structure plugins

  • Create your structure in the admin dashboard.
  • optionally, export to code
  • Advanced Custom Fields
  • Pods framework
  • Meta Box
  • Toolset

Advanced Custom Fields (ACF)

Free: wordpress.org/plugins/advanced-custom-fields

Pro: advancedcustomfields.com

  • most popular plugin for creating custom fields
  • free version very LIMITED - requires Pro version (subscription) for :
    • repeating field groups
    • Gutenberg block support
    • more field types
    • export to code - JSON and PHP formats

Pods framework

pods.io

  • Can create Content Types and Fields
  • support for block editor (Gutenberg) and Classic Editor
  • create advanced relationships
  • includes REST API and WP-CLI commands
  • Translation Ready - integrations with WPML, Polylang

Meta Box

metabox.io

  • lightweight, fast and simple to use
  • multisite support
  • 40+ field types
  • includes online generators for fields, post types, taxonomies and blocks

Toolset

toolset.com

  • Extensive support for block editor, including a library of dynamic blocks
  • Types: Custom Post Types, Taxonomies and Fields
  • create templates using block editor
  • Forms builder
  • Access: manage roles and privileges
  • Maps: Google Maps or Azure Maps

Developer libraries

  • Declare metaboxes, fields in code using defined API
  • you can track changes in git within your plugin
  • include() the library in PHP, or use Composer to delcare as plugin dependency

CMB2

Developer library - github.com/WebDevStudios/CMB2

  • Toolkit for building metaboxes, custom fields, and forms
  • Declare metaboxes and fields using arrays of parameters
  • 35 field types included, with API to declare your own
  • Use on Post Types, Options Pages, User Profiles
    • even on the front end of your site

Carbon Fields

Developer library - carbonfields.net

  • Developer-friendly way of declaring custom fields
  • Feature rich out-of-the-box (no paid "pro" version)
  • custom fields for post types, options pages, taxonomies, users, comments, navigation menus, and widgets.
  • repeatable field groups
  • define dynamic Gutenberg blocks without JavaScript.

Code Generators

  • online forms or command-line tools
  • generates the code for you
  • copy / paste into php file in your plugin

GenerateWP

Code Generator - generatewp.com

  • Form-based wizards for generating code compliant with WordPress coding standards
  • Select a tool, fill in the form, generate the code
  • Copy ready-to-use code directly to your plugin.

wp scaffold command (WP-CLI)

Code Generator - wp-cli.org/commands/scaffold/

  • Command for WordPress command-line interface (WP-CLI)
  • Generates starter code for themes, plugins, unit tests, post types and taxonomy.
  • Limited - cannot specify advanced parameters, only gives minimal config with defaults
  • Provides a quick start-off point

WP-CLI Scaffolding Examples

Run commands from within site root directory

Post Type: Film

wp scaffold post-type film --label=Film --textdomain=structure \
--dashicon=editor-video --plugin=my-custom-structure

Taxonomy: Genre

wp scaffold taxonomy genre --post_types=film --label=Genre \
--textdomain=structure --plugin=my-custom-structure

Putting it all together

  • GUI based plugins: install plugin in normal way
  • Developer libraries: usually need to do a PHP include() , or declare as Composer dependency for your plugin
  • Create separate PHP files for each of: Post Types, Taxonomy, Metaboxes/Fields
    • include these files in your main plugin PHP file
    • this makes items easier to find, comment out or remove

Developer library includes

CMB2:

if( file_exists( dirname(__FILE__).'/lib/cmb2/init.php' ) ) {
require_once( 'lib/cmb2/init.php' );
}

Carbon Fields (using Composer):

composer require htmlburger/carbon-fields

Make sure to include Composer's PSR-4 autoloader in plugin

require_once (__DIR__ . '/vendor/autoload.php');

Includes for declaring structure

// Post Types / Taxonomies.
require_once('post-types/film.php');
require_once('taxonomies/genre.php');

// METABOXES AND FIELDS.

/* using WordPress core functionality */
require_once('inc/wp-fields.php');

/* using ACF */
require_once('inc/acf-fields.php');

/* using CMB2  */
require_once('inc/cmb2-metaboxes.php');

Thank You

Blog post (with all referenced links and slides):

rexrana.ca/wcyvr2016

Follow

Rex Rana   rexrana.ca   rexrana  rex-rana

Peter Hebert   peterhebert.com

peterhebert   peterhebert   peterhebert   peterhebert

@peterhebert@fosstodon.org

Rex Rana