2017-08-01 17 views
0

私は、REST API(wordpress)にリクエストを行うためにjQueryを使用しようとしています。これによってエンコーディングに:Wordpress REST APIのURLデコード

http://localhost:8040/?rest_route=%2Fwp%2Fv2%2Fposts&filter%5Bmeta_key%5D=holiday_type&filter%5Bmeta_value%5D=villa& 

は、このように誤った結果が得られ:

http://localhost:8040/?rest_route=/wp/v2/posts&filter[meta_key]=holiday_type&filter[meta_value]=villa 

このなります。私が変更できる設定があるのか​​、それとも無効にすることができますか?もしそうなら、どのコントローラを拡張すべきですか?ドキュメントがその網羅しているわけではない

編集

これは私がリクエストを準備する方法である:

$.get('/', { 
     'rest_route': '/wp/v2/posts', 
     'filter[meta_key]': 'holiday_type', 
     'filter[meta_value]': holidayType 
    }).done(function(data) { 
     // do processing 
    }) 
+0

エラーは何ですか?間違いがある場合はおそらく最初のリクエストにあります。エンコードせずに動作しますか? – Unex

+0

[mcve] – charlietfl

+0

@Unexのようにリクエストを作成する方法を表示します。エラーは発生しません。フィルタと処理されるため、すべての結果が表示されます。それはエンコーディングなしで動作します。 jQueryはすべてのリクエストとブラウザをエンコードします – Michael

答えて

0

私は解決策を見つけました。 Wordpressは既にURLを自動的に解読します。私はしかし、WP API v2の実装でWordPress 4.7のフィルタクエリvarが削除されたことを発見しました。だから私はfunctions.phpファイルにこのコードスニペットが必要なだけで、うまくいきました。

add_filter('rest_post_query', function ($args, $request) { 
    if (empty($request['filter']) || ! is_array($request['filter'])) { 
     return $args; 
    } 

    $filter = $request['filter']; 

    if (isset($filter['meta_key']) && isset($filter['meta_value'])) { 
     $args['meta_key'] = $filter['meta_key']; 
     $args['meta_value'] = $filter['meta_value']; 
    } 

    if (isset($filter['posts_per_page']) && ((int) $filter['posts_per_page'] >= 1 && (int) $filter['posts_per_page'] <= 100)) { 
     $args['posts_per_page'] = $filter['posts_per_page']; 
    } 
    global $wp; 
    $vars = apply_filters('query_vars', $wp->public_query_vars); 
    foreach ($vars as $var) { 
     if (isset($filter[ $var ])) { 
      $args[ $var ] = $filter[ $var ]; 
     } 
    } 

    return $args; 
}, 10, 2);