WPML
Статус
Решено
Заявлено для
WPML Multilingual CMS 3.1.9.5
Решено в
3.2

Обзор проблемы

Когда одна или несколько родительских страниц имеют разные дочерние страницы с одинаковым слагом, открытие одной из дочерних страниц приводит к перенаправлению на неверную страницу.

Повторное использование слага в дочерних страницах, по-видимому, вызывает неверное перенаправление на фронтенде.

Пример:

  1. Страница A

    1. child-aa
    2. child-ab

  2. Страница B

    1. child-aa (уникальная страница, но с таким же слагом, как в 1.1)
    2. child-bb

Обходное решение

Эта проблема будет исправлена в WPML 3.2.
А пока Вы можете использовать следующее обходное решение.

Обратите внимание, что это работает только с дублированными дочерними слагами при условии, что родительские страницы не используют те же имена, что и дочерние.


  1. Сделайте полную резервную копию Вашего сайта. По возможности, сначала попробуйте сделать это на тестовой копии Вашего сайта.

  2. Откройте sitepress.class.php

  3. Перейдите к строке 7804: она должна содержать только // Adjust page name

  4. Замените этот блок кода (строки с 7804 по 7828):
    // Adjust page name
    if ( isset( $q->query_vars[ 'pagename' ] ) && !empty( $q->query_vars[ 'pagename' ] ) ) {
    	// find the page with the page name in the current language.
    	$pagename = explode ( '/', $q->query_vars[ 'pagename' ] );
    	$pagename = array_pop ( $pagename );
    	$pid = $wpdb->get_var( $wpdb->prepare( "
    					SELECT ID
    					FROM $wpdb->posts p
    					JOIN {$wpdb->prefix}icl_translations t
    					ON p.ID = t.element_id AND t.element_type='post_page'
    					WHERE p.post_name=%s AND t.language_code = %s
    					", $pagename, $current_language ) );
    	if ( $pid ) {
    		$q->query_vars[ 'page_id' ] = $pid;
    		// We have found the page id
    		unset( $q->query_vars[ 'pagename' ] );
    		if ( $q->query_vars[ 'page_id' ] == get_option( 'page_for_posts' ) ) {
    			// it's the blog page.
    			$q->is_page       = false; // $wp_query->is_page       = false;
    			$q->is_home       = true; // $wp_query->is_home       = true;
    			$q->is_posts_page = true; // $wp_query->is_posts_page = true;
    		}
    	}
    }

    На этот блок:
    // Adjust page name
    if ( isset( $q->query_vars[ 'pagename' ] ) && !empty( $q->query_vars[ 'pagename' ] ) ) {
    	// find the page with the page name in the current language.
    	$pid = $wpdb->get_var( $wpdb->prepare( "
    					SELECT ID
    					FROM $wpdb->posts p
    					JOIN {$wpdb->prefix}icl_translations t
    					ON p.ID = t.element_id AND element_type='post_page'
    					WHERE p.post_name=%s AND t.language_code = %s
    					", $q->query_vars[ 'pagename' ], $current_language ) );
    	if ( $pid ) {
    		$q->query_vars[ 'page_id' ] = $pid;
    		// We have found the page id
    		unset( $q->query_vars[ 'pagename' ] );
    		if ( $q->query_vars[ 'page_id' ] == get_option( 'page_for_posts' ) ) {
    			// it's the blog page.
    			$q->is_page       = false; // $wp_query->is_page       = false;
    			$q->is_home       = true; // $wp_query->is_home       = true;
    			$q->is_posts_page = true; // $wp_query->is_posts_page = true;
    		}
    	}
    }
    

  5. Сохраните

  6. Перезагрузите сайт

Все известные проблемы →