使用wp_get_ites对多站点网络中的站点列表进行排序

时间:2016-06-30 作者:Morgan

我有一个循环,可以将我的多站点网络中的所有站点拉入,并循环通过它们来获取位于其ACF选项中的变量。下面是我正在使用的代码的摘录:

    $stageurl = array();
    $args = array(
        \'public\'     => true,
        \'limit\'      => 500
    );

    $sites = wp_get_sites($args);

    foreach ($sites as $site) {
        switch_to_blog($site[\'blog_id\']);
        $stage = get_field(\'stage\', \'option\');
        if (isset($stage)) {
            $stageurl[] = $site[\'domain\'];
        }
        restore_current_blog();
    }

    foreach ($stageurl as $i => $stages) {
        ...
    }
使用wp\\u get\\u站点,默认情况下站点是如何排序的?

理想情况下,我希望在将网站添加到我的foreach循环之前,按创建日期对网站进行排序。是否可以找到一个网络站点的创建日期并使用它对我的$stageurl数组进行排序?

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

使用get_sites() 在WP 4.6+

wp_get_sites() 将是deprecated 在WP 4.6中。

这个new replacement 是:

function get_sites( $args = array() ) {
        $query = new WP_Site_Query();

        return $query->query( $args );
}
非常类似于get_posts()WP_Query.

它支持各种有用的参数和过滤器。

下面是inline documentation says 关于orderby 输入参数:

站点状态或状态数组id

  • id
  • domain
  • path
  • network_id
  • last_updated
  • registered
  • domain_length
  • path_length
  • site__in
  • network__inORDER BY 条款:

    • falsenone
的默认值order 参数为DESC.

示例

以下是一个示例(未经测试),我们可以尝试按注册日期订购公共网站:

$mysites = get_sites( 
    [
        \'public\'  => 1,
        \'number\'  => 500,
        \'orderby\' => \'registered\',
        \'order\'   => \'DESC\',
    ]
);
最多返回500个站点。

由于@fostertime注意到public 参数不支持它。应该是这样的1true 在上面的示例中。

因此我提交了一张罚单here (#37937)支持public, archived, mature, spamdeleted 中的属性WP_Site_Query.

SO网友:fostertime

@birgire get\\u sites()示例是正确的方法。我本想加上这个作为评论,但没有足够的该死的声誉!

唯一的变化是public接受整数,而不是bool。看见https://developer.wordpress.org/reference/functions/get_sites/

$mysites = get_sites( 
    [
        \'public\'  => 1,
        \'number\'  => 500,
        \'orderby\' => \'id\',
        \'order\'   => \'ASC\',
    ]
);

SO网友:Morgan

我没能得到get_sites 正在工作,所以这里有一个解决方案wp_get_sites 直到新版本上发布更多文档。

wp_get_sites 返回有关子网站的大量数据,包括创建日期和上次修改日期。我将原来的$stageurl数组转换为多维数组,并将注册日期作为一个值添加。返回的默认值是字符串,因此我在调用它之前将其转换为时间。最后,我对它进行排序,首先显示最新的站点,然后在列表的末尾显示最旧的站点。

foreach ($sites as $site) {
    switch_to_blog($site[\'blog_id\']);
    $stage = get_field(\'stage\', \'option\');
    $registered = strtotime($site[\'registered\']);

    if (isset($stage)) {
        $stageurl[] = array(\'domain\' => $site[\'domain\'], \'registered\' => $registered);
    }

    restore_current_blog();
}

usort($stageurl, function($a, $b) {
    return $b[\'registered\'] - $a[\'registered\'];
});

SO网友:Lance Cleveland

以下是我的代码,用于运行WP 4.6中的站点和使用WP的站点<;4.6。如果你正在制作供公众使用的主题或插件,你无法控制他们使用的WordPress版本。

问题不仅在于get\\u站点和wp\\u get\\u站点之间的参数更改,还在于WordPress 4.6将返回值从数组更改为对象。因此,您需要以不同的方式引用元素。

在这里,我首先检查WP 4.6功能是否可用,并首先将其用于对象版本。然后,我继续检查4.6之前的wp\\U get\\U站点,并尝试下一步进行迭代。

        // WordPress 4.6
    //
    if ( function_exists( \'get_sites\' ) && class_exists( \'WP_Site_Query\' ) ) {
        $sites = get_sites();
        foreach ( $sites as $site ) {
            switch_to_blog( $site->blog_id );
            // do something
            restore_current_blog();
        }
        return;
    }

    // WordPress < 4.6
    //
    if ( function_exists( \'wp_get_sites\' ) ) {
        $sites = wp_get_sites();
        foreach ( $sites as $site ) {
            switch_to_blog( $site[\'blog_id\'] );
            // do something
            restore_current_blog();
        }
        return;
    }

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果