Получить ID выбранных записей для использования в AJAX-запросе пакетного редактирования.

Вопрос или проблема

В документации WordPress для bulk_edit_custom_box, вместе с этим примером массового редактирования, используется следующий фрагмент JavaScript для создания массива выбранных ID постов, который будет отправлен с AJAX-запросом для обновления постов.

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

Полный код, окружающий этот фрагмент, приведен ниже.

В моих таблицах списка есть поля ввода для мета значений, и встроенное быстрое редактирование работает успешно, но массовое редактирование не удается. При отладке я обнаружил, что массив $post_ids пуст, потому что на моей странице нет элементов с ID #bulk-titles.

Таким образом, мой вопрос в том, откуда берутся элементы #bulk-titles и почему на моей странице их нет?

$( '#bulk_edit' ).live( 'click', function() {

    // определяем строку массового редактирования
    var $bulk_row = $( '#bulk-edit' );

    // получаем выбранные ID постов, которые редактируются
    var $post_ids = new Array();

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

    // получаем пользовательские поля
    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();

    // сохраняем данные
    $.ajax({
        url: ajaxurl, // это переменная, которую WordPress уже определил для нас
        type: 'POST',
        async: false,
        cache: false,
        data: {
            action: 'manage_wp_posts_using_bulk_quick_save_bulk_edit', // это название нашей функции WP AJAX, которую мы настроим далее
            post_ids: $post_ids, // и это 2 параметра, которые мы передаем в нашу функцию
            item_thickness: $item_thickness,
            item_width: $item_width,
            item_length: $item_length
        }
    });

});

После изучения ядра WordPress я нашел следующее на строках 1051-1057 в 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 ?>

Таким образом, для того чтобы элемент #bulk-titles был частью вашего административного списка, тип поста, с которым вы работаете, должен поддерживать title.

Новые пользовательские типы постов по умолчанию поддерживают title. Мои пользовательские типы постов не используют заголовки, поэтому я установил supports => false в качестве аргумента, передаваемого в register_post_type.

Не указание аргумента supports или установка его в массив, который включает title в качестве элемента, решило проблему массового редактирования, и я скрыл заголовок на странице редактирования поста с помощью CSS.

Ответ или решение

Вопрос, который вы подняли, связан с тем, как в интерфейсе WordPress реализована функция массового редактирования, и почему в вашем случае массив $post_ids оказывается пустым.

Как вы правильно заметили, элемент с идентификатором #bulk-titles создается только для тех типов записей, которые поддерживают название (title). Это гарантируется следующей частью кода из 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 ?>

Если ваш пользовательский тип записи не поддерживает названия, то HTML-код для #bulk-titles не будет автоматически сгенерирован, и в результате, когда вы пытаетесь получить элементы с этим идентификатором в вашем JavaScript-коде, массив $post_ids окажется пустым.

Вы упомянули, что ваши пользовательские типы записей не используют заголовки, и вы установили аргумент supports => false в функции register_post_type. Чтобы решить проблему с массовым редактированием, необходимо добавить поддержку заголовка. Один из вариантов решения заключается в том, чтобы установить supports как массив, который включает title, даже если вы не планируете его отображение на экран редактирования. Вы можете скрыть его с помощью CSS, если это необходимо:

register_post_type('your_post_type', array(
    'supports' => array('title'), // добавление 'title' для поддержки
    // остальные аргументы вашего типа записи
));

С помощью этого изменения вы обеспечите наличие элемента #bulk-titles в разметке, что позволит вашему JavaScript-коду успешно заполнять массив $post_ids корректными значениями.

Если вы хотите скрыть заголовок на странице редактирования, вы можете использовать следующие строки CSS:

#titlewrap {
    display: none;
}

Таким образом, вы решите задачу получения идентификаторов записей при массовом редактировании, сохранив при этом желаемый внешний вид интерфейса.

Оцените материал
Добавить комментарий

Капча загружается...