Kommentar in der Benutzerprofilseite?

9

Ich versuche, ein benutzerdefiniertes Benutzerprofil mit der Anleitung dieses Tutorials zu erstellen : So erstellen Sie eine WordPress-Profilseite

Ich habe es erfolgreich in mein Thema implementiert, alles funktioniert gut. Was ich jetzt erreichen möchte, ist, die Kommentarvorlage auf der Benutzerprofilseite abzurufen, auf der andere registrierte Benutzer Kommentare auf seiner Profilseite veröffentlichen können, ähnlich wie Facebook Wall oder last.fm Shoutbox.

Ich versuche es so:

Auf der Autorenseite wurde mir diese Zeile hinzugefügt:

<?php comments_template(); ?>

Aber es wird nicht angezeigt. Dann habe ich es so versucht: Holen Sie sich WordPress-Kommentare außerhalb von WordPress

Es fügt die Kommentarvorlage in Ordnung hinzu, funktioniert aber nicht. Wenn Sie auf die Schaltfläche "Senden" klicken, wird auf eine leere Seite weitergeleitet.

Ich denke, das Ziel ist nicht leicht zu erreichen. Es erfordert eine benutzerdefinierte Datenbankerstellung für jeden Benutzer, um die Kommentare zu speichern, da das Kommentarsystem nur Kommentare einer bestimmten Seite oder eines bestimmten Beitrags speichert, nicht für eine andere Seite wie ein Archiv oder eine Autorenseite.

Wenn mir jemand die richtige Richtung zeigen kann, werde ich für immer dankbar sein.

Danke Towfiq I.

Towfiq
quelle

Antworten:

13

Hallo @Towfiq :

Kommentare beziehen sich in der Datenbank auf Beiträge. Sie müssen viel arbeiten, um Kommentare zu erhalten, die sich auf Benutzer beziehen.

Haben Sie darüber nachgedacht, einen benutzerdefinierten Beitragstyp für Benutzer zu erstellen und dann entweder ein user_metaFeld zum Speichern des post_idoder ein postmetaFeld zum Speichern des user_idoder beides zu verwenden? Wenn Sie das tun würden, würden Sie die Kommentare ohne Anstrengung erhalten.

AKTUALISIEREN

Was folgt, ist Code, der nach unserer Diskussion in den Kommentaren entwickelt wurde.

Ich wollte schon lange so etwas schreiben, aber Ihre Frage hat mich dazu gebracht, es zu einer Priorität zu machen. Ich habe einen 'towfiq-person'benutzerdefinierten Beitragstyp für Sie erstellt und ihn so eingerichtet, dass bei jedem Hinzufügen eines Benutzers automatisch ein Personenbeitrag hinzugefügt wird. Dabei wird die E-Mail-Adresse als Zuordnungsschlüssel in einem benutzerdefinierten Beitragsfeld mit dem Namen verwendet '_email'.

Außerdem wird ein Benutzer mit einer geeigneten E-Mail-Adresse für den Personenbeitrag verknüpft, wenn ein Benutzer mit derselben E-Mail-Adresse wie eine vorhandene Person hinzugefügt oder aktualisiert wird (dies kann eine gute Idee sein oder auch nicht). Außerdem wird der Benutzer mit Person und Person verglichen Person mit Benutzern mit postmeta und usermeta Feldern '_user_id'und '_person_id'ist.

Dies sind natürlich Geschäftsregeln, die ich implementiert habe, aber sie stellen sich möglicherweise als nicht für Ihren Anwendungsfall geeignet heraus. In diesem Fall müssen Sie sie möglicherweise ändern. Möglicherweise finden Sie auch Möglichkeiten, wie WordPress es diesen beiden ermöglicht, nicht mehr synchron zu sein, aber es ist schwer, dies ohne umfassende Tests zu wissen. Wenn Sie Probleme finden, können Sie jederzeit versuchen, die Logik zu aktualisieren, um sie zu beheben.

Sie können den folgenden Code in die functions.phpDatei Ihres Themas kopieren :

class Towfiq_Person {
  static function on_load() {
    add_action('init',array(__CLASS__,'init'));
    add_action('wp_insert_post',array(__CLASS__,'wp_insert_post'),10,2);
    add_action('profile_update',array(__CLASS__,'profile_update'),10,2);
    add_action('user_register',array(__CLASS__,'profile_update'));
    add_filter('author_link',array(__CLASS__,'author_link'),10,2);
    add_filter('get_the_author_url',array(__CLASS__,'author_link'),10,2);
  }
  static function init() {
    register_post_type('towfiq-person',
      array(
        'labels'          => array('name'=>'People','singular_name'=>'Person'),
        'public'          => true,
        'show_ui'         => true,
        'rewrite'         => array('slug' => 'people'),
        'hierarchical'    => false,
        //'supports'        => array('title','editor','custom-fields'),
      )
    );
  }
  static function get_email_key() {
    return apply_filters( 'person_email_key', '_email' );
  }
  static function profile_update($user_id,$old_user_data=false) {
    global $wpdb;
    $is_new_person = false;
    $user = get_userdata($user_id);
    $user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email);
    $email_key = self::get_email_key();
    $person_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' AND meta_value='%s'",$email_key,$user_email));
    if (!is_numeric($person_id)) {
      $person_id = $is_new_person = wp_insert_post(array(
        'post_type' => 'towfiq-person',
        'post_status' => 'publish',   // Maybe this should be pending or draft?
        'post_title' => $user->display_name,
      ));
    }
    update_user_meta($user_id,'_person_id',$person_id);
    update_post_meta($person_id,'_user_id',$user_id);
    if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data->user_email)) {
      update_post_meta($person_id,$email_key,$user->user_email);
    }
  }
  static function wp_insert_post($person_id,$person) {
    if ($person->post_type=='towfiq-person') {
      $email = get_post_meta($person_id,self::get_email_key(),true);
      if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $user = get_user_by('email',$email);
        if ($user) { // Associate the user IF there is an user with the same email address
          update_user_meta($user->ID,'_person_id',$person_id);
          update_post_meta($person_id,'_user_id',$user->ID);
        } else {
          delete_post_meta($person_id,'_user_id');
        }
      }
    }
  }
  static function get_user_id($person_id) {
    return get_user_meta($user_id,'_user_id',true);
  }
  static function get_user($person_id) {
    $user_id = self::get_user_id($person_id);
    return get_userdata($user_id);
  }
  static function get_person_id($user_id) {
    return get_user_meta($user_id,'_person_id',true);
  }
  static function get_person($user_id) {
    $person_id = self::get_person_id($user_id);
    return get_post($person_id);
  }
  static function author_link($permalink, $user_id) {
    $author_id = get_user_meta($user_id,'_person_id',true);
    if ($author_id) // If an associate is found, use it
      $permalink = get_post_permalink($author_id);
    return $permalink;
  }
}
Towfiq_Person::on_load();

Wenn Sie Klarheit darüber benötigen, was ich getan habe und warum, fragen Sie einfach in den Kommentaren.

MikeSchinkel
quelle
Sie schlagen also vor, einen benutzerdefinierten Beitragstyp zu erstellen und die Schleife auf der Autorenseite zu implementieren. Und dann das Kommentarformular aufstellen, damit andere Benutzer Kommentare zu diesem leeren Beitrag posten können? Auf jeder Profilseite des Benutzers werden jedoch dieselben Kommentare angezeigt. Dies kann vermieden werden, indem eine Funktion erstellt wird, die automatisch einen benutzerdefinierten Beitrag mit dem Titel des Benutzernamens mit wp_insert_post () erstellt, wenn ein Benutzer registriert ist. Der Autor des Beitrags könnte der Benutzer sein. Wenn wir also die Postschleife ziehen, stellen wir sicher, dass der Post mit dem Autor = Benutzer angezeigt wird. Bin ich in die richtige Richtung? Mache ich es kompliziert?
Towfiq
@Towfiq: In der Tat erstellen Sie pro Benutzer einen Beitrag Ihres authorbenutzerdefinierten Beitragstyps. Anschließend taxonomy-author.phpfragen Sie in der Vorlagendatei auch nach allen Posts des aktuellen Autors und "fälschen" so Ihre Autorenseite. Sie können es auch umgekehrt machen (verwenden Sie die Autorenvorlage und fügen Sie den benutzerdefinierten Beitrag hinzu), aber dann müssen Sie das Kommentarformular austricksen, um die richtige Beitrags-ID zu verwenden.
Jan Fabry
Vielen Dank für Ihre Antwort Fabry. Ich habe nicht sehr wenig Wissen über Taxonomie. Ich habe versucht, etwas aus dieser Seite herauszuholen : codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Aber fehlgeschlagen. Kannst du mir sagen, was taxonomy-author.php ist und was es tun wird? und wenn ich es anders herum versuche, hast du eine Idee, die Post-ID auszutricksen? -Danke
Towfiq
@Towfiq: Mein Fehler sollte es nicht sein taxonomy-author.php, aber single-author.php. Sie erstellen keine benutzerdefinierte Taxonomie, sondern einen benutzerdefinierten Beitragstyp. Dies single-author.phpist die Vorlagendatei, mit der ein einzelner Beitrag des authorbenutzerdefinierten Beitragstyps angezeigt wird . Ich schlage vor, Sie gehen diesen Weg, es ist der einfachste (Sie können auch paging ( /page/2/) verwenden, wenn Sie viele Beiträge von diesem Autor haben).
Jan Fabry
1
@Towfiq? Wie habe ich das vermisst, als ich meinen Code überprüft habe? Hmm, sorry. Wie auch immer, es sollte hilfreich sein, wenn Sie mir sagen, wo der Fehler aufgetreten ist. :) Ich bin auch überrascht, dass es an meinem Ende ohne Fehler funktioniert hat. Übrigens habe ich vorher einen anderen Hook verwendet, also war das Restcode. Folgendes sollte das Problem beheben : if ($person->post_type=='towfiq-person') {. Lass es mich wissen ...
MikeSchinkel
0

Fügen Sie einfach eine benutzerdefinierte Post-Typ-Schleife in author.php hinzu und verwenden Sie das Kommentarformular dieses benutzerdefinierten Posts. Ich habe es schon oft gemacht und es funktioniert großartig.

<?php /* Display the author's comments from the custom post type (AAA) */ ?>
<?php
$authorid = get_the_author_meta( ID, $userID );
$args=array('author' => $authorid,'post_type' => 'AAA', 'numberposts' => -1);
$cquery=new WP_Query($args);
if($cquery->have_posts()):
while($cquery->have_posts()):
$cquery->the_post();
?>          
<div class="comments-area">
    <?php comments_template(); ?>
</div>
<?
    endwhile;
        wp_reset_postdata();
    endif;
?>

https://github.com/pjeaje/code-snippets/blob/gh-pages/GP%20author.php%20with%20multiple%20loops

Pete
quelle
Fügen Sie die obige über oder unter der author.php-Schleife hinzu
Pete