web-dev-qa-db-ja.com

投稿の投稿数をカウントする REST APIはACFフィールドでそれらを呼び出して更新しますか?

ちょっと複雑なことがあるかどうかはわかりませんので、上から順に説明します。 REST AP​​Iを介して公開されているカスタム投稿タイプ(ニュース)を設定しました。メインエンドポイント(/wp-json/wp/v2/news)は、人気順に並べ替える必要があるnews項目のリストを返します。私はいくつかの投稿ビューカウントプラグインを試しましたが、どれもREST AP​​I経由では動作しないようです(それらはテーマが投稿をレンダリングするときにのみ動作します)。

私の計画は、 "view count" ACFフィールドを作成し、投稿のために(あるいは私のnewsタイプのためにのみ)REST AP​​I initにフックし、そのACFフィールドの値を更新することです。ビュー数で並べられたアイテムのリストをリクエストできるはずです。

いくつかのタスクには解決策が見つかったようですが、基本的なタスクを理解することはできません。WP AP​​I要求が行われたときにRESTにフックする方法特定の投稿タイプとその時点でカスタムフィールドを更新する方法を教えてください。

ACFはこのクエリの不可欠な部分ではありません - ネイティブのカスタムフィールドを使用しても問題ありませんが、フックに関する質問に答えてもフィールドタイプは関係ありません。

1
aalaap

私はもっ​​とリラックスした気持ちでもう一度見回し、the_postsが私が探していたアクションフックであることを考え出しました。これは私がちょうどそれをやった方法です:

add_action(
    'the_post',
    function ( $post ) {
        $count = (int) get_field('views');
        $count++;
        update_field('views', $count);
    }
);

ACFフィールドで並べ替える方法を説明します。

更新: いいえ、これは機能しません。なぜなら、the_postは10個の各項目に対してメインクエリ/news/で10回実行されるからです。インデックスを取得してもビュー数は増えます。ふりだしに戻る...

更新2: /私の最後のアイデアは上記のようにthe_postフックを使用することですが、?index=trueエンドポイントでのみ指定される/news/パラメータを追加することによってです。 /news?index=trueindexクエリ文字列パラメータセットがない場合にのみビューをカウントするようにフック関数を更新します。最後に、メインのWP_Queryにフックして、アイテムが送信される前に件数で並べ替えます。これでうまくいかない場合は、このディレクトリ全体をゴミ箱に捨て、Laravelを使用してアプリを最初から作成します。

更新3: /最後のアイデアはおそらくこれを行うための最もクリーンで正しい方法ではないと思います。ビューを数えるためだけにカスタムエンドポイントを追加することになり、これがカスタム機能要件であることを受け入れました。私はこのようにしました:

function aalaap_count_view( $data ) {
    $post = get_post( $data['id'] );

    if ( empty( $post ) ) {
        return new WP_Error( 'aalaap_post_not_found', 'Invalid post', array( 'status' => 404 ) );
    }

    // Now update the ACF field (or whatever you wish)
    $count = (int) get_field('views', $post->ID);
    $count++;
    update_field('views', $count, $post->ID);

    return new WP_REST_Response($count);
}

add_action( 'rest_api_init', function () {
    register_rest_route( 'aalaap/v1', '/countview/(?P<id>\d+)', array(
        'methods' => 'GET',
        'callback' => 'aalaap_count_view',
    ) );
} );

他の回答での提案をくれた@ Mark-Kaplunに感謝します。

1
aalaap

一般に、あなたがあなた自身の特別な扱いを必要とするならば、あなたはただあなた自身のエンドポイントを実装するべきです。標準的なエンドポイントがより多く使用されるほど、より明らかになります。あなたの場合、そのエンドポイントの出力を変更すると、それが発行時刻までにリストされたリストを返すことを期待する他のプラグインでそれを使用することはできません。

0
Mark Kaplun