私は「ゲーム」と呼ばれるカスタム投稿タイプのフルワードプレスインスタンスを持っています。各ゲームは評価を持つことができます。フロントページのメインのクエリはこのクエリを使用します。
public function my_modify_main_query( $query ) {
if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage
$query->set( 'post_type', array( 'game', 'post' ) );
$query->set( 'tax_query', array(
'relation' => 'OR',
array(
'taxonomy' => 'platform',
'field' => 'id',
'terms' => array(
3, //PS4
1312, //PC
158, //XBOX ONE
10158, //Switch
),
'operator' => 'IN'
)
) );
$meta_query = array(
array(
'key' => 'score_count',
'value' => '0',
'type' => 'numeric',
'compare' => '>',
),
);
$query->set( 'meta_query', $meta_query );
}
結果はリリース日順にソートされた評価を持つすべてのゲームです。
私はいつもこのページにアプリを追加したいと思ったので、私はWP-JSONを使い始めました。最初に、追加した後にwp-jsonエンドポイントのメインクエリを変更しようとしました
'show_in_rest' => true
カスタム投稿タイプのinitへ:/ wp-json/wp/v2/games
しかし、パラメータを使用しただけでは同じ複雑な結果をクエリすることはできませんでした。
それで私は私自身のエンドポイントを書き始めました:
function shortscore_register_api_hooks() {
$namespace = 'shortscore/v1';
register_rest_route( $namespace, '/list-recent-rated-games/', array(
'methods' => 'GET',
'callback' => 'shortscore_get_recent_rated_games',
) );
}
function shortscore_get_recent_rated_games() {
if ( 0 || false === ( $result = get_transient( 'shortscore_recent_rated_games' ) ) ) {
$args = array(
'posts_per_page' => 10,
'post_type' => 'game',
'tax_query',
array(
'relation' => 'OR',
array(
'taxonomy' => 'platform',
'field' => 'id',
'terms' => array(
3, //PS4
1312, //PC
158, //XBOX ONE
10158, //Switch
),
'operator' => 'IN'
)
),
'meta_query' => array(
array(
'key' => 'score_count',
'value' => '0',
'type' => 'numeric',
'compare' => '>',
),
),
);
$query = new WP_Query( $args );
$rated_games = $query->posts;
foreach ( $rated_games as $game ) {
$result[] = array(
'ID' => $game->ID,
'title' => $game->post_title,
'cover' => get_the_post_thumbnail_url( $game->ID, array( 120, 120 ) ),
'cover_double' => get_the_post_thumbnail_url( $game->ID, array( 240, 240 ) ),
'permalink' => get_permalink( $game->ID ),
'score_count' => intval( get_post_meta( $game->ID, 'score_count', true ) ),
'score_value' => intval( get_post_meta( $game->ID, 'score_value', true ) ),
);
}
// cache for 10 minutes
set_transient( 'shortscore_recent_rated_games', $result, 60 * 10 );
}
$response = new WP_REST_Response( $result );
$response->header( 'Access-Control-Allow-Origin', apply_filters( 'shortscore_access_control_allow_Origin', '*' ) );
return $response;
}
これはうまく機能しますがこの場合、私は自分でページネーションを追加する必要があります。
これはこれを行う正しい方法ですか?メインのクエリを拡張して、xヘッダーなどを使用して無料でページ編集などのすべてのものを取得することはできませんか。あなたはどのように問題に取り組みますか?このカスタムエンドポイントにページ区切りを追加しますか。それとも、ページ区切りの標準的なパラメータでWP-JSONのメインクエリを拡張する方法はありますか
あなたは正しいことをしています。理論的には、おそらく「通常の」APIリクエストを傍受して、必要なものに関連するwp_query
を変更することができますが、これはそのAPIを変更して上書きしていることを意味します。利用できなくなります。
ページネーションに関しては、あなたがあなた自身のものを作る必要があるのは本当ですが、実際にはそれをすることはHTMLフロントエンドよりもはるかに簡単です、あなたが必要とするすべてリクエストの一部として。