web-dev-qa-db-ja.com

Wp_get_sitesを使用してマルチサイトネットワークからサイトのリストをソートする

私は私のマルチサイトサイトネットワークのすべてのサイトを引き込み、それらの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_get_sitesを使用して、サイトはデフォルトでどのようにソートされますか?

理想的には、foreachループに追加する前に、サイトを作成日順に並べ替えます。ネットワークサイトの作成日を見つけて、それを使って私の$ stageurl配列をソートすることは可能ですか?

4
Morgan

WP 4.6+でget_sites()を使用する

WP 4.6ではwp_get_sites()deprecated になるようです。

新しい置き換え は次のとおりです。

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

        return $query->query( $args );
}

get_posts()WP_Queryと非常によく似ています。

さまざまな便利なパラメータとフィルタをサポートしています。

orderbyname__入力パラメータについての インラインドキュメントの説明 は次のとおりです。

  • サイトのステータスまたはステータスの配列。
  • デフォルトのidname__
  • 受け入れる:

    • idname__
    • domainname__
    • pathname__
    • network_id
    • last_updated
    • registeredname__
    • domain_length
    • path_length
    • site__in
    • network__in
  • ORDER BY句を無効にするには、以下も受け入れます。

    • falsename__
    • 空の配列
    • nonename__

ordername__パラメーターのデフォルトはDESCname__です。

以下は、 public sites by registration dateの順序付けを試みる例(未テスト)です。

$mysites = get_sites( 
    [
        'public'  => 1,
        'number'  => 500,
        'orderby' => 'registered',
        'order'   => 'DESC',
    ]
);

そして最大500のサイトに戻ります。

更新

publicname__パラメーターの ブール値 値に注目してくれた@fostertimeに感謝します。サポートされていません。上記の例ではtruename__ではなく1であるべきです。

そのため、WP_Site_Querypublicname__、archivedname__、maturename__、spamname__、およびdeletedname__属性の boolean 文字列をサポートするためにチケット here (#37937)を提出しました。

2
birgire

@ birgire get_sites()の例が正しい方法です。これをコメントとして追加しただけですが、十分な評判は得られません。

唯一の変更は、publicはブール値ではなく整数値を受け入れることです。 https://developer.wordpress.org/reference/functions/get_sites/ を参照してください。

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

私は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'];
});
3
Morgan

これは、WP 4.6のサイトおよびWP <4.6を使用しているサイトを実行するための私のコードです。一般の人々が使用するテーマまたはプラグインを作成している場合、それらが使用しているWordPressのバージョンを管理することはできません。

問題は、get_sitesとwp_get_sitesの間のパラメーターの変更だけでなく、WordPress 4.6が戻り値を配列からオブジェクトに変更したことです。したがって、あなたはあなたの要素を異なった方法で参照する必要があります。

ここで私は最初にWP 4.6関数が利用可能であることを確認し、そして最初にオブジェクトバージョンでそれを使用します。それから、4.6以前のwp_get_sitesのチェックに移り、次にその反復を試みます。

        // 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;
    }
3
Lance Cleveland