Using Modern PHP with WordPress: Part 4 – Metabox Orchestra

In the last article, we discussed Composer. That is an entire subject matter of it’s own, so I didn’t really cover everything. But I covered enough for this project.

In the Photogramappy plugin, I have registered postmeta for latitude and longitude. The idea is, someone would create a new Photograph post, upload a featured image and enter the latitude and longitude as meta on the post edit screen.

function latitude_and_longitude_metabox() {

        __( 'Latitude and Longitude', '' ),
add_action( 'add_meta_boxes', 'latitude_and_longitude_metabox' );

function lat_long_meta_box_callback() {
    <!-- Some HTML for the Metabox -->

function save_lat_long( $post_id, $post ) {
    // Do some checks then save the meta
add_action( 'save_post', 'save_lat_long' );

This is the traditional way of registering metaboxes in WordPress but it’s so tedious, in my opinion. It also doesn’t leverage more modern approaches. For this project, I’ve opted to use the Metabox Orchestra library to handle metaboxes in an OOP way.

Each metabox needs 4 things to work. It needs a PostMetabox object which is just the creation of the metabox. Note: it could also be a TermMetabox object, if registering meta with a term. It also needs a BoxView object which renders the HTML and form fields that is in the box. Third, it needs an BoxAction, which is a class that handles the saving of the data. Finally, with those 3 objects, it is necessary to “register” the meta with WordPress. This is done with a Box object.

A note about the file structure I am using, because I’m using a number of techniques here. The Metabox.php file is an interface. All registered metaboxes (I only have one, but if I wanted to add more), would implement this interface which requires a register_meta() method. The Metabox_Object.php is an abstract class that all registered metaboxes must extend. This abstract class has the method register_meta() method that the Metabox interface requires. Almost all metabox instances would not have to declare their own, because almost all will do the exact same thing. However, a metabox could provide their own instead. Finally, the Geo_Coordinate namespace has a Geo_Coordinate.php class which extends Metabox_Object and implements MetaBox using the objects created in the Config namespace.

Object Meta
- Metabox.php
- Metabox_Object.php
- Geo_Coordinate
-- Geo_Coordinate.php
-- Config
--- Action.php
--- View.php
--- Box.php

So, in summary, Object_Meta\Geo_Coordinate\Config\View provides the form fields inside the metabox by extending the BoxView class. We handle the processing of saved data in the Object_Meta\Geo_Coordinate\Config\Action class which extends BoxAction. The Object_Meta\Geo_Coordinate\Geocoordinate class extends Object_Meta\Metabox_Object class which registers the meta by injecting a Boxes object, using the Boxes object and injecting the Box class (which extends PostMetabox).

Finally, we hook into WordPress on the metabox-orchestra.register-boxes hook. We now have metaboxes in a clean, OOP way!

See all the source code here.

In Part 5 of this series, we’ll dive a bit into Codeception and testing.

  • Category: PHP