Liste von Websites aus einem Netzwerk mit mehreren Standorten mithilfe von wp_get_sites sortieren

Ich habe eine Schleife, die alle Websites in meinem Netzwerk mit mehreren Standorten einbindet und diese durchläuft, um Variablen in ihren ACF-Optionen zu finden. 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 mithilfe von wp_get_sites standardmäßig sortiert?

Idealerweise würde ich die Websites nach ihrem Erstellungsdatum sortieren, bevor sie sie zu meiner foreach-Schleife hinzufügen. Ist es möglich, das Erstellungsdatum einer Netzwerk-Site zu finden und damit mein $ stageurl-Array zu sortieren?

Solutions Collecting From Web of "Liste von Websites aus einem Netzwerk mit mehreren Standorten mithilfe von wp_get_sites sortieren"

Verwenden von get_sites() in WP 4.6+

Es sieht aus wie wp_get_sites() wird in WP 4.6 veraltet sein .

Der neue Ersatz ist:

 function get_sites( $args = array() ) { $query = new WP_Site_Query(); return $query->query( $args ); } 

Sehr ähnlich wie get_posts() und WP_Query .

Es unterstützt verschiedene nützliche Parameter und Filter.

Was die Inline-Dokumentation über den Eingabeparameter orderby :

  • Standortstatus oder Array von Status
  • Standard- 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
    • ein leeres Array
    • none

Der Standardwert des order ist DESC .

Beispiel

Hier ist ein Beispiel (ungetestet), wie wir versuchen können, öffentliche Websites nach dem Registrierungsdatum zu bestellen:

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

und Rückkehr an maximal 500 Standorten.

Aktualisieren

Danke an @fostertime, dass Sie den booleschen Wert des public Parameters bemerkt haben. Es wird nicht unterstützt. Im obigen Beispiel sollte dies nicht true .

Ich habe daher hier ein Ticket (# 37937) eingereicht, um boolesche Zeichenfolgen für die public , archived , mature , spam und deleted Attribute in WP_Site_Query .

@birgire get_sites () Beispiel ist der richtige Weg. Ich hätte das nur als Kommentar hinzugefügt, aber habe nicht genug Dang Reputation!

Die einzige Änderung ist, dass public eine ganze Zahl akzeptiert, keine bool. Siehe https://developer.wordpress.org/reference/functions/get_sites/

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

Hier ist mein Code zum Durchlaufen von Websites in WP 4.6 und Websites mit WP <4.6. Wenn Sie Designs oder Plugins für die allgemeine Ö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 WP 4.6-function verfügbar ist und verwende diese zuerst mit der Objektversion. Ich gehe dann zur Überprüfung vor 4.6 wp_get_sites und versuche, diese Iteration als nächstes zu machen.

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

Ich war nicht in der Lage, get_sites zum get_sites zu bringen, also hier ist eine Lösung, die wp_get_sites bis weitere Dokumentation auf der neuen Version veröffentlicht wird.

wp_get_sites gibt viele Daten über die wp_get_sites zurück, einschließlich der Erstellung und der letzten geänderten Daten. Ich habe mein ursprüngliches $ stageurl-Array in ein mehrdimensionales Array umgewandelt und das Registrierungsdatum als Wert hinzugefügt. Der zurückgegebene Standardwert war ein String, also habe ich ihn vor dem Aufruf in Zeit konvertiert. Schließlich habe ich es sortiert, um die neuesten Websites zuerst und die ältesten Websites 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']; }); 

Beachten Sie, dass die Antwort von Charleston (mit dem Code zur Überprüfung der functionen wp_get_sites und get_sites je nach Version) nicht ganz richtig funktioniert. Beide functionen sind in 4.7 noch verfügbar, so dass jede ‘if’ statement ausgeführt wird.

Dieser Code sollte in ein ‘if 4.6’ else ‘<4.6' geändert werden, damit der Code im Bereich 'do some' in jedem Block nicht zweimal ausgeführt wird.

(Als Antwort hinzugefügt, da mein Repräsentant keine Kommentare zu vorhandenen Antworten zulässt.)