Вопрос или проблема
В документации 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;
}
Таким образом, вы решите задачу получения идентификаторов записей при массовом редактировании, сохранив при этом желаемый внешний вид интерфейса.