WPML

Panoramica del problema

Il problema si presenta quando hai una query per due tassonomie – simile a questi esempi:

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

Questo causa il seguente errore:

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

Soluzione alternativa

Questo problema è stato risolto in WPML 3.4.0. L'aggiornamento risolve il problema sul tuo sito, quindi hai bisogno di questa soluzione alternativa solo se non puoi ancora aggiornare.

La seguente soluzione alternativa funziona per entrambe le versioni 3.3.6 e 3.3.7 di WPML, ma il nome del file che devi modificare è diverso:

  • Per la versione 3.3.6 di WPML, devi modificare il file sitepress.class.php che si trova nella cartella principale del plugin WPML.
  • Per la versione 3.3.7 di WPML, devi modificare il file class-wpml-seo-headlangs.php, che si trova nella seguente posizione: ../sitepress-multilingual-cms/classes/seo/
Devi cercare la funzione head_langs() (intorno alla riga 4619). Sostituisci questa funzione con il seguente codice:
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
        }
    }
}
Successivamente, nello stesso file, trova la funzione render_ls_li_item (intorno alla riga 3319). Sostituiscila con il seguente codice:
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
}

Tutti i problemi noti

Riscontri ancora questo problema?

Se l’aggiornamento non risolve il problema, fai una richiesta di supporto e lo analizzeremo con te.