Resolved
Reported for: WPML Multilingual CMS 3.3.6
Resolved in: WPML 3.4.0
Overview of the issue
The issue appears when you have a query for two taxonomies – similar to these examples:
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
This leads to the following error:
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
Workaround
The following workaround works both for WPML versions 3.3.6 and 3.3.7, but the name of the file you need to edit is different:
- For WPML version 3.3.6, you need to edit the sitepress.class.php file which can be found in the WPML plugin’s main folder.
- For WPML version 3.3.7, you need to edit the class-wpml-seo-headlangs.php file, which can be found in the following location: ../sitepress-multilingual-cms/classes/seo/
You have to look for the head_langs() function (around line 4619). Replace that function with the following code:
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
}
}
}
Then, in the same file, find the render_ls_li_item function (around line 3319). Replace it with the following code:
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
}