ちょっと複雑なことがあるかどうかはわかりませんので、上から順に説明します。 REST APIを介して公開されているカスタム投稿タイプ(ニュース)を設定しました。メインエンドポイント(/wp-json/wp/v2/news
)は、人気順に並べ替える必要があるnews
項目のリストを返します。私はいくつかの投稿ビューカウントプラグインを試しましたが、どれもREST API経由では動作しないようです(それらはテーマが投稿をレンダリングするときにのみ動作します)。
私の計画は、 "view count" ACFフィールドを作成し、投稿のために(あるいは私のnews
タイプのためにのみ)REST API initにフックし、そのACFフィールドの値を更新することです。ビュー数で並べられたアイテムのリストをリクエストできるはずです。
いくつかのタスクには解決策が見つかったようですが、基本的なタスクを理解することはできません。WP API要求が行われたときにRESTにフックする方法特定の投稿タイプとその時点でカスタムフィールドを更新する方法を教えてください。
ACFはこのクエリの不可欠な部分ではありません - ネイティブのカスタムフィールドを使用しても問題ありませんが、フックに関する質問に答えてもフィールドタイプは関係ありません。
私はもっとリラックスした気持ちでもう一度見回し、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=true
。 index
クエリ文字列パラメータセットがない場合にのみビューをカウントするようにフック関数を更新します。最後に、メインの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に感謝します。
一般に、あなたがあなた自身の特別な扱いを必要とするならば、あなたはただあなた自身のエンドポイントを実装するべきです。標準的なエンドポイントがより多く使用されるほど、より明らかになります。あなたの場合、そのエンドポイントの出力を変更すると、それが発行時刻までにリストされたリストを返すことを期待する他のプラグインでそれを使用することはできません。