it-swarm.com.de

Sortieren einer Liste von Sites aus einem Netzwerk mit mehreren Standorten mithilfe von wp_get_sites

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?

4
Morgan

Verwenden von 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:

  • Site-Status oder eine Reihe 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 für den Parameter order ist DESC.

Beispiel

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.

Aktualisieren

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.

2
birgire

@ 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',
    ]
);
6
fostertime

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

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