WPML
ステータス
解決済み
報告対象
WPML Multilingual CMS 3.1.9.5
解決されたバージョン
3.2

問題の概要

1つ以上の親ページに同じスラッグを持つ異なる子ページがある場合、その子ページの1つを開くと誤ったページにリダイレクトされます。

子ページでスラッグを再利用すると、フロントエンドで誤ったリダイレクトが引き起こされるようです。

例:

  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. ウェブサイトを再読み込みします。

すべての既知の問題 →