web-dev-qa-db-de.com

Entfernen Sie den Avatar des gelöschten Benutzers aus der Liste

Problem

Hallo allerseits, ich habe ein kleines Problem. Ich habe eine Funktion, die die Avatare der Benutzer ausgibt, die mir folgen. Es funktioniert prima, aber wenn der Benutzer gelöscht wird, bleiben die Avatare als leeres Bildfeld sichtbar, und ein fehlerhafter Hyperlink fehlt dem Benutzernamen des Benutzers. Gibt es eine Möglichkeit, den gelöschten Benutzer-Avatar aus der Liste zu entfernen?

Funktion

function get_status_following($userid, $count = 0){

$followers = get_the_author_meta('following', $userid);

/** if no followers at the moment */
if( !is_array($followers)){
    $return = "";
} else {

    $return = '<ul class="widget_follow">' . "\n";
    foreach( $followers as $folow){

        $return .= "<li>";
            $return .= '<a href="' . get_author_posts_url($folow) . '" title="' . get_the_author_meta('display_name', $folow) . '">';
                if( get_the_author_meta( 'user_custom_avatar', $folow ) != "" ) {
                    $return .= '<img src="' . get_the_author_meta( 'user_custom_avatar', $folow ) . '" alt="" />';
                } else {
                    $return .= get_avatar( get_the_author_meta( 'user_email', $folow ), '40' );
                }
            $return .= '</a>';
        $return .= "<li>";

    }
    $return .= '</ul>' . "\n";
}

echo $return;

}

Ausgabe der Funktion in einer Seite

<?php printf( __('&nbsp;%1$s', 'bo'), count_following($curauth->ID) ); ?>
<?php get_status_following($curauth->ID); ?>

Vielen Dank für die Hilfe im Voraus

1
jimilesku

Wenn ein Benutzer sagt, dass Benutzer A gelöscht wurde, bereinigen Sie nicht alle Spuren dieses Benutzers.

Sie müssen nämlich in jeden Benutzer gehen, der A folgt, und ihn aus dessen Benutzer-Meta entfernen. Aus diesem Grund zeigt Ihre Funktion leere Benutzer an, da veraltete Informationen nicht mehr aktuell sind und sich auf Benutzer beziehen, die nicht mehr vorhanden sind

Sie möchten dies mit dem Hook deleted_user tun

// when a user is deleted, the deleted_user action is fired
// attach our example_cleanup function to this action/hook
add_action('deleted_user','example_cleanup');

// When the deleted_user action/hook/event is fired, this function will be called
function example_cleanup($user_id){
    // remove this user from the users following this user
}

Ich weiß nicht, ob Sie eine Liste von Benutzern haben, die einem Benutzer folgen. Andernfalls ist dieser Vorgang möglicherweise kostenintensiv, da Sie jeden einzelnen Benutzer durchlaufen und das Meta entfernen müssen, wenn es nicht weiter verfolgt wird der gelöschte Benutzer

hinweis: Ich würde es vermeiden, Sprachschlüsselwörter als Namen für Variablen zu verwenden, daher gibt es keine $function$foreach$return oder $class

Wie hätte ich das umgesetzt?

Im Moment haben Sie 2 Sätze duplizierter Daten. Sie haben ein Stück Meta, das sagt, dass A auf B folgt, und einige Daten, die sagen, dass B auf A folgt.

Anstatt also Benutzermeta zu verwenden, hätte ich stattdessen eine Benutzertaxonomie verwendet. Meine Benutzertaxonomie würde "folgend" heißen und jeder Begriff in der Taxonomie würde einen Benutzer darstellen.

Angenommen, ich habe den Benutzer "admin" und ich habe 5 Follower, Benutzer A, B, C, D und E. Jedem Benutzer würde in meiner Taxonomie der Begriff "admin" zugewiesen.

Ich hätte dann eine sehr einfache Möglichkeit zu erfassen, wer mir folgt und wem eine Person folgt. Um herauszufinden, wem ich folge, gebe ich einfach wp_get_object_terms meine Benutzer-ID und nicht eine Beitrags-ID ein. Um zu sehen, wer mir folgt, greife ich nach allen Objekten, die dem Begriff mit dem gleichen Namen wie ich zugewiesen sind.

Wie erstelle ich eine Benutzertaxonomie?

In diesem Artikel von Justin Tadlock erfahren Sie alles von der Benutzeroberfläche für Administratoren über die Registrierung der Taxonomie bis hin zu einer Frontend-Vorlage .

Um die zugehörigen Begriffe für diesen Benutzer zu erstellen oder zu löschen, müssen Sie sich in die Erstellung und Löschung von Benutzern einklinken. Ich würde empfehlen, den Anmeldenamen als Begriff zu verwenden, da er sich nicht ändert, wohingegen der Anzeigename bedeutet, dass Sie zusätzliche Arbeit leisten müssen.

Die Vorteile dieser Vorgehensweise:

  • Bereinigen ist so einfach wie Löschen eines Begriffs, kein Durchlaufen von Benutzern und Benutzer-Metas
  • 1 Datenelement zum Speichern von Followern/Followern, nicht 2
  • Es ist eine logischere Beziehung in der Datenbank zu folgen
  • Wenn Taxonomie-Abfragen schneller werden, werden auch Ihre schneller
  • Sie können die WordPress-Kern-APIs verwenden, um auf alle benötigten Daten zuzugreifen, anstatt Ihre eigenen Wrapper-Funktionen zu schreiben. Sie können diesen Teil an erfahrene Entwickler auslagern, die an WordPress selbst arbeiten, und so Zeit sparen
  • Es ist viel einfacher, Auflistungen oder Rankings derjenigen zu erstellen, die die meisten Follower haben, genauso wie wir die Kategorien mit den meisten Posts einstufen können
  • Mit einigem Aufwand können Sie Dinge wie Tag-Clouds nachrüsten, um Followern zu zeigen, wer am meisten visuell hat
  • Die meiste Administrationsoberfläche dafür ist sofort verfügbar

Der Nachteil ist, dass es mehr Wissen voraussetzt und mehr anfängliche Anstrengungen für diejenigen erfordert, die mit den APIs nicht vertraut sind

3
Tom J Nowell

Schnelle und schmutzige vorübergehende Korrektur, während Sie Ihre Designfunktion neu schreiben. Führen Sie eine get_user_by-Abfrage für foreach($followers as $follow) durch. Auf diese Weise drucken Sie nur vorhandene Benutzer, nicht gelöschte.

foreach( $followers as $folow){

    $existing_user = get_user_by('id', $folow);
    if($existing_user){ // you got a user

    $return .= "<li>";
        $return .= '<a href="' . get_author_posts_url($folow) . '" title="' . get_the_author_meta('display_name', $folow) . '">';
            if( get_the_author_meta( 'user_custom_avatar', $folow ) != "" ) {
                $return .= '<img src="' . get_the_author_meta( 'user_custom_avatar', $folow ) . '" alt="" />';
            } else {
                $return .= get_avatar( get_the_author_meta( 'user_email', $folow ), '40' );
            }
        $return .= '</a>';
    $return .= "<li>";

    }


}
1
ifdion