• 解決済 metal_rak

    (@metal_rak)


    はじめまして。

    現在、特定のカスタムフィールドを検索して、該当する記事を検索結果として表示するサイトを作っているのですが、検索結果のページングの際に、GETパラメータが消えてしまうという現象に頭を抱えています。皆様のお知恵をお貸しください。

    以下のようなURLでアクセスされた場合、カスタムフィールドの「region」キーの値が「東京都」で「kind」キーの値が「中華」というデータを持つ記事を表示するような感じです。

    http://example.com/result?region=東京都&kind=中華
    (もちろん日本語部分はURLエンコードした状態でリクエストしています)

    具体的にはテーマフォルダ内に、「page-result.php」を作り、以下の処理をさせて検索結果を表示するようにしています。

    1:GETパラメータ・ページ位置(get_query_var(‘paged’))の取得
    2:クエリの組み立て
    3:query_postsの実行(1ページの最大20件、20件以上はページング)
    4:記事の表示
    5:wp-pagenaviでのページング
    6:wp_reset_queryの実行

    このような処理で、検索結果の1ページ目は期待した結果(東京都、中華での検索結果)が表示されます。

    しかし、wp-pagenaviのリンクをクリックして2ページ目以降を表示させようとすると、URLから日本語のパラメータが消えてしまい、上記1の処理で空の値が取得され、期待した検索結果が得られなくなってしまいます。

    1ページ目を表示している時のページングのリンクURLは以下のように正しくGETパラメータが設定されています。

    http://example.com/result/page/2?region=東京都&kind=中華

    しかしこのリンクをクリックすると、URLが書き換えられて、

    http://example.com/result/page/2?region&kind

    のようになってしまい、GETパラメータが取得できなくなってしまうのです。

    解決策が見つからず困り果てております。
    どなたかご教授いただけませんでしょうか?
    なお、GETパラメータに英語を設定した場合は英語の部分だけ残ります。

    例)リンクURL)http://example.com/result/page/2?region=東京都&kind=喫茶CAFE
                             ↓こんな感じ
      表 示URL)http://example.com/result/page/2?region&kind=CAFE

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック投稿者 metal_rak

    (@metal_rak)

    pluggable.phpのwp_sanitize_redirect関数を以下のように修正することで、日本語のパラメータが消えなくなりました。

    しかし、今度はリダイレクトループに陥ってしまい、結局表示されません。
    なぜなのでしょうか(><)困り果てました。

    function wp_sanitize_redirect($location) {
    	// 日本語(漢字・ひらがな・カタカナ・全角英数字 ※半角カナは含まず)を削除しないように変更
    	// $location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%!]|i', '', $location);
    	$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%!]&[^一-龠]&[^ぁ-ん]&[^ァ-ヴ]&[^a-zA-Z0-9]|i', '', $location);

    URL にパラメータ渡す時に、urlencode() して、テンプレート側でGETパラメータを受け取ったら、それを urldecode() で戻してみては?

    トピック投稿者 metal_rak

    (@metal_rak)

    LVP8様ありがとうございます。
    あれから調査を進め、正しくエンコードされた値が渡されていることも確認できました。

    さらなる調査の結果、以下の部分がどうやら原因であることが判明し修正したら日本語パラメータが消されることなく、表示されました。

    【原因の概要】
    canonical.php「redirect_canonical関数」のリダイレクト判定処理において、
    リクエストされたURLとリダイレクト後のURLの値が絶対に一致せずリダイレクトループを起こした。

    ■イメージ
    リクエストされたURL:http://example.com/result/page/2?region=%E6%9D%B1%E4%BA%AC%E9%83%BD&kind=%E4%B8%AD%E8%8F%AF
    リダイレクト後のURL:http://example.com/result/page/2?region=東京都&kind=中華

    【箇所】
    redirect_canonical関数のL255あたりで、リダイレクト後のURLのGETパラメータにデコード後の文字列が設定される。

    【修正方法】
    自己レスした、wp_sanitize_redirectへの修正は不要。
    修正するのはcanonical.phpのredirect_canonical関数のみ。

    canonical.php L255あたり

    // tack on any additional query vars
    	$redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] );
    	if ( $redirect_url && !empty($redirect['query']) ) {
    		$redirect_q_back = $redirect['query'];	// 処理追加
    		parse_str( $redirect['query'], $_parsed_query );
    		$redirect = @parse_url($redirect_url);
    
    		if ( ! empty( $_parsed_query['name'] ) && ! empty( $redirect['query'] ) ) {
    			parse_str( $redirect['query'], $_parsed_redirect_query );
    
    			if ( empty( $_parsed_redirect_query['name'] ) )
    				unset( $_parsed_query['name'] );
    		}
    
    		// $redirect_url = add_query_arg( $_parsed_query, $redirect_url );
    		$redirect_url = $redirect_url . $redirect_q_back;// 処理変更
    	}

    色々と勉強になりました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「固定ページでのページングで日本語のGETパラメータが消える」には新たに返信することはできません。