我意识到有几个问题在我所追求的解决方案周围跳舞,但我相信我正在寻找特定的东西。

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

1)我的目标是让WordPress以网络(多站点)模式运行,我正在尝试找出一种基本上“组”特定站点的方法。我知道“多网络”插件,但我质疑这是否是最佳方法?这里的关键是允许特定用户在自己的子网络中添加/编辑网站。

2)这是这篇文章的关键问题...我想知道最好的方法,这将使我可以从本网站的“子网络”中查询帖子。因此,例如,如果此子网络中有10个站点,并且每个网站都在称为“新闻”的自定义帖子类型中创建了帖子站点。

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

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

我对任何建议都非常开放,并感谢任何回应。

有帮助吗?

解决方案

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

要记住的事情是,您要么需要循环浏览网络上的每个站点以查找您的帖子,要么执行自定义查询。我选择第二个例程,因为尽管它更复杂,但它是一个查询,而不是每个博客的其他查询。

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

  1. 获取网络/子网络中所有博客ID的列表。如果使用香草安装,可以在 wp_blogs 桌子。只是做一个简单的 SELECT 查询以加载一个数组,然后您可以循环浏览每个博客中的主查询。
  2. 创建一个将每个博客添加到大查询中的循环。你需要 JOIN一起桌子并根据 blog_id (从 wp_blogs), post_id (从 wp_BLOG_posts),以及自定义分类学。

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

或者 ...

  1. 获取博客ID的列表并将其存储在数组中。
  2. 通过您的数组查询网络中的每个博客,并将匹配项(带有一定分类学术语的帖子)附加到单独的数组中。

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

另外,如果可能的话,您应该缓存查询的结果。如果它是在多个页面加载上运行的(即在网络上共享的侧边栏窗口小部件),则只需在有新数据时运行查询。否则,为缓存的结果提供服务,以免降低网络。

其他提示

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

依据是,它首先获取网络中所有博客ID的列表。然后,它构建了一个很大的单个查询(使用联合来组合所有行,而不需要丑陋的加入),该结果将获得包含列Blog_id,id和remand_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;

}

您绝对需要一个多站点网络插件。目前有三个可供选择:两个付款,一个免费。

从那里,您可以使用诸如Sitewide标签插件之类的内容将邮寄到每个网络中的主要博客。

这些都无法(或应该)从主题的函数文件中完成。

构建自定义的Google搜索引擎Google.com/cse指定您要搜索的所有网站

将其嵌入您的网站

许可以下: CC-BY-SA归因
scroll top