WPML
Trạng thái
Đã giải quyết
Được báo cáo cho
WPML Multilingual CMS 3.3.6
Đã giải quyết trong
WPML 3.4.0

Tổng quan về lỗi

Vấn đề xuất hiện khi bạn có một truy vấn cho hai phân loại – tương tự như các ví dụ sau:

http://example.com/?my-category=term&other-category=other-term

http://example.com/other-category/other-term/?my-category=term

http://example.com/my-category/term/?other-category=other-term

Điều này dẫn đến lỗi sau:

PHP Catchable fatal error: Object of class WP_Error could not be converted to string in .../wp-content/plugins/sitepress-multilingual-cms/sitepress.class.php on line 4843

Giải pháp tạm thời

Giải pháp tạm thời sau đây hoạt động cho cả WPML phiên bản 3.3.6 và 3.3.7, nhưng tên tệp bạn cần chỉnh sửa sẽ khác nhau:


  • Đối với WPML phiên bản 3.3.6, bạn cần chỉnh sửa tệp sitepress.class.php, có thể được tìm thấy trong thư mục chính của plugin WPML.

  • Đối với WPML phiên bản 3.3.7, bạn cần chỉnh sửa tệp class-wpml-seo-headlangs.php, có thể được tìm thấy ở vị trí sau: ../sitepress-multilingual-cms/classes/seo/

Bạn phải tìm hàm head_langs() (khoảng dòng 4619). Thay thế hàm đó bằng mã sau:
	
function head_langs()
{
    $languages = $this->get_ls_languages( array( 'skip_missing' => true ) );
        // If there are translations and is not paged content...

        // Renders head alternate links only on certain conditions
        $the_post = get_post();
        $the_id   = $the_post ? $the_post->ID : false;
        $is_valid = count( $languages ) > 1 
        && !is_paged() 
        && ( ( ( is_single() 
        || is_page() ) 
        && $the_id 
        && get_post_status( $the_id ) == 'publish' ) 
        || ( is_home() 
        || is_front_page() 
        || is_archive() ) );

        if ( $is_valid ) {
            foreach ( $languages as $code => $lang ) {
                if (!is_wp_error($lang[ 'url' ])) { // <<< temp fix
                    $alternate_hreflang = 
                        apply_filters( 'wpml_alternate_hreflang', $lang[ 'url' ], $code );
                    printf( '' . PHP_EOL,
                        $this->get_language_tag( $code ),
                        str_replace( '&', '&', $alternate_hreflang ) 
                    );
            } // <<< temp fix
        }
    }
}

Sau đó, trong cùng tệp đó, hãy tìm hàm render_ls_li_item (khoảng dòng 3319). Thay thế nó bằng mã sau:
   
public function render_ls_li_item( $lang,
                            $lang_native_hidden = false,
                            $lang_translated_hidden = false,
                            $language_selected = ""
                            ) 
{
    global $icl_language_switcher_preview;
    if (!is_wp_error($lang[ 'url' ])) { //  <<< temp fix
        $country_flag_url = $lang[ 'country_flag_url' ];
        $language_url = apply_filters ( 'WPML_filter_link', $lang[ 'url' ], $lang );
        $language_flag_title = $this->settings[ 'icl_lso_display_lang' ] 
                            ? esc_attr ( $lang[ 'translated_name' ] ) 
                            : esc_attr ( $lang[ 'native_name' ] );
        $ls_settings = 
            $this->get_ls_settings ( $lang, $lang_native_hidden, $lang_translated_hidden );

        $language_selector = 
            '<li class="icl-' . $lang[ 'language_code' ]
                        . '"><a href="' . $language_url . '" ' . $language_selected . '>';

        if ( $this->settings[ 'icl_lso_flags' ] 
            || $icl_language_switcher_preview ):
            $language_selector .= 
                '<img ' . ( !$this->settings[ 'icl_lso_flags' ] 
                    ? 'style="display:none"' : '' )
                              . ' class="iclflag" '
                              . 'src="' . $country_flag_url . '" '
                              . 'alt="' . $lang[ 'language_code' ] . '" '
                              . 'title="' . $language_flag_title . '" /> ';
        endif;

        $ls_settings = $this->get_ls_settings (
            $lang,
            $ls_settings[ 'lang_native_hidden' ],
            $ls_settings[ 'lang_translated_hidden' ]
        );
        $language_selector .= icl_disp_language (
            $ls_settings[ 'lang_native' ],
            $ls_settings[ 'lang_translated' ],
            $ls_settings[ 'lang_native_hidden' ],
            $ls_settings[ 'lang_translated_hidden' ]
        );

        $language_selector
            .= '</a></li>';

        return $language_selector;
    } //  <<< temp fix
}

Tất cả các lỗi đã ghi nhận →