- Statut
- Résolu
- Signalé pour
- WPML Multilingual CMS 3.3.6
- Résolu dans
- WPML 3.4.0
Aperçu de l’anomalie
Le problème apparaît lorsque vous avez une requête pour deux taxonomies – similaire à ces exemples :
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
Cela entraîne l’erreur suivante :
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
Solution de contournement
La solution de contournement suivante fonctionne pour les versions 3.3.6 et 3.3.7 de WPML, mais le nom du fichier que vous devez modifier est différent :
- Pour la version 3.3.6 de WPML, vous devez modifier le fichier sitepress.class.php qui se trouve dans le dossier principal de l’extension WPML.
- Pour la version 3.3.7 de WPML, vous devez modifier le fichier class-wpml-seo-headlangs.php, qui se trouve à l’emplacement suivant : ../sitepress-multilingual-cms/classes/seo/
Vous devez chercher la fonction head_langs() (vers la ligne 4619). Remplacez cette fonction par le code suivant :
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
}
}
}
Ensuite, dans le même fichier, trouvez la fonction render_ls_li_item (vers la ligne 3319). Remplacez-la par le code suivant :
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
}