it-swarm.com.de

WP REST API - Multisite - Erhalte Beiträge von allen Seiten

Ist es möglich/wie kann ich mit der REST -API alle Posts von allen Sites einer Installation mit mehreren Standorten abrufen? Auf der Startseite der primären Site möchte ich die letzten Beiträge von all den Sites anzeigen. Beispielsweise zeigt mysite.com die letzten Posts von mysite.com/site1, myite.com/site2 usw. zusammengeführt an (möglicherweise mit etwas Filterung). Ich weiß, wie man das mit PHP macht. Ich möchte sehen, ob ich es mit der REST API tun kann.

Josh Pollock @ torquemag hat diese Lösung vorgeschlagen: https://torquemag.io/2016/07/combine-wordpress-sites-rest-api/

Joshs Beispiel sieht vor, Beiträge von zwei völlig verschiedenen Sites zu kombinieren. Daher frage ich mich, ob es eine andere Möglichkeit gibt, dies in einer einzigen Installation mit mehreren Sites zu tun. Ich habe bisher nicht viel mit benutzerdefinierten Endpunkten gemacht und mich gefragt, ob dies auch mit einem benutzerdefinierten Endpunkt möglich ist.

Auch neugierig auf mögliche Leistungsprobleme.

1
mgtech

Hier ist ein REST API-Rezept für den neuesten Beitrag pro Site auf einer Multi-Site für relativ wenige Sites:

  • Verwende get_sites(),
  • sites durchlaufen und zu jeder Site wechseln,
  • abfrage des letzten Beitrags auf jeder Site,
  • daten sammeln,
  • bestelldaten nach utime ,
  • daten liefern

Beispiel REST Routen

https://example.com/wp-json/wpse/v1/latest-post-per-site
https://example.com/wp-json/wpse/v1/latest-post-per-site?number=10
https://example.com/wp-json/wpse/v1/latest-post-per-site?debug

Beispiel Plugin

Hier ist ein Demo-Plugin, das das obige Rezept implementiert (muss getestet werden):

<?php
/**
 * Plugin Name: WPSE-307040: Rest API - Latest Post Per Site
 * Description: Rest API - latest post per site (multisite).
 * Plugin URI:  https://wordpress.stackexchange.com/a/307051/26350
 * Author:      birgire
 * Version:     1.0.0
 */

namespace WPSE\RestAPI\LatestPostPerSite;

/**
 * Register Rest Route
 */

add_action( 'rest_api_init', function() {
    register_rest_route(
        'wpse/v1',
        '/latest-post-per-site/',
        [
           'methods'       => 'GET',
           'callback'      => __NAMESPACE__.'\rest_results'
        ]
    );
} );


/**
 * Rest Results
 */
function rest_results( $request ) {
    $parameters = $request->get_query_params();

    // Default 10 items
    $number = isset( $parameters['number'] ) ? (int) $parameters['number'] : 10;

    // Max 30 items
    if( $number > 30 ) {
        $number = 30;
    }

    $items = [];
    $i = 0;

    $blogs = get_sites( [
        'orderby' => 'last_updated',
        'order'   => 'DESC',
        'number'  => (int) $number         
    ] );

    foreach ( $blogs as $blog ) {
        switch_to_blog( $blog->blog_id );

        // Site info
        $details =  get_blog_details( $blog->blog_id );

        $items[$i]['sitename'] = esc_html( $details->blogname );
        $items[$i]['siteid']   = (int) $blog->blog_id;
        $items[$i]['homeurl']  = esc_url( $details->home );

        // Latest post
        $args = [
            'orderby'                 => 'post_date',
            'order'                   => 'DESC',
            'posts_per_page'          => 1,
            'post_type'               => 'post',
            'post_status'             => 'publish',
            'ignore_sticky_posts'     => true,
            'no_found_rows'           => true,
            'update_post_term_cache'  => false,
            'update_post_meta_cache'  => false,
        ];

        $query = new \WP_Query( $args );

        if( $query->have_posts() ) {
            while( $query->have_posts() ) {
                $query->the_post();
                // Title
                $items[$i]['title']   = esc_html( get_the_title( get_the_ID() ) );
                // Date
                $items[$i]['date']    = esc_html( get_the_date( 'Y-m-d H:i:s', get_the_ID() ) );
                // Unix time
                $items[$i]['utime']   = esc_html( get_the_date( 'U', get_the_ID() ) );
                // Excerpt
                $items[$i]['excerpt'] = esc_html( wp_trim_words( strip_shortcodes( get_the_content() ), 50 ) );
                 // Permalink
                 $items[$i]['url']    = esc_url( get_permalink( get_the_ID() ) );
            }
            wp_reset_postdata();
       }

       $i++;
       restore_current_blog();

       // Sort by utime.
       $items = wp_list_sort( $items, 'utime', 'DESC' );

       $data = [
           'success' => true,
           'count'   => count( $items ),
           'items'   => $items,
       ];

       // Debug for super admins.
       if( isset(  $parameters['debug'] ) && current_user_can( 'manage_networks' ) ) {
           $data['qrs'] = get_num_queries();
           $data['sec'] = timer_stop(0);
       }

       return $data;
   }

Für eine größere Anzahl von Sites würde ich stattdessen in Betracht ziehen, die create/update/delete for post/meta/taxonomy/term für jede Site zu verwenden, um site-weite Daten zu synchronisieren und zu sammeln eine dedizierte Daten-Site im Multi-Site-Netzwerk.

Ich hoffe es hilft!

2
birgire

Ja, dazu gibt es einen Weg. Es ist ein bisschen komplex für hier; Sie müssen alle Sites durchlaufen (nachdem Sie eine Liste von Sites erhalten haben), für jede eine wp_query ausführen und dann die Ergebnisse für jede wp_query ausgeben.

Schauen Sie sich mein Plugin "Multisite Post Display" an https://wordpress.org/plugins/multisite-post-reader/ . Open Source, natürlich, damit Sie sich in den Code einarbeiten können, um Hinweise zu erhalten, wie ich es gemacht habe, und um sich an Ihre Bedürfnisse anzupassen.

Leistung auf einer Site wurde nicht getestet. Ich hoffe es hilft.

1
Rick Hellewell