Komentujesz na stronie profilu użytkownika?

9

Próbuję zbudować niestandardowy profil użytkownika z wytycznymi tego samouczka: Jak utworzyć stronę profilu WordPress

Z powodzeniem wdrożyłem go do mojego tematu, wszystko działa dobrze. Teraz chcę uzyskać szablon komentarza na stronie profilu użytkownika, na której inny zarejestrowany użytkownik może publikować komentarze na swojej stronie profilu, na przykład na Facebooku lub w Last.fm shoutbox.

Próbuję tak:

Na stronie autora dodałem tę linię:

<?php comments_template(); ?>

Ale to się nie pojawia. Potem spróbowałem w ten sposób: Pobierz komentarze WordPress poza WordPress

Dodaje szablon komentarza w porządku, ale nie działa. Po kliknięciu przycisku Prześlij przekierowuje do pustej strony.

Myślę, że cel nie jest łatwy do osiągnięcia, wymaga to utworzenia niestandardowego bazy danych dla każdego użytkownika, aby przechowywać komentarze, ponieważ system komentarzy przechowuje tylko komentarze do określonej strony lub postu, a nie do żadnej innej strony, takiej jak strona archiwum lub autor.

Jeśli ktoś pokaże mi właściwy kierunek, będę na zawsze wdzięczny.

Dzięki Towfiq I.

Towfiq
źródło

Odpowiedzi:

13

Cześć @Towfiq :

Komentarze są powiązane w bazie danych z postami. Będziesz musiał wykonać wiele pracy, aby Komentarze mogły odnosić się do Użytkowników.

Czy zastanawiałeś się nad utworzeniem niestandardowego typu postu dla użytkowników, a następnie użyłeś user_metapola do przechowywania post_idlub postmetapola do przechowywania user_id, lub obu? Gdybyś to zrobił, wtedy dostałbyś komentarze bez żadnego wysiłku.

AKTUALIZACJA

Poniżej znajduje się kod opracowany po naszej dyskusji w komentarzach.

Chciałem napisać coś takiego od dłuższego czasu, ale znalezienie odpowiedzi na pytanie sprawiło, że uznałem to za priorytet. Stworzyłem 'towfiq-person'dla Ciebie niestandardowy typ postu i skonfigurowałem go tak, aby automatycznie dodawał wpis Osoby za każdym razem, gdy dodawany jest Użytkownik, i używa adresu e-mail jako klucza powiązania w niestandardowym polu posta o nazwie '_email'.

Kojarzy również użytkownika z odpowiednim adresem e-mail do posta Osoby, jeśli Użytkownik został dodany lub zaktualizowany przy użyciu tego samego adresu e-mail co istniejąca Osoba (może to być dobry pomysł lub nie). I łączy użytkownika z osobą i osobą Osoba z użytkownikiem używająca odpowiednio pól postmeta i usermeta '_user_id'oraz '_person_id'.

Są to oczywiście reguły biznesowe, które zdecydowałem się wdrożyć, ale mogą okazać się nieodpowiednie dla twojego przypadku użycia, w którym to przypadku może być konieczna ich modyfikacja. Możesz również znaleźć sposoby, w jakie WordPress pozwala tym dwóm zsynchronizować się, ale trudno jest to wiedzieć bez wyczerpujących testów. Jeśli znajdziesz problemy, zawsze możesz spróbować zaktualizować logikę, aby je rozwiązać.

Możesz skopiować następujący kod do functions.phppliku motywu :

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();

Jeśli potrzebujesz wyjaśnień na temat tego, co zrobiłem i dlaczego, po prostu zapytaj w komentarzach.

MikeSchinkel
źródło
Sugerujesz więc utworzenie niestandardowego typu postu i zaimplementowanie pętli na stronie autora. A następnie umieść formularz komentarza, aby inni użytkownicy mogli dodawać komentarze do tego pustego wpisu? Ale te same komentarze będą wyświetlane na każdej stronie profilu użytkownika. Można tego uniknąć, tworząc funkcję, która automatycznie utworzy niestandardowy post z tytułem nazwy użytkownika za pomocą wp_insert_post () po zarejestrowaniu użytkownika. Autorem postu może być użytkownik. Tak więc, gdy ściągamy pętlę postu, upewniamy się, że post z autorem = użytkownik pokazuje. Czy jestem we właściwym kierunku? Czy to komplikuję?
Towfiq
@Towfiq: Rzeczywiście, na użytkownika tworzysz jeden post swojego authorniestandardowego typu. Następnie w taxonomy-author.phppliku szablonu pytasz również o wszystkie posty bieżącego autora , a tym samym „fałszujesz” swoją stronę autora. Możesz to zrobić na odwrót (użyj szablonu autora i dołącz niestandardowy post), ale musisz oszukać formularz komentowania, aby użyć właściwego identyfikatora posta.
Jan Fabry
Dziękuję za odpowiedź Fabry. Nie mam bardzo małej wiedzy na temat taksonomii. Próbowałem wydobyć coś z tej strony: codex.wordpress.org/Template_Hierarchy#Custom Taksonomie wyświetlać Ale nie powiodło się. czy możesz mi powiedzieć, co to jest autor-taksonomia.php i co zrobi? a jeśli spróbuję odwrotnie, czy masz pomysł na oszukiwanie identyfikatora postu? dzięki
Towfiq
@Towfiq: Mój błąd, nie powinien być taxonomy-author.php, ale single-author.php. Nie tworzysz niestandardowej systematyki, ale niestandardowy typ postu. Jest single-author.phpto plik szablonu używany do wyświetlania pojedynczego postu authorniestandardowego typu postu. Sugeruję pójście tą drogą, jest to najłatwiejsze (możesz również użyć stronicowania ( /page/2/), jeśli masz wiele postów tego autora).
Jan Fabry
1
@Towfiq? Jak mi tego brakowało, kiedy sprawdziłem mój kod? Hmm, przepraszam. W każdym razie powinno to być pomocne, gdy powiesz mi, gdzie wystąpił błąd. :) Dziwi mnie też, że zadziałało to bezbłędnie. BTW, wcześniej użyłem innego haka, więc był to resztkowy kod. Oto, co powinno go naprawić: if ($person->post_type=='towfiq-person') {. Daj mi znać ...
MikeSchinkel
0

Po prostu dodaj niestandardową pętlę typu posta w autor.php i użyj formularza komentarza tego posta. Zrobiłem to wiele razy i działa świetnie.

<?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
źródło
Dodaj powyższe powyżej lub poniżej pętli autor.php
Pete