Get the selected posts IDs to use in bulk edit AJAX call

The WordPress codex for bulk_edit_custom_box, along with this bulk edit example use the following piece of JavaScript to create an array of selected post IDs to send with the AJAX call that updates the posts.

$bulk_row.find( '#bulk-titles' ).children().each( function() {
    $post_ids.push( $( this ).attr( 'id' ).replace( /^(ttle)/i, '' ) );
});

The full code surrounding this snippet is below.

My list tables have input fields for meta values, and the inline quick edit works successfully, but bulk edit fails. When debugging I found the $post_ids array is empty because there are no elements on my page with the ID #bulk-titles.

So my question, where do the #bulk-titles elements come from and why would my page not have them?

$( '#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 custom fields
    var $item_thickness = $bulk_row.find( 'input[name="item_thickness"]' ).val();
    var $item_width = $bulk_row.find( 'input[name="item_width"]' ).val();
    var $item_length = $bulk_row.find( 'input[name="item_length"]' ).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: 'manage_wp_posts_using_bulk_quick_save_bulk_edit', // 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
            item_thickness: $item_thickness,
            item_width: $item_width,
            item_length: $item_length
        }
    });

});

Topic bulk wp-list-table quick-edit admin Wordpress

Category Web


After searching through WordPress core I found the following on lines 1051 – 1057 of wp-admin/includes/class-wp-posts-list-table.php

if ( post_type_supports( $screen->post_type, 'title' ) ) :
    if ( $bulk ) : ?>
        <div id="bulk-title-div">
            <div id="bulk-titles"></div>
        </div>

<?php else : // $bulk ?>

So, in order for the #bulk-titles element to be part of your admin list the post type your working with needs to support title.

New custom posts types do support title by default. My custom post types are not using titles so I had set supports => false as an argument passed to register_post_type call.

Not supplying the supports argument or setting it to an array that includes title as a member solved the bulk edit problem, and I hid the title on post edit page using CSS.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.