
This WordPress helper will let you create Meta Boxes fast with the flexibility you need as a developer. Full documentation walks you step-by-step. Create custom WordPress Meta Box UI elements for your projects with ease.
My wordpress meta box creation code is progressing and I would like to share my latest rendition with you. If you haven’t been following the series of articles about custom wordpress meta box creation and manipulation thus far, take a little bit of time and review (but come back to this page, as this is the latest and greatest code base):
- How to Create A Custom WordPress Meta Box Instead of Using WordPress Custom Fields
- How to Limit the Display of a WordPress Meta Box
- How to Keep the Custom Fields Area Uncluttered When Using a WordPress Meta Box
I hope you’ve been learning along with me and creating some nice UI elements in WordPress for yourself and your clients. This article should take your code to the next level.
Making WordPress MetaBox Creation Easier
WordPress makes it really easy to make tweaks pretty much anywhere you want. However, unlike some methods in wordpress, creating a meta box gets a little bit more involved. This helper class is an effort to try to simplify the creation of your meta boxes. Lets dive right into the code:
You would do the following in your functions.php file:
include_once 'WPAlchemy/MetaBox.php';
// include css to help style our custom meta boxes
if (is_admin()) wp_enqueue_style('custom_meta_css',TEMPLATEPATH . '/custom/meta.css');
$custom_metabox = new WPAlchemy_MetaBox(array
(
'id' => '_custom_meta', // underscore prefix hides fields from the custom fields area
'title' => 'My Custom Meta',
'template' => TEMPLATEPATH . '/custom/meta.php'
));
// add a second custom meta box
new WPAlchemy_MetaBox(array
(
'id' => '_custom_meta2',
'title' => 'My Custom Meta #2',
'types' => array('page','events'), // added only for pages and to custom post type "events"
'context' => 'normal', // same as above, defaults to "normal"
'priority' => 'high', // same as above, defaults to "high"
'template' => TEMPLATEPATH . '/custom/meta2.php'
));
Thats it! The above code shows the basic definition needed to setup a custom meta box (or more than one if needed).
Read the Documentation and Download
The WPAlchemy_MetaBox PHP class is fully documented and the latest version can be downloaded from GitHub.

This is great!!! Thank you!
Does this work on 3.0? I just tried this and the fields don’t show up in the meta boxes
Terry, I’ve developed it using the latest nightly build of 3.0 and all works OK for me. Make sure that you are using the correct path to the meta box template file (that has the contents of the meta box).
I started using the class in one of my projects today and I’ve got a few updates to release. I’ll have it updated soon.
Dimas, first of all, thanks for your tutorials about wp metaboxes.
I have started using your class and any future updates are more than welcome.
The Meta Box block “My Custom Custom Meta” is there but none of the fields show up?
There must be something I’m missing…
I’ll guess i’ll give this a try when they release 3.0 and see if I have some luck
Terry, are you getting any errors?
Make sure that you are targeting the include file correctly, set this to the path of your
meta.phpinclude file:Also, this class should work with the most recent releases of wordpress as well (I’ve tested it on 2.9.2).
Hi. I was able to make this to work on a regular post. Apparently when I use it on a custom post_type, in admin panel everything seems fine. I can see the custom fields but not showing when pulled-up on the site. I use the same code in my theme template.
Hi again Dimas – I love that you’re continuously improving upon this code! Awesome : )
Although there is an issue – this code can’t be used if your host is running PHP4. I know everyone SHOULD be using PHP5, but for those clients out there who don’t know any better, is there a way to make this compatible with both versions of PHP?
And just for the record, here’s the error:
PHP Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’
Thanks a lot man, and keep up the awesome work.
Tom, I’ve updated the demo file with a PHP4 version of the class, give it a try and let me know if it works or not.
Dimas,
I was foolish last night and upgraded my PHP version – I actually had no idea I was running PHP4 until I tried to implement this – so I can’t even test the fix : (
Does the fix recognize the PHP version and output the necessary code?
Tom, In the WPAlchemy folder you will see two files:
MetaBox.phpandMetaBox.php4If you are using PHP5 you should use the default
MetaBox.phpfile.If you are using PHP4 you should rename
MetaBox.php4toMetaBox.phpand use it instead of the original.Dimas – I see now : )
Is there a way to make it more user friendly so if it’s implemented in a theme that someone has, and they have no idea how to deal with all the code, that it’s just done for them?
I’m thinking like a “if php4 display: this, else, display: this” type of thing?
Something like this –
if (version_compare(PHP_VERSION, ’5.0.0′, ‘<')) {
include_once 'meta.php4';
} else {
include_once 'meta.php'; }
I wish I didn't upgrade my php version, now I can't test to see if it works! lol
Check out: http://farinspace.com/2009/06/running-php4-and-php5-in-parallel-the-easy-way/ … you might be able to run both PHP4 and PHP5
Tom, I’ll probably just use the PHP4 version as the main release … WordPress currently is still compatible with PHP4, so there will definitely be users using PHP4, plus considering developers will be using this code to create plugins/themes, making it PHP4 compatible will allow developers to use it in a wider range of projects.
Thanks for the link about running both – the whole server side of websites is an area I need to study more.
Sounds good to me – I’m not much a PHP guy yet, but noticed the main difference was that the php5 version had “protected” and “private”, while the php4 version is using “var”.
What are the advantages to the php5 way?
Back again – I know.
So I’ve been dissecting and really enjoying your code – especially the loops where it adds fields for you on save. Is there an easy to way to implement jquery to add more fields on the click of a link, instead of having to save each time?
Thanks!
Also, is there anywhere I can buy you a coffee/beer?
Tom, I’m glade you are enjoying the code … and I like that you are taking things to the next step. I am actually working on a new article which does just what you are describing, it uses a little bit of jQuery to automatically add fields (multiple fields at once vs the “and_one” concept I’ve got going).
Can’t wait! Very interested in seeing how it works : )
Dimas,
Once again you are the man! AWESOME code, works like a charm.
I second the coffee/beer idea from Tom.
This is very nice indeed. I was just stepping into add_meta_box() functions and found this lib.
Good code.
To those who have been following this post, I’ve updated the helper with some exclude/include options, see the documentation above for more details …
Very interesting! Thanks, Dimas!
To those who have been following this post, I’ve moved the bulk of the documentation to its own page, as I release new features I will be creating new posts to keep everyone update (like v1.1 Filtering and Repeating Fields).
Hi Dimas
This is a great PHP class – and yes it does work well with WP3.0 as you say/state. I only have one question/problem.
In one of my meta boxes I need to use a custom WP loop query to create a dropdown of WP post titles belonging to a specific custom-post type.
When ever I add/update a post with this dropdown the class always adds an additional “option” field to the output. e.g.:
a:1:{s:4:"docs";a:3:{i:0;a:2:{s:8:"products";s:3:"131";s:10:"productqty";s:3:"342";}i:1;a:2:{s:8:"products";s:3:"140";s:10:"productqty";s:4:"3254";}i:2;a:1:{s:8:"products";s:3:"131";}}}which should acually be
a:1:{s:4:"docs";a:3:{i:0;a:2:{s:8:"products";s:3:"131";s:10:"productqty";s:3:"342";}}}In other words it always adds/appends the first select option of the custom query at the end of the update. Any ides/suggestions please. fyi here is “my code”
get_results($querystr, OBJECT); ?> <?php foreach ($pageposts as $post): $postoptions .='ID.'">'.$post->post_title.''; endforeach; ?> have_fields_and_multi('docs')): ?> the_group_open(); ?> the_field('products'); ?> <select name="the_name(); ?>"> the_field('productqty'); ?> <input type="text" name="the_name(); ?>" value="the_value(); ?>" /> <a href="#" rel="nofollow">Remove Document</a> the_group_close(); ?> <a href="#" rel="nofollow">Add Options</a> - <a href="#" rel="nofollow">Remove All</a>