Группа флажков таксономии вложений WordPress не сохраняется в виде сетки - PullRequest
0 голосов
/ 15 октября 2018

Я создал таксономию и прикрепил ее к вложениям или СМИ.

Я использую Расширенные пользовательские поля, чтобы добавить поле таксономии, которое отображается как группа флажков.Он правильно добавляет поля на страницы вложений как в виде таблицы, так и в виде списка.

В представлении списка поля обновляются должным образом, но в виде сетки сохраняются только последние нажатые флажки.Это вызвано некоторой функцией onclick, которая запускает admin-ajax при нажатии каждого флажка.Из-за этого он только отправляет значение в поле клика.Я пытаюсь найти способ изменить функции js для добавления в группы флажков и множественного выбора.

Обновление: я отследил функцию до onchange.

function: save

file: media-views.min.js

Код для репликации вопроса:

Таксономия:

function cptui_register_my_taxes() {
    $labels = array(
        "name" => __( "Image Tags", "" ),
        "singular_name" => __( "Image Tag", "" ),
    );
    $args = array(
        "label" => __( "Image Tags", "" ),
        "labels" => $labels,
        "public" => true,
        "hierarchical" => false,
        "label" => "Image Tags",
        "show_ui" => true,
        "show_in_menu" => true,
        "show_in_nav_menus" => false,
        "query_var" => true,
        "rewrite" => false,
        "show_admin_column" => false,
        "show_in_rest" => false,
        "rest_base" => "imagetags",
        "show_in_quick_edit" => false,
    );
    register_taxonomy( "imagetags", array( "attachment" ), $args );
}
add_action( 'init', 'cptui_register_my_taxes' );

Пользовательские поля:

if( function_exists('acf_add_local_field_group') ):
    acf_add_local_field_group(array(
        'key' => 'group_5bc3f242c39e3',
        'title' => 'Gallery - Image Tags',
        'fields' => array(
            array(
                'key' => 'field_5bc3f249f009c',
                'label' => 'Image Tags',
                'name' => 'new_image_tags',
                'type' => 'taxonomy',
                'instructions' => '',
                'required' => 0,
                'conditional_logic' => 0,
                'wrapper' => array(
                    'width' => '',
                    'class' => '',
                    'id' => '',
                ),
                'taxonomy' => 'imagetags',
                'field_type' => 'checkbox',
                'add_term' => 1,
                'save_terms' => 1,
                'load_terms' => 1,
                'return_format' => 'id',
                'multiple' => 0,
                'allow_null' => 0,
            ),
        ),
        'location' => array(
            array(
                array(
                    'param' => 'attachment',
                    'operator' => '==',
                    'value' => 'all',
                ),
            ),
        ),
        'menu_order' => 0,
        'position' => 'normal',
        'style' => 'default',
        'label_placement' => 'top',
        'instruction_placement' => 'label',
        'hide_on_screen' => '',
        'active' => 1,
        'description' => '',
    ));

endif;

Вы также можете удалить поле таксономии по умолчанию, если хотите, с помощью следующего кода.Это не влияет на код, но удаляет текстовое поле:

// Remove taxonomy from the attachment pages so the acf taxonomy can work
add_action( 'admin_menu', function (){ remove_meta_box('imagetagsdiv', 'attachment', 'side' ); } );

// Add this in to remove it from the popup editor
add_filter( 'attachment_fields_to_edit', function( $fields ){
    unset($fields['imagetags']); 
    return $fields;
} );

Проблема найдена Теперь, чтобы найти решение

Откройте wp-includes / js / media-views.js - Строка: 8353

_.each( this.$el.serializeArray(), function( pair ) {
    data[ pair.name ] = pair.value;
});

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

Примечание. Полный файл WP по умолчанию загружает версию .min

.

1 Ответ

0 голосов
/ 19 октября 2018

Проблема может быть решена путем переопределения функции-прототипа (wp.media.view.AttachmentCompat.prototype.save()), например, так:

add_action( 'admin_print_footer_scripts', 'so52810006', 11 );
function so52810006() {
    // Make sure the media-views script has been enqueued.
    if ( ! did_action( 'wp_enqueue_media' ) ) {
        return;
    }
    ?>
<script>
wp.media.view.AttachmentCompat.prototype.save = function( event ) {
    var data = {};

    if ( event ) {
        event.preventDefault();
    }

    _.each( this.$el.serializeArray(), function( pair ) {
        if ( /\[\]$/.test( pair.name ) ) {
            if ( undefined === data[ pair.name ] ) {
                data[ pair.name ] = [];
            }
            data[ pair.name ].push( pair.value );
        } else {
            data[ pair.name ] = pair.value;
        }
    });

    this.controller.trigger( 'attachment:compat:waiting', ['waiting'] );
    this.model.saveCompat( data ).always( _.bind( this.postSave, this ) );
};
</script>
    <?php
}

Как вы можете видеть, здесь находится основная часть, которая правильно строит dataпринимая во внимание имя поля , которое равно pair.name, т. е. заканчивается ли оно символом [], указывающим значение массива.

_.each( this.$el.serializeArray(), function( pair ) {
    if ( /\[\]$/.test( pair.name ) ) {
        if ( undefined === data[ pair.name ] ) {
            data[ pair.name ] = [];
        }
        data[ pair.name ].push( pair.value );
    } else {
        data[ pair.name ] = pair.value;
    }
});

Пробовал и тестировал работу на WordPress 4.9.8 и АКФ 5.7.7.

...