web-dev-qa-db-ja.com

カスタムエンドポイントのWP-JSONメインクエリまたはベストプラクティスを変更する方法

私は「ゲーム」と呼ばれるカスタム投稿タイプのフルワードプレスインスタンスを持っています。各ゲームは評価を持つことができます。フロントページのメインのクエリはこのクエリを使用します。

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のメインクエリを拡張する方法はありますか

1
Marc

あなたは正しいことをしています。理論的には、おそらく「通常の」APIリクエストを傍受して、必要なものに関連するwp_queryを変更することができますが、これはそのAPIを変更して上書きしていることを意味します。利用できなくなります。

ページネーションに関しては、あなたがあなた自身のものを作る必要があるのは本当ですが、実際にはそれをすることはHTMLフロントエンドよりもはるかに簡単です、あなたが必要とするすべてリクエストの一部として。

1
Mark Kaplun