Как массово удалять поле repeater у записи WP?
Есть плагин кастомных полей Advanced Custom Fields PRO
Создал группу повторителей чтоб в каждой записи смогли добавлять повторитель и в нем уже поля нужные.
Всё отлично работает. с 6 версии даже есть пагинация для поля repearter
Но вот подъехала другая задача. Таких записей где будет много значений у поля повторитель, должно быть много.
Соответственно я заполнил одну запись и дублировал ее.
Но каждый раз удалять из 50 записей по 30-40 , чтоб оставить нужные 10, было муторно. Решил сделать небольшой плагин чтоб массово удалять поля по признаку.
соответственно удаляем по какому то признаку, а именно по полю podborka_item_type
Само удаление полей не подразумевает удаление их из базы, а просто из записи, чтоб удалить не нужно и сохранить.
Но данная фича очень долго работает ,зависает и перестает работать пагинация. Может кто уже жизнь облегчал себе каким то образом? как можно массово чистить поля по признаку?
Вроде мой код простой и не должно грузить страницу запросом.
Создал группу повторителей чтоб в каждой записи смогли добавлять повторитель и в нем уже поля нужные.
Всё отлично работает. с 6 версии даже есть пагинация для поля repearter
Но вот подъехала другая задача. Таких записей где будет много значений у поля повторитель, должно быть много.
Соответственно я заполнил одну запись и дублировал ее.
Но каждый раз удалять из 50 записей по 30-40 , чтоб оставить нужные 10, было муторно. Решил сделать небольшой плагин чтоб массово удалять поля по признаку.
код
<?php/*Plugin Name: Удаляем repeat fieldsVersion: 1.0.0*/// Добавляем мета-бокс (не сохраняет ничего)add_action( 'add_meta_boxes', 'add_meta_box_remove_repeat_acf_pro' );function add_meta_box_remove_repeat_acf_pro() {add_meta_box( 'custom-meta-box', 'Удаляем выборочно записи полей', 'callback__remove_repeat_acf_pro_meta_box', ['promo','page'], 'side', 'high', null );}// Вывод в мета-боксеfunction callback__remove_repeat_acf_pro_meta_box( $post, $meta ) {$id_post = $post->ID;$field_objects = get_field_objects( $id_post ); $sub_field_name = 'podborka_item_type';// Собираем все повторители$listParentRepeats = [];foreach ( $field_objects as $item ) {if ( $item['type'] === 'repeater' ) {$listParentRepeats[] = ['label' => $item['label'],'key' => str_replace( 'field_', 'field-', $item['key'] ),'name' => $item['name'],];}}// Собираем все субполя по типу $sub_field_name$listArray = [];foreach ( $listParentRepeats as $item ) {foreach ( $field_objects[ $item['name'] ]['value'] as $subitem ) {$listArray[] = trim( $subitem[$sub_field_name] );}}// оставляем только уникальные$listArray = array_unique( $listArray );?><?php if ( ! $listArray ) { ?> <p>На этой странице нет нужных полей, проверьте ACF поля, поиск осуществляется по ключу - podborka_item_type</p><?php } ?><?php if ( $listArray ) { ?> <div> <p> <label for='custom-remove-acf-field'><strong>Выбрать тип подкаста:</strong></label> </p> <select name='remove_acf_select_field' id='custom-remove-acf-field' style='width: 95%;'> <option value='0'>Не выбрано</option><?php foreach ( $listParentRepeats as $item ) { ?> <option value='<?php echo $item['key']; ?>'><?php echo $item['label']; ?></option><?php } ?> </select> </div> <div> <p> <label for='custom-remove-acf-field'><strong>Выбрать какие удаляем:</strong></label> </p> <select name='remove_acf_select_subfield' id='custom-remove-acf-subfield' style='width: 95%;'> <option value='0'>Не выбрано</option><?php foreach ( $listArray as $item ) { ?> <option value='<?php echo $item; ?>'><?php echo $item; ?></option><?php } ?> </select> </div> <p> <a class='button button-primary button-large custom-remove-acf-field--btn'>Удалить</a> <span class="spinner custom-remove-acf-field--spinner" style="display: inline-block; margin-top: 10px;"></span> </p> <script> jQuery(function ($) { $(document).on('click', '.custom-remove-acf-field--btn', function (e) { if (!$(this).hasClass('disabled')) { let _this = $(this); let spinner = $('.custom-remove-acf-field--spinner'); let field = $('#custom-remove-acf-field option:selected').val(); let subfield = $('#custom-remove-acf-subfield option:selected').val(); let parent_class = '.acf-' + field; _this.addClass('disabled'); spinner.addClass('is-active'); $(parent_class + ' .acf-field').each(function () { if ($(this).data('name') === '<?php echo $sub_field_name; ?>') { if ($(this).find('select option:selected').val() === subfield && !$(this).parents('.acf-row').hasClass('acf-clone')) { $(this).parents('.acf-row').find('.acf-icon.-minus').click(); $(this).parents('.acf-row').find('.acf-icon.-minus').click(); } } }); setTimeout(function() { _this.removeClass('disabled'); spinner.removeClass('is-active'); }, 1000); } return false; }); }); </script><?php}}function admin_footer_remove_repeat_acf_pro_spinner() { ?> <div class="disable-page-spinner"> <span class="spinner"></span> </div> <style> .disable-page-spinner { position: absolute; left: 0; right: 0; top: 0; bottom: 0; background: rgba(0,0,0,.2); z-index: 9999; height: 100%; display: none; } .disable-page-spinner .spinner { float: none !important; display: block; margin: auto !important; position: absolute; left: 0; right: 0; top: 0; bottom: 0; } </style><?php}add_action('admin_notices', 'admin_footer_remove_repeat_acf_pro_spinner');
соответственно удаляем по какому то признаку, а именно по полю podborka_item_type
Само удаление полей не подразумевает удаление их из базы, а просто из записи, чтоб удалить не нужно и сохранить.
Но данная фича очень долго работает ,зависает и перестает работать пагинация. Может кто уже жизнь облегчал себе каким то образом? как можно массово чистить поля по признаку?
Вроде мой код простой и не должно грузить страницу запросом.

Смотрите также:
Цена: 1000 руб.

SelfParser - универсальный парсер контента 4.0
SelfParser 4.0 - универсальный парсер новостей, товаров. Сам парсер не требует базу данных, полученные данные Вы можете сохранять в любой формат. Что бы понять принцип работы парсера, читайте эту
В комментариях запрещаются спам, а также реклама любых товаров и услуг, иных ресурсов.