WP_User_Query und nicht eindeutige Usermeta-Daten


8

Wir haben ein Problem mit einem WP-Plugin, das wir geschrieben und verwaltet haben - Benutzerdaten exportieren

Ein Benutzer hat ein Problem gemeldet, bei dem nicht eindeutige Benutzer-Metadatensätze nicht korrekt zurückgegeben werden - hier

Im Plugin exportieren wir die vom Benutzer ausgewählten Usermeta-Daten - mit get_users (), das wiederum WP_User_Query verwendet:

Wir übergeben get_users einige einfache Argumente:

// build argument array ##
$args = array(
      'fields'    => 'all',
      'role'      => sanitize_text_field( $_POST['role'] )
);

Wenn wir ein zurückgegebenes WP_User-Objekt untersuchen, werden die Usermeta-Felder nicht zurückgegeben - zum Beispiel (Objektdaten werden aus Platzgründen reduziert):

Array
(
[0] => WP_User Object
    (
        [data] => stdClass Object
            (
                [ID] => 1267
                [user_login] => user@email.com
                ...
            )

        [ID] => 1267
        ...
    )

[1]...

Wir haben versucht, die Argumente für get_users für den Parameter "fields" von "all" in "all_with_meta" zu ändern. Dies scheint jedoch die ursprünglich zurückgegebenen Daten nicht zu ändern.

An dem Punkt, an dem wir diese Benutzermetadatenzeilen exportieren, durchlaufen wir zuerst das Array der WP_User-Objekte und geben dann die einzelnen Usermeta-Felddaten wieder ($ field stammt aus einem Array von $ -Feldern, die sich außerhalb der $ users-Schleife befinden):

// build row values for each user ##
foreach ( $users as $user ) {

    // grab value from $user object ##
    $value = $user->{$field};

}

Die Felddaten werden auf magische Weise zum $ user-Objekt hinzugefügt, obwohl dies in den ursprünglich zurückgegebenen Objektdaten nicht angezeigt wird. Wir haben jedoch keine Kontrolle darüber, ob für jedes Usermeta-Feld ein einzelnes oder ein Array von Werten zurückgegeben wird.

Da die Daten automatisch zurückgegeben werden, steuern wir nicht die ausgewählte Methode, die wir könnten, wenn wir get_user_meta direkt verwenden würden (aber wir hätten immer noch das Problem, nicht zu wissen, dass die gespeicherten Daten eindeutig sind oder nicht, ohne zusätzliche auszuführen Anfragen - was bei großen Exporten kostspielig wäre).

Ich schreibe dies alles auf, um zu versuchen, anderen das Problem zu erklären, und um uns dabei zu helfen, nach Antworten zu suchen und dieses Problem zu lösen.

Aktualisieren

Wir haben einen Testfix für Github mithilfe einer Methode gesendet, mit der nach nicht eindeutigen Usermeta-Schlüsseln gesucht und ein Array zurückgegeben wird, falls mehr als ein übereinstimmender Schlüssel vorhanden ist

Antworten:


3

Die Lösung, mit der wir uns letztendlich entschieden haben, verwendet einen einzigen Aufruf, um get_user_meta nur die $ user_id zu übergeben. Auf diese Weise werden alle Benutzerdaten in einer einzigen Abfrage zurückgegeben, wodurch die DB beim Export großer Benutzerdaten stark belastet wird.

Anschließend führen wir eine Reihe von Überprüfungen der zurückgegebenen Daten durch - einschließlich:

  • is_serialized ($ value) - um zu überprüfen, ob die Daten in einer serialisierten Form zurückgegeben wurden (wir versuchen dann, sie zu unserialisieren - in einigen Fällen schlägt dies fehl, wenn Daten in einer falschen Form gespeichert wurden).
  • is_array ($ value) - um zu überprüfen, ob die zurückgegebenen Daten tatsächlich ein Array sind

Wenn wir feststellen, dass die Daten in einem Array zurückgegeben werden, implodieren wir das Array rekursiv, bis wir eine Datenfolge haben, die zur Exportdatei zurückkehren kann.

Ich habe keinen spezifischen Code in diese Antwort aufgenommen, sondern mit den gehosteten Github-Dateien verknüpft (ich weiß, dass dies nicht ideal für die Zukunft ist, aber die Teile, die sich auf diese Antwort beziehen, sind im Code verteilt).

Die Exporte laufen sauber und ersticken nicht - wir werden das aktualisierte Plugin nächste Woche veröffentlichen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.