WPML
สถานะ
แก้ไขแล้ว
รายงานสำหรับ
WPML String Translation 3.2.15
แก้ไขใน
3.2.16
แท็กหัวข้อ
Bug

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

ปัญหานี้เกิดขึ้นเมื่อการแปลแบบกำหนดเองที่เก็บไว้ในไฟล์ .mo ไม่สามารถโหลดได้อย่างถูกต้องบน WordPress 6.7.x หรือใหม่กว่า ปัญหานี้เกี่ยวข้องกับการเปลี่ยนแปลงวิธีที่ WordPress จัดการการโหลดการแปลแบบ Just-In-Time (JIT) ซึ่งส่งผลให้รายการการแปลถูกยกเลิกการตั้งค่าในตัวแปร global $l10n

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

โปรดตรวจสอบให้แน่ใจว่าคุณได้สำรองข้อมูลเว็บไซต์ทั้งหมดของคุณก่อนดำเนินการต่อ


  • เปิดไฟล์ …/wp-content/plugins/wpml-string-translation/classes/MO/Hooks/LoadTextDomain.php

  • ค้นหาบรรทัดที่ 62

  • แทนที่:
    	public function overrideLoadTextDomain( $override, $domain, $mofile ) {
    		if ( ! $mofile ) {
    			return $override;
    		}
    
    		if ( ! $this->isCustomMOLoaded( $domain ) ) {
    			remove_filter( 'override_load_textdomain', [ $this, 'overrideLoadTextDomain' ], 10 );
    			$locale      = $this->file_locale->get( $mofile, $domain );
    			$this->loadCustomMOFile( $domain, $mofile, $locale );
    			add_filter( 'override_load_textdomain', [ $this, 'overrideLoadTextDomain' ], 10, 3 );
    		}
    
    		$this->loaded_mo_dictionary->addFile( $domain, $mofile );
    
    		return $override;
    	}

  • ด้วย:
    public function overrideLoadTextDomain( $override, $domain, $mofile ) {
    		if ( ! $mofile ) {
    			return $override;
    		}
    
    		if ( ! $this->isCustomMOLoaded( $domain ) ) {
                $locale      = $this->file_locale->get( $mofile, $domain );
                $wpml_mofile = $this->file_manager->get( $domain, $locale );
    
                if ( ! file_exists( $mofile ) && $wpml_mofile ) {
                    add_filter( 'load_translation_file', function($file) use ( $mofile, $wpml_mofile ) {
                        if ( $file === $mofile ) {
                            return $wpml_mofile;
                        }
                        return $file;
                        // unset this own hook, just to be used once.
                    });
                    return $override;
                }
    			remove_filter( 'override_load_textdomain', [ $this, 'overrideLoadTextDomain' ], 10 );
    
    			$this->loadCustomMOFile( $domain, $mofile, $locale );
    			add_filter( 'override_load_textdomain', [ $this, 'overrideLoadTextDomain' ], 10, 3 );
    		}
    
    		$this->loaded_mo_dictionary->addFile( $domain, $mofile );
    
    		return $override;
    	}

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