it-swarm.com.de

Wie kann ich Post Views von REST API-Aufrufe und aktualisieren Sie sie in einem ACF-Feld?

Ich weiß nicht, ob ich die Dinge etwas kompliziert habe, deshalb erkläre ich die Dinge von oben. Ich habe einen benutzerdefinierten Beitragstyp (News) eingerichtet, der über die REST -API verfügbar gemacht wird. Der Hauptendpunkt (/wp-json/wp/v2/news) gibt eine Liste von news-Elementen zurück, die nach Beliebtheit sortiert werden müssen. Ich habe einige Plugins für die Post-View-Zählung ausprobiert, aber keines davon scheint über die API REST zu funktionieren (sie funktionieren nur, wenn das Thema den Post rendert).

Mein Plan ist es, ein ACF-Feld "Anzahl der Aufrufe" zu erstellen und eine Verbindung zum API-Init "REST" für einen Beitrag (oder nur für meinen Typ "news") herzustellen und den Wert für dieses ACF-Feld zu aktualisieren. Ich sollte dann in der Lage sein, eine Liste der Artikel anzufordern, die nach Anzahl der Aufrufe sortiert sind.

Ich habe anscheinend Lösungen für einige der damit verbundenen Aufgaben gefunden, aber ich kann die grundlegende nicht herausfinden: Wie kann ich mich in WP einbinden, wenn eine REST API-Anfrage gestellt wird einen bestimmten Beitragstyp und wie kann ich das benutzerdefinierte Feld zu diesem Zeitpunkt aktualisieren?

ACF ist kein integraler Bestandteil dieser Abfrage. Die Verwendung eines systemeigenen benutzerdefinierten Felds ist in Ordnung. Wenn jedoch meine Frage zum Hook beantwortet wird, ist der Feldtyp irrelevant.

1
aalaap

Ich sah mich wieder entspannt um und stellte fest, dass the_posts der Action-Hook ist, nach dem ich gesucht hatte. So habe ich es gerade gemacht:

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

Jetzt werde ich nur herausfinden, wie man es nach einem ACF-Feld sortiert ...

Update: Nein, dies wird nicht funktionieren, da the_post in der Hauptabfrage /news/ für jedes der 10 Elemente zehnmal ausgeführt wird, sodass selbst das Abrufen des Index die Anzahl der Aufrufe erhöhen würde. Zurück zum Zeichenbrett...

Update 2: Meine letzte Idee ist, den oben verwendeten the_post-Hook weiterhin zu verwenden, jedoch durch Hinzufügen eines ?index=true-Parameters, der nur mit dem /news/-Endpunkt angegeben wird, z. /news?index=true. Anschließend aktualisiere ich die Hook-Funktion so, dass nur dann eine Ansicht gezählt wird, wenn kein index Abfragezeichenfolgen-Parametersatz vorhanden ist. Schließlich werde ich mich in die Haupt-WP_Query einhängen und die Elemente nach Anzahl sortieren, bevor sie gesendet werden. Wenn dies nicht funktioniert, verwerfe ich das gesamte Verzeichnis und erstelle die App mit Laravel von Grund auf neu.

Update 3: Ich denke, die letzte Idee ist wahrscheinlich nicht die sauberste oder die richtige Art, dies zu tun. Am Ende habe ich einen benutzerdefinierten Endpunkt nur zum Zählen von Ansichten hinzugefügt, wobei ich akzeptierte, dass dies eine benutzerdefinierte Funktionsanforderung ist. Ich habe es so gemacht:

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

Danke an @ Mark-Kaplun für den Vorschlag in der anderen Antwort.

1
aalaap

Wenn Sie eine spezielle Behandlung benötigen, sollten Sie im Allgemeinen nur Ihren eigenen Endpunkt implementieren. Je mehr Nutzen der kanonische Endpunkt hat, desto offensichtlicher wird es. Wenn Sie in Ihrem Fall die Ausgabe dieses Endpunkts ändern, können Sie sie nicht in anderen Plug-ins verwenden, die erwarten, dass eine Liste zurückgegeben wird, die nach dem Veröffentlichungszeitpunkt sortiert ist.

0
Mark Kaplun