WP REST API-多站点-从所有站点获取帖子

时间:2018-06-26 作者:mgtech

是否可能/如何使用REST API从多站点安装的所有站点获取所有帖子?在主站点的首页上,我想显示所有站点最近的帖子;e、 g.,mysite。com显示来自mysite的最新帖子。com/site1,myite。com/site2等,合并在一起(可能有一些过滤)。我知道如何使用PHP实现这一点;我想看看我是否可以使用RESTAPI来完成它。

torquemag的Josh Pollock提出了以下解决方案:https://torquemag.io/2016/07/combine-wordpress-sites-rest-api/

Josh的示例设想将来自两个完全不同的站点的帖子组合在一起,因此我想知道是否有其他方法可以在单个多站点安装中实现这一点。到目前为止,我还没有对自定义端点做过多少工作,我想知道自定义端点是否也可以完成这一点。

还对涉及的任何潜在性能问题感到好奇。

2 个回复
最合适的回答,由SO网友:birgire 整理而成

以下是REST API的配方latest post per site on a multi-site, 对于相对较少的站点:

使用get_sites(),

  • 循环站点并切换到每个站点,
  • 查询每个站点上的最新帖子,
  • 收集数据,
  • 按utime排序数据,
  • 服务数据

    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

    下面是一个实现上述配方的演示插件(需要测试):

    <?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;
       }
    
    对于更多的站点,我会考虑挂接每个站点上的“创建/更新/删除”(create/update/delete),以便将站点范围内的数据同步并收集到多站点网络中的专用数据站点。

    希望有帮助!

  • SO网友:Rick Hellewell

    是的,有一种方法可以做到这一点。这里有点复杂;您必须遍历所有站点(在获得站点列表后),对每个站点执行wp\\U查询,然后输出每个wp\\U查询的结果。

    看看我的“Multisite Post Display”插件https://wordpress.org/plugins/multisite-post-reader/ . 当然是开源的,因此您可以深入研究代码以获得我是如何做到这一点的提示,并根据您的需要进行调整。

    尚未在站点上测试性能。希望有帮助。

    结束

    相关推荐

    Website DR using Multisite

    我是Wordpress多站点功能的新手。我一直在想,这个多站点是否可以用于为网站创建灾难恢复站点?如果我有www.abc。com从我的DC运行,该DC构建在CentOS上的PhP和Apache Web服务器上,以MySQL作为后端数据库,我需要为网站设置DR,如果我的生产停止,该多站点是否可以在任何情况下使用?我想这个问题可能太简单了,或者可能已经结束了,但如果你们有什么可以帮助的,那就太好了。或者你可以告诉我建立DR for网站的最佳方法是什么。