How to show a custom meta box on the “Quick Edit” screen?

I’ve used add_meta_box() to add a custom meta box to the WordPress edit window on both pages and posts.

How can I make this meta box also show on the “Quick Edit” screen?

Read More

Ideally, I’d like it to appear just to the right of the Categories selector.

Related posts

Leave a Reply

2 comments

  1. There seems to be no easy way to do this, you must add all code yourself. inline_edit_row(), the function that draws the Quick Edit and Bulk Edit screens, seems to have only one action that you can hook into: quick_edit_custom_box or bulk_edit_custom_box. It gets called for all non-core columns that wp_manage_posts_columns() returns. There are some filters you can use to add a column, for example manage_posts_columns. Unfortunately, this function defines the column headers of the post table, so you should remove it again before print_column_headers() prints them. This can be done in the get_column_headers() function, with the manage_[screen_id]_headers filter. edit-post is the screen id for the Edit Posts screen.

    All together, this gives a hack like the following to add some code. Finding out where you can handle the form submission is (currently) left as a exercise to the reader.

    // Add a dummy column for the `posts` post type    
    add_filter('manage_posts_columns', 'add_dummy_column', 10, 2);
    function add_dummy_column($posts_columns, $post_type)
    {
        $posts_columns['dummy'] = 'Dummy column';
        return $posts_columns;
    }
    // But remove it again on the edit screen (other screens to?)
    add_filter('manage_edit-post_columns', 'remove_dummy_column');
    function remove_dummy_column($posts_columns)
    {
        unset($posts_columns['dummy']);
        return $posts_columns;
    }
    
    // Add our text to the quick edit box
    add_action('quick_edit_custom_box', 'on_quick_edit_custom_box', 10, 2);
    function on_quick_edit_custom_box($column_name, $post_type)
    {
        if ('dummy' == $column_name) {
            echo 'Extra content in the quick edit box';
        }
    }
    
    // Add our text to the bulk edit box
    add_action('bulk_edit_custom_box', 'on_bulk_edit_custom_box', 10, 2);
    function on_bulk_edit_custom_box($column_name, $post_type)
    {
        if ('dummy' == $column_name) {
            echo 'Extra content in the bulk edit box';
        }
    }
    
  2. The above answers don’t provide a definite means to save data. The following code comes out of a production system using the video custom post type before I wrote the the WordPress bulk edit plugin Custom Bulk/Quick Edit.

    File quick_edit.js

    // @ref http://rachelcarden.com/2012/03/manage-wordpress-posts-using-bulk-edit-and-quick-edit/
    (function($) {
        // we create a copy of the WP inline edit post function
        var $wp_inline_edit = inlineEditPost.edit;
        // and then we overwrite the function with our own code
        inlineEditPost.edit = function( id ) {
            // "call" the original WP edit function
            // we don't want to leave WordPress hanging
            $wp_inline_edit.apply( this, arguments );
    
            // now we take care of our business
    
            // get the post ID
            var $post_id = 0;
            if ( typeof( id ) == 'object' )
                $post_id = parseInt( this.getId( id ) );
    
            if ( $post_id > 0 ) {
                // define the edit row
                var $edit_row = $( '#edit-' + $post_id );
                var $post_row = $( '#post-' + $post_id );
    
                // get the data
                var $additional_copies = $( '.column-additional_copies', $post_row ).html();
                var $main_credits      = $( '.column-main_credits', $post_row ).html();
    
                // populate the data
                $( ':input[name="additional_copies"]', $edit_row ).val( $additional_copies );
                $( ':input[name="main_credits"]', $edit_row ).val( $main_credits );
            }
        };
    
        $( '#bulk_edit' ).live( 'click', function() {
            // define the bulk edit row
            var $bulk_row = $( '#bulk-edit' );
    
            // get the selected post ids that are being edited
            var $post_ids = new Array();
            $bulk_row.find( '#bulk-titles' ).children().each( function() {
                $post_ids.push( $( this ).attr( 'id' ).replace( /^(ttle)/i, '' ) );
            });
    
            // get the data
            var $additional_copies = $bulk_row.find( 'textarea[name="additional_copies"]' ).val();
            var $main_credits      = $bulk_row.find( 'textarea[name="main_credits"]' ).val();
    
            // save the data
            $.ajax({
                url: ajaxurl, // this is a variable that WordPress has already defined for us
                type: 'POST',
                async: false,
                cache: false,
                data: {
                    action: 'save_bulk_edit_video', // this is the name of our WP AJAX function that we'll set up next
                    post_ids: $post_ids, // and these are the 2 parameters we're passing to our function
                    additional_copies: $additional_copies,
                    main_credits: $main_credits
                }
            });
        });
    })(jQuery);
    

    File video-quick-edit.php

    <?php
    /**
     *  Quick Edit and Bulk Edit helper for Media Burn video records
     *
     *  @author Michael Cannon <mc@aihr.us>
     *  @ref http://rachelcarden.com/2012/03/manage-wordpress-posts-using-bulk-edit-and-quick-edit/
     */
    
    add_action( 'bulk_edit_custom_box', 'quick_edit_custom_box_video', 10, 2 );
    add_action( 'quick_edit_custom_box', 'quick_edit_custom_box_video', 10, 2 );
    
    function quick_edit_custom_box_video( $column_name, $post_type ) {
        $slug = 'video';
        if ( $slug !== $post_type )
            return;
    
        if ( ! in_array( $column_name, array( 'additional_copies', 'main_credits' ) ) )
            return;
    
        static $printNonce = true;
        if ( $printNonce ) {
            $printNonce = false;
            wp_nonce_field( plugin_basename( __FILE__ ), 'video_edit_nonce' );
        }
    
    ?>
        <fieldset class="inline-edit-col-right inline-edit-video">
          <div class="inline-edit-col inline-edit-<?php echo $column_name ?>">
            <label class="inline-edit-group">
            <?php
        switch ( $column_name ) {
        case 'additional_copies':
    ?>
                <span class="title">Additional Copies</span>
                <textarea cols="22" rows="1" name="additional_copies" autocomplete="off"></textarea>
                <?php
            break;
        case 'main_credits':
    ?>
                <span class="title">Main Credits</span>
                <textarea cols="22" rows="1" name="main_credits" autocomplete="off"></textarea>
                <?php
            break;
        }
    ?>
            </label>
          </div>
        </fieldset>
        <?php
    }
    
    
    add_action( 'save_post', 'save_video_meta' );
    
    function save_video_meta( $post_id ) {
        // TODO make $slug static
        $slug = 'video';
        if ( $slug !== $_POST['post_type'] )
            return;
    
        if ( !current_user_can( 'edit_post', $post_id ) )
            return;
    
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
            return;
    
        if ( isset( $post->post_type ) && 'revision' == $post->post_type )
            return;
    
        $_POST += array( "{$slug}_edit_nonce" => '' );
        if ( !wp_verify_nonce( $_POST["{$slug}_edit_nonce"], plugin_basename( __FILE__ ) ) )
            return;
    
        if ( isset( $_REQUEST['additional_copies'] ) )
            update_post_meta( $post_id, 'additional_copies', wp_kses_post( $_REQUEST['additional_copies'] ) );
    
        if ( isset( $_REQUEST['main_credits'] ) )
            update_post_meta( $post_id, 'main_credits', wp_kses_post( $_REQUEST['main_credits'] ) );
    }
    
    
    add_action( 'admin_print_scripts-edit.php', 'admin_edit_video_foot' );
    function admin_edit_video_foot() {
        $slug = 'video';
        // load only when editing a video
        if ( ( isset( $_GET['page'] ) && $slug == $_GET['page'] )
            || ( isset( $_GET['post_type'] ) && $slug == $_GET['post_type'] ) ) {
            wp_enqueue_script( 'admin-quick-edit-video', get_template_directory_uri() . '/functions/user/custom/fitv/quick_edit.js', array( 'jquery', 'inline-edit-post' ), '', true );
        }
    }
    
    
    add_action( 'wp_ajax_save_bulk_edit_video', 'save_bulk_edit_video' );
    function save_bulk_edit_video() {
        $post_ids          = ( ! empty( $_POST[ 'post_ids' ] ) ) ? $_POST[ 'post_ids' ] : array();
        $additional_copies = ( ! empty( $_POST[ 'additional_copies' ] ) ) ? wp_kses_post( $_POST[ 'additional_copies' ] ) : null;
        $main_credits      = ( ! empty( $_POST[ 'main_credits' ] ) ) ? wp_kses_post( $_POST[ 'main_credits' ] ) : null;
    
        if ( ! empty( $post_ids ) && is_array( $post_ids ) ) {
            foreach ( $post_ids as $post_id ) {
                update_post_meta( $post_id, 'additional_copies', $additional_copies );
                update_post_meta( $post_id, 'main_credits', $main_credits );
            }
        }
    
        die();
    }
    
    
    ?>