Abonnenten für Beiträge

Betrachten Sie jeden Beitrag als Gesprächsthema und kommentieren Sie eine Konversation. Für jetzt ist es in Ordnung. Ich habe einen Posttyp namens conversation erstellt. Jetzt möchte ich alle Unterhaltungen auflisten, in denen sich ein Benutzer befindet.

Wie kann ich WordPress für diese functionalität erweitern? In meiner Idee war es, eine neue Tabelle namens wp_posts_users mit user_id und conv_id zu erstellen. Gibt es dafür Best Practices?

Mein letztes Ziel ist es, auf der Benutzerseite alle Unterhaltungen aufzulisten, in denen er sich befindet.

Solutions Collecting From Web of "Abonnenten für Beiträge"

Wenn Sie unter “Alle Konversationen, in denen sich ein Benutzer befindet” alle Konversationen verstehen, für die ein Benutzer kommentiert hat, brauchen Sie keine zusätzliche Tabelle, sondern nur einen SQL, um alle CPT-Beiträge zu erhalten, an denen ein Benutzer kommentiert hat.

Hier eine function, die den Trick machen sollte:

 /** * Get posts (of a given CPT) an user has commented * * @param int|object|void $user User id or object to search. Void to use current user * @param string $cpt Post type to get * @return array|bool Posts array or FALSE if used bad arguments */ function get_user_conversations( $user = NULL, $cpt = 'conversation' ) { if ( empty( $user ) ) { $user = get_current_user_id(); } if ( is_object( $user ) && isset( $user->ID ) ) { $user = $user->ID; } if ( ! is_numeric( $user ) || (int) $user < = 0 || ! post_type_exists( $cpt ) ) { return FALSE; } global $wpdb; $conv = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} p INNER JOIN {$wpdb->comments} c ON p.ID = c.comment_post_ID WHERE p.post_type = %s AND p.post_status = 'publish' AND c.user_id = %d GROUP BY p.ID ORDER BY p.post_date DESC", $cpt, $user ) ); return empty( $conv ) ? array() : array_map( 'get_post', $conv ); } 

Verwendung

Sie können die function verwenden, indem Sie sie als erstes Argument übergeben:

  • eine Benutzer-ID oder
  • ein Verwendungsobjekt, oder
  • nichts (oder irgendein falscher Wert) in diesem Fall wird der aktuelle Benutzer verwendet

Das zweite Argument ist der CPT-Slug, “Konversation” standardmäßig.

Beispiele:

 /* via user id */ get_user_conversations( 1 ); /* via user object, and using a different post type slug */ $user = new WP_User( 1 ); get_user_conversations( $user, 'myapp_conversation' ); /* via current user */ get_user_conversations(); 

Rückgabewerte

function kann zurückgeben:

  • Array von WP_Post Objekten mit dem Konversationsposttyp, den der angegebene Benutzer kommentiert hat
  • ein leeres Array, wenn der angegebene Benutzer keinen Beitrag kommentiert hat
  • FALSE wenn ein nicht vorhandener Benutzer oder ein ungültiger Wert oder ein nicht registrierter Posttyp an die function übergeben wird oder wenn nichts übergeben wird und kein Benutzer angemeldet ist.

Gotchas

Damit die function funktioniert, müssen Sie Kommentare nur von registrierten Benutzern akzeptieren. Wenn Sie Kommentare von nicht angemeldeten Besuchern akzeptieren, können Sie die function ändern, um nach Benutzer-E-Mails zu suchen. In der Hoffnung, dass Ihre Besucher immer dieselbe E-Mail-Adresse eingeben Tippe es gut.

Beachten Sie auch, dass die function den Kommentarstatus nicht berücksichtigt. Selbst wenn ein Benutzer nicht genehmigte Kommentare hat, werden die Konversationen, in denen diese Kommentare verbleiben, ebenfalls zurückgegeben.

Vorgeschlagene Verbesserungen

Versuchen Sie, eine Art Cache zu implementieren: Führen Sie die SQL-Abfrage nicht erneut aus, wenn sie bereits ausgeführt wurde. Natürlich sollte ein Kommentar eines Benutzers den Cache ungültig machen.