Zeigen Sie beliebte Beiträge auf einer anderen PHP-Website über die WP REST JSON-API an

9

Ich muss beliebte und aktuelle Beiträge auf einer anderen PHP-Website unter derselben Domain anzeigen.

Beispiel:

  1. www.example.com -> Hauptwebsite (PHP, MySQL)
  2. www.example.com/blog -> WordPress-Blog

Müssen beliebte, aktuelle Blog-Beiträge auf der Hauptwebsite anzeigen.

Bitte beachten Sie, dass Blog und Hauptwebsite zwei separate Datenbanken verwenden.

Ich habe mich dafür entschieden, das WP REST JSON API Plugin zu verwenden. Jetzt habe ich eine andere Frage.

Ich verwende den folgenden Code, um den beliebten Beitrag der letzten Woche abzurufen. Was ich eigentlich brauche, ist, die gleichen Daten per API-Aufruf zu erhalten.

$args = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => $recent_posts_count,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC'
);
$popularposts = new WP_Query( $args );

Wie kann ich das machen?

Janith Chinthana
quelle
Dies wurde schon oft gefragt. Bitte benutzen Sie die Suche.
Kraftner
1. Wenn Sie eine neue Frage haben, öffnen Sie bitte eine neue Frage. In diesem Fall könnte es in Ordnung sein, da es nicht ganz neu ist. Jedenfalls ist der Titel jetzt irreführend. 2. Sie haben die Dokumentation gesehen: wp-api.org
Kraftner
Ich habe auch den Titel aktualisiert, aber ich werde das Dokument durchgehen, danke
Janith Chinthana

Antworten:

8

Ich werde Ihnen eine kleine Antwort auf Ihr Update geben und dies mit der WP-API tun . Die API hat die Möglichkeit, die WP_Query wie auch im Core zu verwenden, jedoch über die get-Parameter in der URL.

Eine URL zum Abrufen von Inhalten aus dem Post-Status sieht folgendermaßen aus:

http://example.com/wp-json/posts

Gehen Sie folgendermaßen vor, um Inhalte mit den gewohnten WP_Query-Parametern abzurufen:

http://example.com/wp-json/posts?filter[posts_per_page]=2&filter[order]=ASC

Sie können Ihre benutzerdefinierte Abfrage mit allen Parametern auch in der URL erstellen. Sie können sehen, wie sich die Methode zum Abrufen dieser Daten WP_Queryfür eine Standard-WordPress-Schleife vertraut anfühlt . Wenn Sie keinen Parameter angeben, werden die Standardeinstellungen WP_Queryverwendet.

Das Ergebnis ist json, das Sie analysieren und für Ihre externe Site verwenden können.

Weitere Parameter und Dokumentationen finden Sie auch auf der Website der API .

Update für date_query

Die API kann kein Ergebnis für eine Abfrage wie erstellen query_date. In der Dokumentation finden Sie alle möglichen Parameter.

Aber die neue Version wird in Sicht Tagen, Wochen veröffentlicht. In diesem Problem finden Sie Informationen zu einer Lösung für diese Datumsabfrage. Alternativ können Sie einen benutzerdefinierten Filter über einen Haken verwenden, z.

// Allow datequery in /posts filter
add_filter( "json_query_vars", function( $query_args ) {
    return array_merge( $query_args, 
        array( "date_query" => array( array( "after" => "1 week ago" ) ) )
    );
} );

Update für meta_query

Die API kann diese Funktion der Standard-WP-Abfrage auch nicht verwenden. Sie können jedoch einen Hook verwenden, um die API an diese Anforderung anzupassen. Auch hier ein kleines Beispiel.

add_filter('json_query_var-meta_query', 'add_meta_query', 10, 1);

function add_meta_query( $data ){

    $args = array();
    $args['relation'] = 'AND';

    foreach ( $data as $key => $value ) {
        if ( 'relation' === $key ) {
            $args['relation'] = $data['relation'];
        }

        if ( substr($key, 0, 3) === 'key' ) {
            $arg_num = substr( $key, 3 );
            $args[ (int) $arg_num ][ 'key' ] = $value;
        }

        if (  substr( $key, 0, 7 ) === 'compare' ) {
            $arg_num_comp = substr( $key, 7 );
            $args[ (int) $arg_num_comp ][ 'compare' ] = $value;
        }
    }

    return $args;
}

Jetzt kann ich JSON so restful aufrufen, um den Wp_query-Posts-Filter nachzuahmen, der sich bereits auf dem Server befindet:

?filter[meta_query][key]=_newsml_categories_newsstream&filter[meta_query][key2]=homepage&filter[meta_query][relation]=AND&filter[meta_query][compare]=NOT%20EXISTS&filter[meta_query][compare2]=NOT%20EXISTS

Das Meta-Abfrage-Update basiert auf dieser Antwort .

bueltge
quelle
Haben Sie eine Idee, wie man die Zeile 'date_query' => array( array( 'after' => '1 week ago' ) ), als
Abfragezeichenfolge
Ich würde dies gerne als Antwort akzeptieren. Wenn Sie jedoch eine Idee zu dem obigen Kommentar haben, können Sie Ihre Gedanken teilen.
Janith Chinthana
Andere Filter als filter[posts_per_page]=2&filter[order]=ASCdiese beiden funktionieren nicht, daher werden immer nur die neuesten Beiträge
angezeigt
@ JanithChinthana Ich habe noch einmal getestet, der Filterparameter funktioniert gut. - Als Beispiel http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASC. Viel mehr in meinem Update unten in der Antwort.
Bueltge
danke für das update, ja post_per_page& orderfunktioniert, aber was ist mit meta_key. funktioniert es damit oder muss ich dafür extra arbeiten?
Janith Chinthana