Recently I was writing a plugin for a client. It was a simple plugin to manage invoices and customers. The development is pretty fast thanks to Elliot Condon for his awesome ACF plugin.
One of the plugin’s requirement is user can add a new customer directly from the invoice page. As default, I put a post object field for user to select the existing customer. So I decided to put the add new customer form in a modal box. And after some while looking for, I finally found how to create it using WordPress’ bundled Thickbox.
First, we need to enqueue Thickbox’s JS and CSS with simply:
add_thickbox();
Then we need a button to trigger the popup when it’s clicked. It must have .thickbox class so the javascript can handle it properly. To have it button-like visual, append .button class.
Next part is building the URL. It consists of 4 important query args: action, TB_iframe, width, and height. The action value determines our hook when creating the page. So here how the button looks like:
$url = add_query_arg( array(
'action' => 'foo_modal_box',
'TB_iframe' => 'true',
'width' => '600',
'height' => '400'
), admin_url( 'admin.php' ) );
echo '<a href="' . $url . '" class="button button-primary thickbox">' . __( 'Add New Customer', 'foo' ) . '</a>';
In code above, we use add_query_arg() to build our URL. The result would be:Â http://local.dev/wp-admin/admin.php?action=foo\_modal\_box&TB\_iframe=true&width=600&height=400
We’ll hook to admin_action_{$action} to create our page. By default, we’ll get a blank response when requesting to that page. We can simply testing with an echo and exit.
function foo_render_action_page() {
define( 'IFRAME_REQUEST', true );
iframe_header();
// ... your content here ...
iframe_footer();
exit;
}
add_action( 'admin_action_foo_modal_box', 'foo_render_action_page' );
Note the IFRAME_REQUEST constant, it will remove extra 32px top padding of the <html> added by .wp-toolbar.
iframe_header() and iframe_footer() work like wp_head() and wp_footer() on theme. They will output base HTML page tailored for iframe view. That means no admin bar, no admin menu, just empty page.
Alright, go on and try clicking our button. TADAA! :)