Tổng quan về sự cố
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
Sự cố này đã được khắc phục trong WPML 3.4.0. Việc cập nhật giải quyết vấn đề này trên trang web của bạn, vì vậy bạn chỉ cần giải pháp tạm thời này nếu chưa thể cập nhật.
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/
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
}
}
}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
}