代码之家  ›  专栏  ›  技术社区  ›  benny-ben

带CMB2和WPML媒体的WordPress:文件列表,如何在翻译中获得正确的id?

  •  0
  • benny-ben  · 技术社区  · 6 年前

    (用于创建元盒和元字段的框架) (WPML附加模块避免了为每种语言保存相同的附件,只为该附件创建标题、alt、描述和标题的翻译) ; 我正在创建一个像 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' )
        )
    ) );
    

    字段中,ID总是指主语言中的附件,而不是其翻译,因此在前端-当您以翻译的语言显示站点时-显示中上载的图像的标题、alt、说明和标题 文件\u列表

    1 回复  |  直到 6 年前
        1
  •  0
  •   benny-ben    6 年前

    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'
    ) );
    

    然后我创建了用于清理的回调函数,以检查上传附件的语言是否与帖子的语言匹配;如果不匹配,则查找翻译id,如果已翻译,则替换它:

    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;
    
    }
    

    现在它工作得很好,在前端我用正确的语言可视化了图像属性(title、alt等)。

    另外,我不知道这是正确的方法还是最漂亮的形式,我对每一个反馈都持开放态度:)

    推荐文章