web-dev-qa-db-fra.com

Liste des sites d'un réseau multisite avec l'aide de wp_get_sites

J'ai une boucle qui parcourt tous les sites de mon réseau de sites multisites et les boucle pour obtenir des variables situées dans leurs options ACF. Voici un extrait du code que j'utilise:

    $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) {
        ...
    }

Avec wp_get_sites, comment les sites sont-ils triés par défaut?

Idéalement, j'aimerais trier les sites en fonction de leur date de création avant de les ajouter à ma boucle foreach. Est-il possible de trouver la date de création d'un site réseau et de l'utiliser pour trier mon tableau $ stageurl?

4
Morgan

Utilisation de get_sites() dans WP 4.6+

Il semble que wp_get_sites() sera obsolète in WP 4.6.

Le nouveau remplacement est:

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

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

Très similaire à get_posts() et WP_Query.

Il supporte divers paramètres et filtres utiles.

Voici ce que dit la documentation intégrée à propos du paramètre d'entrée orderby:

  • Statut du site ou tableau des statuts.
  • Valeur par défaut id
  • Accepte:

    • id
    • domain
    • path
    • network_id
    • last_updated
    • registered
    • domain_length
    • path_length
    • site__in
    • network__in
  • Accepte également les éléments suivants pour désactiver la clause ORDER BY:

    • false
    • un tableau vide
    • none

La valeur par défaut du paramètre order est DESC.

Exemple

Voici un exemple (non testé) sur la façon dont nous pourrions essayer de commander public sites par registration date:

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

et revenant au maximum à 500 sites.

Mettre à jour

Merci à @fostertime pour avoir remarqué que la valeur boolean du paramètre public. Ce n'est pas pris en charge. Ce devrait être 1 pas true dans l'exemple ci-dessus.

J'ai donc classé un ticket ici (# 37937) pour supporter les chaînes boolean pour les attributs public, archived, mature, spam et deleted dans WP_Site_Query.

2
birgire

@birgire get_sites () exemple est la bonne façon. J'aurais simplement ajouté ceci comme commentaire, mais je n'ai pas assez de réputation!

Le seul changement, c'est que public accepte un entier, pas un bool. Voir https://developer.wordpress.org/reference/functions/get_sites/

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

Je n'ai pas réussi à faire fonctionner get_sites. Voici donc une solution utilisant wp_get_sites jusqu'à la publication de documentation supplémentaire sur la nouvelle version.

wp_get_sites renvoie beaucoup de données sur le sous-site, y compris les dates de création et de dernière modification. J'ai transformé mon tableau $ stageurl d'origine en un tableau multidimensionnel et ajouté la date d'enregistrement en tant que valeur. La valeur par défaut renvoyée était une chaîne, je l'ai donc convertie en heure avant de l'appeler. Enfin, je l'ai trié pour afficher les sites les plus récents et les sites les plus anciens à la fin de la liste.

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

Voici mon code pour parcourir les sites dans WP 4.6 et les sites utilisant WP <4.6. Si vous produisez des thèmes ou des plug-ins destinés au grand public, vous n'avez aucun contrôle sur la version de WordPress qu'ils utilisent.

Le problème ne réside pas uniquement dans les changements de paramètres entre get_sites et wp_get_sites, mais également dans le fait que WordPress 4.6 a modifié la valeur de retour d'un tableau en objet. Par conséquent, vous devez référencer vos éléments différemment.

Ici, je vérifie d’abord que la fonction WP 4.6 est disponible et l’utilise tout d’abord avec la version de l’objet. Je passe ensuite à vérifier que wp_get_sites avant la version 4.6 et essayer de faire cette itération ensuite.

        // 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