WPML
สถานะ
แก้ไขแล้ว
รายงานสำหรับ
WPML Multilingual CMS 3.3.6
แก้ไขใน
WPML 3.4.0

ภาพรวมของปัญหา

ปัญหานี้จะเกิดขึ้นเมื่อคุณมีคิวรีสำหรับอนุกรมวิธาน 2 รายการ ซึ่งคล้ายกับตัวอย่างเหล่านี้:

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

สิ่งนี้ทำให้เกิดข้อผิดพลาดต่อไปนี้:

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

วิธีแก้ปัญหาชั่วคราว

วิธีแก้ปัญหาชั่วคราวต่อไปนี้ใช้ได้กับ WPML เวอร์ชัน 3.3.6 และ 3.3.7 แต่ชื่อไฟล์ที่คุณต้องแก้ไขจะแตกต่างกัน:


  • สำหรับ WPML เวอร์ชัน 3.3.6 คุณต้องแก้ไขไฟล์ sitepress.class.php ซึ่งสามารถพบได้ในโฟลเดอร์หลักของปลั๊กอิน WPML

  • สำหรับ WPML เวอร์ชัน 3.3.7 คุณต้องแก้ไขไฟล์ class-wpml-seo-headlangs.php ซึ่งสามารถพบได้ในตำแหน่งต่อไปนี้: ../sitepress-multilingual-cms/classes/seo/

คุณต้องค้นหาฟังก์ชัน head_langs() (ประมาณบรรทัดที่ 4619) แทนที่ฟังก์ชันดังกล่าวด้วยโค้ดต่อไปนี้:
	
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
        }
    }
}

จากนั้น ในไฟล์เดียวกัน ให้ค้นหาฟังก์ชัน render_ls_li_item (ประมาณบรรทัดที่ 3319) แทนที่ด้วยโค้ดต่อไปนี้:
   
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
}

ปัญหาที่ทราบแล้วทั้งหมด →