Ich habe eine Schleife, die alle Standorte in meinem Standortnetzwerk mit mehreren Standorten abruft und sie durchläuft, um Variablen zu ermitteln, die sich in ihren ACF-Optionen befinden. Hier ist ein Auszug aus dem Code, den ich verwende:
$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) {
...
}
Wie werden Websites unter Verwendung von wp_get_sites standardmäßig sortiert?
Im Idealfall möchte ich Websites nach Erstellungsdatum sortieren, bevor ich sie meiner foreach-Schleife hinzufüge. Ist es möglich, das Erstellungsdatum einer Netzwerksite zu ermitteln und damit mein $ stageurl-Array zu sortieren?
get_sites()
in WP 4.6+Es sieht so aus, als würde wp_get_sites()
veraltet in WP 4.6 sein.
Der neue Ersatz ist:
function get_sites( $args = array() ) {
$query = new WP_Site_Query();
return $query->query( $args );
}
Sehr ähnlich zu get_posts()
und WP_Query
.
Es unterstützt verschiedene nützliche Parameter und Filter.
Folgendes steht in der Inline-Dokumentation zum Eingabeparameter orderby
:
id
Akzeptiert:
id
domain
path
network_id
last_updated
registered
domain_length
path_length
site__in
network__in
Akzeptiert außerdem Folgendes, um die ORDER BY
-Klausel zu deaktivieren:
false
none
Der Standardwert für den Parameter order
ist DESC
.
Hier ist ein Beispiel (ungetestet), wie wir versuchen könnten, public sites nach registration date zu bestellen:
$mysites = get_sites(
[
'public' => 1,
'number' => 500,
'orderby' => 'registered',
'order' => 'DESC',
]
);
und Rückkehr an maximal 500 Standorten.
Vielen Dank an @fostertime, dass Sie bemerkt haben, dass der Wert boolean des Parameters public
ist. Es wird nicht unterstützt. Es sollte im obigen Beispiel 1
und nicht true
sein.
Ich habe daher ein Ticket hier (# 37937) eingereicht, um boolesche Zeichenfolgen für die Attribute public
, archived
, mature
, spam
und deleted
in WP_Site_Query
zu unterstützen.
@ Birgire get_sites () Beispiel ist der richtige Weg. Ich hätte das nur als Kommentar hinzugefügt, aber ich habe nicht genug schlechten Ruf!
Die einzige Änderung besteht darin, dass public eine Ganzzahl und keinen Bool akzeptiert. Siehe https://developer.wordpress.org/reference/functions/get_sites/
$mysites = get_sites(
[
'public' => 1,
'number' => 500,
'orderby' => 'id',
'order' => 'ASC',
]
);
Ich konnte get_sites
nicht zum Laufen bringen, daher hier eine Lösung mit wp_get_sites
, bis weitere Dokumentationen zur neuen Version veröffentlicht wurden.
wp_get_sites
gibt viele Daten über die Unterwebsite zurück, einschließlich Erstellungsdatum und Datum der letzten Änderung. Ich habe mein ursprüngliches $ stageurl-Array in ein mehrdimensionales Array umgewandelt und das Registrierungsdatum als Wert hinzugefügt. Der zurückgegebene Standardwert war eine Zeichenfolge, daher habe ich ihn vor dem Aufrufen in die Uhrzeit konvertiert. Schließlich sortierte ich es, um die neuesten Sites zuerst und die ältesten Sites am Ende der Liste anzuzeigen.
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'];
});
Hier ist mein Code zum Durchlaufen von Sites in WP 4.6 und Sites mit WP <4.6. Wenn Sie Themen oder Plugins für die breite Öffentlichkeit erstellen, haben Sie keine Kontrolle darüber, welche Version von WordPress sie verwenden.
Das Problem sind nicht nur die Parameteränderungen zwischen get_sites und wp_get_sites, sondern auch, dass WordPress 4.6 den Rückgabewert von einem Array in ein Objekt geändert hat. Daher müssen Sie Ihre Elemente anders referenzieren.
Hier überprüfe ich zuerst, ob die Funktion WP 4.6 verfügbar ist und verwende diese zuerst mit der Objektversion. Anschließend überprüfe ich die wp_get_sites vor 4.6 und versuche, diese Iteration als nächstes durchzuführen.
// 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;
}