WordPress с CMB2 и WPML Media: file_list, как получить правильный идентификатор в переводах? - PullRequest
0 голосов
/ 04 октября 2018

В WordPress я использую плагины CMB2 (инфраструктура для создания метабокса и метаполя) и WPML Media (надстройка WPML позволяет не сохранять одно и то же вложение для каждого языка, создавая переводы:заголовок, альт, описание и подпись к этому единственному приложению) ;Я создаю метаполе типа file_list, которое сохраняет вложения в формате array (id => url), например:

$cmb = new_cmb2_box( array(
    'id'               => 'benny_metabox_photo',
    'title'            => esc_html__( 'My Photo Metabox', 'mydomain' ),
    'object_types'     => array( 'post' )
) );

$cmb->add_field( array(
    'name'         => esc_html__( 'My Photo', 'mydomain' ),
    'id'           => 'benny-file-list',
    'type'         => 'file_list',
    'preview_size' => array( 100, 100 ),
    'text'         => array(
        'add_upload_files_text' => esc_html__( 'Add Photos',   'mydomain' ),
        'remove_image_text'     => esc_html__( 'Remove Photo', 'mydomain' ),
        'file_text'             => esc_html__( 'Photo:',       'mydomain' ),
        'file_download_text'    => esc_html__( 'Download',     'mydomain' ),
        'remove_text'           => esc_html__( 'Remove',       'mydomain' )
    )
) );

Итак, когда я создаю сообщение на основном языке, установленном в WPML, все работает правильно.Но когда я создаю переводы и вставляю вложения в поле file_list, идентификаторы всегда относятся к вложениям на основном языке, а не к его переводам, поэтому в веб-интерфейсе - при отображении сайта на переведенных языках - заголовок, altОписание и подпись к изображениям, загруженным в поле file_list, представлены на основном языке.Как я могу сделать, чтобы просмотреть их переводы, а не основной язык?

1 Ответ

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

Я видел, что CMB2 предлагает возможность создать пользовательскую функцию очистки, с помощью которой значения проверяются перед их вставкой в ​​базу данных.Поэтому я установил параметр sanitization_cb в метаполе следующим образом:

$cmb->add_field( array(
    'name'            => esc_html__( 'My Photo', 'mydomain' ),
    'id'              => 'benny-file-list',
    'type'            => 'file_list',
    'preview_size'    => array( 100, 100 ),
    'text'            => array(
        'add_upload_files_text' => esc_html__( 'Add Photos',   'mydomain' ),
        'remove_image_text'     => esc_html__( 'Remove Photo', 'mydomain' ),
        'file_text'             => esc_html__( 'Photo:',       'mydomain' ),
        'file_download_text'    => esc_html__( 'Download',     'mydomain' ),
        'remove_text'           => esc_html__( 'Remove',       'mydomain' )
    ),
    'sanitization_cb' => 'benny_cmb_sanitize_file_list'
) );

Затем я создал функцию обратного вызова для очистки, чтобы проверить, соответствует ли язык загруженного вложения языку публикации;если он не совпадает, он ищет идентификатор перевода и, если он был переведен, он заменяет его:

function benny_cmb_sanitize_file_list( $value, $field_args, $field ) {

    if ( ! function_exists( 'icl_object_id' ) )
        return $value;

    if ( empty( $value ) )
        return $value;

    $main_lang = apply_filters( 'wpml_default_language', NULL );

    $post_id = $field->object_id;

    $post_lang = apply_filters( 'wpml_post_language_details', NULL, $post_id );
    $post_lang = $post_lang[ 'language_code' ];

    if ( $post_lang == $main_lang )
        return $value;

    $photo = $value;

    $trad_photo = array();

    foreach ( $photo as $id => $url ) {

        $photo_lang = apply_filters( 'wpml_post_language_details', NULL, $id );
        $photo_lang = $photo_lang[ 'language_code' ];

        $post_type = get_post_type( $id );

        if ( $photo_lang !== $post_lang ) {

            $trad_id = apply_filters( 'wpml_object_id', $id, $post_type, FALSE, $post_lang );

            if ( ! empty( $trad_id ) ) {

                $trad_photo[ $trad_id ] = $url;

            }
        }
    }

    if ( ! empty( $trad_photo ) ) {

        return $trad_photo;

    }

    return $value;

}

Теперь он отлично работает, и во внешнем интерфейсе я визуализирую атрибуты изображения (название,alt и т. д.) на правильном языке.

PS Я не знаю, правильная ли это методология или самая красивая форма, я открыт для каждого отзыва:)

...