WP REST API - Multisite - obtenir des messages de tous les sites
-
-
sur le lien,lesposts sont récupérés avec 1 requête HTTPpar site.Jepense que celapeut utiliserbeaucoup de ressources.Je recommande de créer unnouveaupoint determinaison sur l'API RESTet ensuite vous aveztous lesmessages avec 1 requête: https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/on the link, the posts are retrieved with 1 HTTP request per site. I think that can use lots of ressources. I recommand to create a new endpoint on the REST API and then you have all posts with 1 request : https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/
- 1
- 2018-06-26
- mmm
-
2 réponses
- votes
-
- 2018-06-26
Voici une recette de l'API RESTpour le derniermessagepar site sur unmulti-site ,pour relativementpeu de sites:
- Utilisez
get_sites()
, - boucle sur les siteset basculement vers chaque site,
- rechercher le derniermessage sur chaque site,
- collecter des données,
- données de commande d'ici utime ,
- diffuser des données
Exemples d'itinéraires REST
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
Exemple deplugin
Voici unplugin de démonstrationimplémentant la recette ci-dessus (àtester):
<?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; }
Pour unplusgrandnombre de sites,j'envisageraisplutôt deme connecter à create/update/delete pour post/meta/taxonomy/term sur chaque site,afin collecter des données à l'échelle du site vers un site de données dédié dans le réseaumulti-sites.
J'espère que cela aide!
Here's a REST API recipe for latest post per site on a multi-site, for relatively few sites:
- Use
get_sites()
, - loop over sites and switch to each site,
- query latest post on each site,
- collect data,
- order data by utime,
- serve data
Example REST Routes
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
Example Plugin
Here's a demo plugin implementing the above recipe (needs testing):
<?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; }
For larger number of sites, I would instead consider hooking into the create/update/delete for post/meta/taxonomy/term on each site, to sync and collect site wide data to a dedicated data site in the multi-site network.
Hope it helps!
-
- 2018-06-26
Oui,ilexiste unmoyen de lefaire.C'est unpeu complexepourici;vous devezparcourirtous les sites (après avoir obtenu une liste de sites),faire une wp_querypour chacun,puis afficher les résultatspour chaque wp_query.
Jetez un œil àmonplugin "Multisite Post Display" https://wordpress.org/plugins/multisite-post-reader/.Open source,bien sûr,pour que vouspuissiezfouiller dans le codepour obtenir desindices sur lafaçon dontje l'aifaitet vous adapter à vosbesoins.
Jen'aipastesté lesperformances sur un site.J'espère que cela aide.
Yes, there is a way to do that. It's a bit complex for here; you have to loop through all sites (after you get a list of sites), do a wp_query for each one, then output results for each wp_query.
Take a look at my "Multisite Post Display" plugin https://wordpress.org/plugins/multisite-post-reader/ . Open source, of course, so you can dig into the code to get hints of how I did it, and adjust for your needs.
Haven't tested performance on a site. Hope it helps.
-
Merci,belle solutionbasée sur unplugin,maisje recherche spécifiquement quelque chose utilisant l'API REST.(J'utilise vue.js)Thanks, nice plugin-based solution, but I am specifically looking for something using the REST API. (I'm using vue.js)
- 0
- 2018-06-26
- mgtech
Est-ilpossible/commentpuis-je obtenirtous lesmessages detous les sites sur uneinstallationmultisite à l'aide de l'API REST? Sur lapage d'accueil du siteprincipal,je souhaite afficher les articles récents de tous les sites; Parexemple,mysite.com affiche lesmessages récents demysite.com/site1,myite.com/site2,etc.,fusionnés (éventuellement avec unfiltrage). Je sais commentfaire cela avec PHP; Je veux voir sije peux lefaireen utilisant l'API REST.
Josh Pollock @torquemag aproposé cette solution: https://torquemag.io/2016/07/combine-wordpress -sites-rest-api/
L'exemple de Joshenvisage de combiner despublications de 2 sites complètement différents,et jeme demande donc s'ilexiste une autrefaçon defaire cela dans une seuleinstallationmultisite. Jen'aipasfaitgrand-chose avec lespoints determinaisonpersonnalisésjusqu'àprésentet jeme demande si unpoint determinaisonpersonnalisépourrait également accomplir cela.
Également curieux de connaître les éventuelsproblèmes deperformancesimpliqués.