web-dev-qa-db-fra.com

Comment puis-je compter les vues postées de REST Appels API et les mettre à jour dans un champ ACF?

Je ne sais pas si j'ai un peu compliqué les choses, alors je vais expliquer les choses par le haut. Je dispose d’un type de publication personnalisé (news) exposé via l’API REST. Le noeud final principal (/wp-json/wp/v2/news) renvoie une liste d'éléments news, qui doivent être triés par popularité. J'ai essayé quelques plugins post view count, mais aucun ne semble fonctionner via l'API REST (ils ne fonctionnent que lorsque le thème rend la publication).

Mon plan est de créer un champ ACF "nombre de vues" et de le raccorder à l'init REST API init pour une publication (ou uniquement pour mon type news) et de mettre à jour la valeur de ce champ ACF. Je devrais alors pouvoir demander une liste des articles commandés par le nombre de vues.

Il semble que j'ai trouvé des solutions pour certaines des tâches impliquées, mais je ne peux pas comprendre la solution de base: comment puis-je me connecter à WP quand une demande d'API REST est faite le un type de message particulier et comment puis-je mettre à jour le champ personnalisé à ce stade?

ACF ne fait pas partie intégrante de cette requête. L'utilisation d'un champ personnalisé natif me convient, mais si ma question sur le raccordement est répondue, le type de champ n'est pas pertinent.

1
aalaap

Je regardai autour de moi avec un esprit plus détendu et compris que the_posts était le crochet d'action que je cherchais. Voici comment je viens de le faire:

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

Maintenant, je vais juste trouver comment le trier par un champ ACF ...

Mise à jour: Non, cela ne fonctionnera pas, car the_post s'exécute 10 fois dans la requête principale /news/ pour chacun des 10 éléments. Par conséquent, même l'index augmenterait le nombre de vues. Retour à la planche à dessin...

Mise à jour 2: / Mon idée finale est de continuer à utiliser le hook the_post comme ci-dessus, mais en ajoutant un paramètre ?index=true, qui ne sera spécifié qu'avec le noeud final /news/, par exemple. /news?index=true. Je mettrai alors à jour la fonction de raccordement pour ne compter une vue que s'il n'y a pas de paramètre de chaîne de requête index. Enfin, je vais accrocher le WP_Query principal et trier les éléments en fonction du nombre avant leur envoi. Si cela ne fonctionne pas, je détruis tout ce répertoire et je construis l'application à partir de zéro avec Laravel.

Mise à jour 3: Je pense que la dernière idée n'est probablement pas la plus propre ni la bonne façon de procéder. J'ai fini par ajouter un point de terminaison personnalisé uniquement pour le comptage des vues, acceptant qu'il s'agissait d'une exigence de fonctionnalité personnalisée. Je l'ai fait comme ça:

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',
    ) );
} );

Merci à @ Mark-Kaplun pour la suggestion de l'autre réponse.

1
aalaap

En général, si vous avez besoin de votre propre traitement spécial, vous devez simplement mettre en œuvre votre propre point final. Cela deviendra de plus en plus évident au fur et à mesure de l'utilisation du point final canonique. Dans votre cas, si vous modifiez la sortie de ce noeud final, vous ne pourrez pas l’utiliser dans d’autres plug-ins qui s’attendent à ce qu’il renvoie une liste contenant le temps de publication.

0
Mark Kaplun