Skip to content

Instantly share code, notes, and snippets.

@stephenh1988
Created September 8, 2012 15:59
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save stephenh1988/3676396 to your computer and use it in GitHub Desktop.
Save stephenh1988/3676396 to your computer and use it in GitHub Desktop.
A simple class based on a tutorial at WP.Tuts that creates an page with metaboxes.
<?php
/*
Description: A simple class based on a tutorial at WP.Tuts that creates an page with metaboxes.
Author: Stephen Harris
Author URI: http://www.stephenharris.info
*/
/* Copyright 2011 Stephen Harris (contact@stephenharris.info)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* If you use this class please make sure you rename it :).
*
* The class takes the following arguments
* * $hook - the hook of the 'parent' (menu top-level page).
* * $title - the browser window title of the page
* * $title - the page title as it appears in the menu
* * $permissions - the capability a user requires to see the page
* * $slug - a slug identifier for this page
* * $body_content_cb -(optional) a callback that prints to the page, above the metaboxes. See the tutorial for more details.
*
* Example use
* $my_admin page = new WPTuts_Simple_Metabox_Admin_Page('my_hook','My Admin Page','My Admin Page', 'manage_options','my-admin-page')
*
* Full example below the class (which adds example metaboxes too).
*/
class WPTuts_Simple_Metabox_Admin_Page
{
var $hook;
var $title;
var $menu;
var $permissions;
var $slug;
var $page;
/**
* Constructor class for the Simple Admin Metabox
*@param $hook - (string) parent page hook
*@param $title - (string) the browser window title of the page
*@param $menu - (string) the page title as it appears in the menuk
*@param $permissions - (string) the capability a user requires to see the page
*@param $slug - (string) a slug identifier for this page
*@param $body_content_cb - (callback) (optional) a callback that prints to the page, above the metaboxes. See the tutorial for more details.
*/
function __construct($hook, $title, $menu, $permissions, $slug, $body_content_cb='__return_true'){
$this->hook = $hook;
$this->title = $title;
$this->menu = $menu;
$this->permissions = $permissions;
$this->slug = $slug;
$this->body_content_cb = $body_content_cb;
/* Add the page */
add_action('admin_menu', array($this,'add_page'));
}
/**
* Adds the custom page.
* Adds callbacks to the load-* and admin_footer-* hooks
*/
function add_page(){
/* Add the page */
$this->page = add_submenu_page($this->hook,$this->title, $this->menu, $this->permissions,$this->slug, array($this,'render_page'),10);
/* Add callbacks for this screen only */
add_action('load-'.$this->page, array($this,'page_actions'),9);
add_action('admin_footer-'.$this->page,array($this,'footer_scripts'));
}
/**
* Prints the jQuery script to initiliase the metaboxes
* Called on admin_footer-*
*/
function footer_scripts(){
?>
<script> postboxes.add_postbox_toggles(pagenow);</script>
<?php
}
/*
* Actions to be taken prior to page loading. This is after headers have been set.
* call on load-$hook
* This calls the add_meta_boxes hooks, adds screen options and enqueues the postbox.js script.
*/
function page_actions(){
do_action('add_meta_boxes_'.$this->page, null);
do_action('add_meta_boxes', $this->page, null);
/* User can choose between 1 or 2 columns (default 2) */
add_screen_option('layout_columns', array('max' => 2, 'default' => 2) );
/* Enqueue WordPress' script for handling the metaboxes */
wp_enqueue_script('postbox');
}
/**
* Renders the page
*/
function render_page(){
?>
<div class="wrap">
<?php screen_icon(); ?>
<h2> <?php echo esc_html($this->title);?> </h2>
<form name="my_form" method="post">
<input type="hidden" name="action" value="some-action">
<?php wp_nonce_field( 'some-action-nonce' );
/* Used to save closed metaboxes and their order */
wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
<div id="poststuff">
<div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? '1' : '2'; ?>">
<div id="post-body-content">
<?php call_user_func($this->body_content_cb); ?>
</div>
<div id="postbox-container-1" class="postbox-container">
<?php do_meta_boxes('','side',null); ?>
</div>
<div id="postbox-container-2" class="postbox-container">
<?php do_meta_boxes('','normal',null); ?>
<?php do_meta_boxes('','advanced',null); ?>
</div>
</div> <!-- #post-body -->
</div> <!-- #poststuff -->
</form>
</div><!-- .wrap -->
<?php
}
}
/* Example Usage */
//Create a page
$example = new WPTuts_Simple_Metabox_Admin_Page('edit.php',__('Title','domain'),__('Menu Title','domain'), 'manage_options','example_page','sh_example_body_content');
//Define the body content for the page (if callback is specified above)
function sh_example_body_content(){
?>
<p> This class is just a simple example of a custom admin page with metaboxes. The class is intended to act as a skeleton class. You can use it to add several admin pages, but you might find that some pages require a seperate class extension.<p>
<p> This content always sits at the top of the page<p>
<?php
}
//Add some metaboxes to the page
add_action('add_meta_boxes','sh_example_metaboxes');
function sh_example_metaboxes(){
add_meta_box('example1','Example 1','sh_example_metabox','posts_page_example_page','normal','high');
add_meta_box('example2','Example 2','sh_example_metabox','posts_page_example_page','side','high');
}
//Define the insides of the metabox
function sh_example_metabox(){
?>
<p> An example of a metabox <p>
<?php
}
@t1mduma5
Copy link

I took this unmodified and attached it to a plugin I am working on just to see it work.

I am signed on to wp with an administrator account whose permissions have not been altered
(ie it does have 'manage_options' assigned to it). It does create the page example in the admin
menu however when you click on it I get 'You do not have sufficient permissions to access this
page.' What would cause that to happen?

@mpsparrow
Copy link

Great code!

@sukhikh18
Copy link

great thx, very worthwhile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment