从网络中的多个站点查询帖子?


8

我知道有一些问题会围绕着我所寻求的解决方案,但是我相信我正在寻找一些特定的东西。

这实际上是一个两部分的问题:

1)我的目标是让wordpress在网络(多站点)模式下运行,而我正在尝试找到一种将特定站点“组合”在一起的方法。我知道“ Multi-Network”插件,但是我怀疑这是否是最好的方法吗?此处的关键是允许特定用户在其自己的子网内添加/编辑站点。

2)这是此帖子的关键问题...我想知道最好的方法,该方法可以使我从该站点的“子网络”中实质上查询帖子。因此,例如,如果此子网中有10个站点,并且每个站点都在名为“新闻”的自定义帖子类型中创建了帖子,那么我希望能够显示10个集合中的10个最新发布的帖子网站。

注意:我需要能够创建多个子网的能力,这又意味着对最新发布的“新闻”的查询只能显示属于正确组的帖子。

最终-我确实意识到存在解决此类问题的解决方案,但是我正在寻找这两种情况下需要最少数据库负载/查询的最佳方法。我也非常想通过我的functions.php文件中的代码来执行此操作,而不是安装会产生额外膨胀的插件。

我非常乐意接受任何建议,也欢迎您给予任何答复。

Answers:


7

我知道您说过您不想安装插件,但这正是您在这种情况下想要做的。将代码放置在主题functions.php文件中需要您在子网中的所有站点上使用同一主题,或者维护同一文件的多个副本。另一方面,您可以为网络创建一个简单的插件来封装功能,然后在网络上激活它,并立即使该功能仅需维护一个文件。实际上,这会比根据您的文件产生更少的膨胀functions.php

这里要记住的事情是,您要么需要遍历网络上的每个站点来查找您的帖子,要么执行自定义查询。我之所以选择第二个例程,是因为它虽然有点复杂,但它是单个查询,而不是每个博客的不同查询。

基本上...您需要执行以下操作:

  1. 获取网络/子网中所有博客ID的列表。如果使用香草安装,可以在wp_blogs表中找到。只需执行一个简单的SELECT查询即可加载数组,然后可以循环将每个博客添加到主查询中。
  2. 创建一个将每个博客添加到大型查询的循环。您需要将JOIN表放在一起,并根据blog_id(from wp_blogs),post_id(from wp_BLOG_posts)和自定义分类法进行搜索。

就像我说的那样,这不是一个简单的解决方案(SQL语句将非常复杂,并且我现在没有时间来破解它),但是它将是一个完成所有工作的语句。

或者...

  1. 获取博客ID的列表,并将其存储在数组中。
  2. 遍历数组,查询网络中的每个博客,然后将匹配项(具有特定分类术语的帖子)附加到单独的数组中。

使用替代方法,您将必须为网络中的每个博客运行单独的查询。如果您的网络是10到20个站点,那么这不是问题。如果您的网络是200-500个站点,则可能会出现一些性能问题。

同样,如果可能的话,您应该缓存查询结果。如果要在多个页面加载中运行该查询(即,用于在网络上共享的侧边栏小部件),则只希望在有新数据要获取时运行查询。否则,请提供缓存的结果,以免降低网络速度。


感谢您的答复。我喜欢您通过自定义sql查询执行此操作的想法,因为我假设这样做会减少负载。我希望的是,您可以向我展示创建这些子网所使用的插件,这些插件可以具有与之关联的站点,并希望在您有空的时候使用sql查询来自动查询其中的所有帖子。网站分配了子网。非常感谢您的
宝贵

3
如果可能的话,请更新
NetConstructor.com 2010年

1

我有一个类似的问题。我需要获取所有网络站点上按评论排序的帖子列表(以显示最受欢迎的帖子)。这是我使用的功能。

其基础是,它首先获取网络中所有博客ID的列表。然后,它构建一个大的单个查询(使用UNION合并所有行,而不需要难看的JOIN),该查询将获得包含blog_id,ID和comment_count列的结果。然后,我使用get_blog_post()获取每个帖子的详细信息。

您可以在不同的地方使用一些调试行来查看正在发生的事情。

function txx_top_posts_mu( $howMany = 10 ) {
global $wpdb;
global $table_prefix;

// get an array of the table names that our posts will be in
// we do this by first getting all of our blog ids and then forming the name of the 
// table and putting it into an array
$rows = $wpdb->get_results( "SELECT blog_id from $wpdb->blogs WHERE
    public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" );
if ( $rows ) :
    $blogPostTableNames = array();
    foreach ( $rows as $row ) :
        $blogPostTableNames[$row->blog_id] = $wpdb->get_blog_prefix( $row->blog_id ) . 'posts';
    endforeach;
    //print_r($blogPostTableNames);

    // now we need to do a query to get all the posts from all our blogs
    // ordered by the number of comments and with limits applied
    if ( count( $blogPostTableNames ) > 0 ) :
        $query = '';
        $i = 0;
        foreach ( $blogPostTableNames as $blogId => $tableName ) :
            if ( $i > 0 ) :
                $query.= ' UNION ';
            endif;
            $query.= " SELECT ID, comment_count, $blogId as `blog_id` FROM $tableName ";
            $i++;
        endforeach;
        $query.= " ORDER BY comment_count DESC LIMIT 0,$howMany;";
        //echo $query;
        $rows = $wpdb->get_results( $query );

        // now we need to get each of our posts into an array and return them
        if ( $rows ) :
            $posts = array();
            foreach ( $rows as $row ) :
                $posts[] = get_blog_post( $row->blog_id, $row->ID );
            endforeach;
            //print_r($posts);
            return $posts;
        endif;
    endif;
endif;
return false;

}


-1

您肯定需要一个多站点网络插件。当前有3种可供选择:两种已付费,一种免费。

从那里,您可以使用站点范围标签插件之类的东西将帖子发布到每个网络中的主博客。

这些都不能(或应该)从主题的功能文件中完成。


您指的是付费的?
NetConstructor.com 2010年


1
并付费:(我的)wpebooks.com/networks
andrea_r 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.