WPML
Trạng thái
Đã giải quyết
Được báo cáo cho
WPML Multilingual CMS 4.6.8
Đã giải quyết trong
WPML 4.6.9
Thẻ chủ đề
Bug

Tổng quan về lỗi

Người dùng cài đặt WordPress trong một thư mục con và sử dụng tính năng Sử dụng thư mục cho ngôn ngữ mặc định của WPML đang gặp phải tình trạng tạo URL không chính xác cho các lưu trữ phân loại và liên kết loại nội dung tùy chỉnh. Điều này dẫn đến các đường dẫn bị nhân đôi trong URL và hậu quả là lỗi 404 khi cố gắng truy cập vào các trang này.

Ví dụ: bạn sẽ được chuyển hướng đến http://www.domain.com/subfolder/en/subfolder/en/category/new-category/ thay vì http://www.domain.com/subfolder/en/category/new-category/.

Giải pháp tạm thời

Vui lòng đảm bảo bạn đã tạo bản sao lưu đầy đủ cho trang web của mình trước khi tiếp tục.


  • Mở tệp …/wp-content/plugins/sitepress-multilingual-cms/classes/canonicals/class-wpml-canonicals-hooks.php.

  • Tìm dòng 87.

  • Thay đổi:
    	public function redirectArchivePageToDefaultLangDir() {
    		global $wp_query;
    
    		$isValidForRedirect = $wp_query->is_archive() && ! call_user_func( $this->is_current_request_root_callback );
    
    		if ( ! $isValidForRedirect ) {
    			return;
    		}
    
    		$currentUri = $_SERVER['REQUEST_URI'];
    		$lang       = $this->sitepress->get_current_language();
    
    		if ( 0 !== strpos( $currentUri, '/' . $lang ) ) {
    			$canonicalUri = user_trailingslashit(
    				$this->url_converter->get_abs_home() . '/' . $lang . $currentUri
    			);
    
    			$this->redirectTo( $canonicalUri );
    		}
    	}
    
    	private function redirectTo( $uri ) {
    		$this->sitepress->get_wp_api()->wp_safe_redirect( $uri, 301 );
    	}

  • Thành:
    	public function redirectArchivePageToDefaultLangDir() {
    		global $wp_query;
    
    		$isValidForRedirect = $wp_query->is_archive() && ! call_user_func( $this->is_current_request_root_callback );
    
    		if ( ! $isValidForRedirect ) {
    			return;
    		}
    
    		$currentUri = $_SERVER['REQUEST_URI'];
    		$lang       = $this->sitepress->get_current_language();
    
    		if ( 0 !== strpos( $currentUri, '/' . $lang ) ) {
    			$realhome = get_option('siteurl');
    			$parsed = parse_url($realhome);
    			if (false !== strpos($currentUri, $parsed["path"])){
    				return;
    			} else {
    			$canonicalUri = user_trailingslashit(
    				$this->url_converter->get_abs_home() . '/' . $lang . $currentUri
    			);
    			}
    
    			$this->redirectTo( $canonicalUri );
    		}
    	}

Tất cả các lỗi đã ghi nhận →