WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm working on a CPT but I need to have more control over the layout of the post/edit page (post-new.php and post.php). I thought hacking through admin_init would be the best option, but I can't get the script to work at all. Help?

function init_shelf_page() {
    if (!current_user_can('edit_shelves') && $_SERVER['PHP_SELF'] == '/wp-admin/post.php') {
        if (isset($_GET['post'])) {
            $postID = intval($_GET['post']);
            $post = get_post($postID);
            if ($post->post_type == 'shelf') {
                $post_type_object = get_post_type_object($post->post_type);
                if (!current_user_can($post_type_object->cap->edit_posts)) {
                    wp_die(__('Cheatin’ uh?'));
                include(dirname(__FILE__) . '/shelf-page.php');
add_action('admin_init', 'init_shelf_page');
share|improve this question
up vote 1 down vote accepted

I suggest you just don't use the standard post editing UI. When you register your post type, there's an arg for showing the admin UI.

       // stuff here
       'show_ui' => false

Then just create your own admin page and do whatever you need to do with the interface. Here's a skeleton example.

add_action( 'admin_init', 'wpse33382_add_page' );
function wpse33382_add_page()
    $page = add_menu_page(
        __( 'Some Title' ),
        __( 'Menu Title' ),

    add_action( 'admin_print_scripts-' . $page, 'wpse33382_scripts' );
    add_action( 'admin_print_styles-' . $page, 'wpse33382_styles' );

function wpse33382_page_cb()
    // code for the page itself here
        <form method="post" action="">
            <input type="hidden" name="action" value="do_stuff" />
            <?php wp_nonce_field( 'wpse33382_nonce', '_nonce' ); ?>

    // catch POST submissions here, then call wp_insert_post
    if( isset( $_POST['action'] ) && 'do_stuff' == $_POST['action'] )
        // verify nonces/referrers here, then save stuff

function wpse33382_scripts()
    // wp_enqueue_script here

function wpse33382_styles()
    // wp_enqueue_style here

The other option would be adding whatever custom meta boxes you need to your standard editing screen.

share|improve this answer
I would like to keep the standard UI for managing/listing my CPT (e.g. edit.php?post_type=shelf) instead of creating another screen to maintain. In other words, I want to redirect only the post.php?action=edit&post=XX and post-new.php?post_type=shelf pages to my own. I know I could just edit the link in the manage screen to my own menu page, but then I'd need to register my menu page without showing it on the menu. – impleri Nov 10 '11 at 13:53
You're talking about creating your own page anyway? Your method, as you coded it above, is actually going to stop the entire WordPress admin from loading. Look into custom meta boxes, that sounds like more of what you need/want. – chrisguitarguy Nov 10 '11 at 14:58
Well, what I coded above does nothing. The standard UI screen loads like normal. Perhaps I'm having an issue with the draggable/droppable, which doesn't seem to be working properly for me in the standard UI (that was my option before this one). – impleri Nov 10 '11 at 15:16

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.