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?
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
:
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
none
La valeur par défaut du paramètre order
est DESC
.
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.
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
.
@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',
]
);
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'];
});
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;
}