Berkomentar di halaman profil pengguna?

9

Saya mencoba membuat profil pengguna khusus dengan panduan tutorial ini: Cara membuat halaman profil WordPress

Saya telah berhasil mengimplementasikannya ke tema saya, semuanya bekerja dengan baik. Sekarang yang ingin saya capai adalah mendapatkan template komentar di halaman profil pengguna, di mana pengguna terdaftar lainnya dapat memposting komentar di halaman profilnya, agak seperti dinding facebook atau shoutbox last.fm.

Saya mencobanya seperti ini:

Di halaman penulis saya menambahkan baris ini:

<?php comments_template(); ?>

Tapi itu tidak muncul. Lalu saya mencoba cara ini: Dapatkan komentar WordPress di luar WordPress

Itu menambahkan template komentar baik-baik saja tetapi, tidak berfungsi. Ketika Anda mengklik tombol kirim, itu akan diarahkan ke halaman kosong.

Saya pikir tujuannya tidak dapat dicapai dengan mudah, memerlukan pembuatan basis data khusus untuk setiap pengguna untuk menyimpan komentar, karena sistem komentar hanya menyimpan komentar dari halaman atau posting tertentu, bukan untuk halaman lain seperti arsip atau halaman penulis.

Jika ada yang bisa menunjukkan arah yang benar, saya akan selamanya berterima kasih.

Terima kasih Towfiq I.

Towfiq
sumber

Jawaban:

13

Hai @Tfifiq :

Komentar terkait dalam database dengan Posting. Anda harus melakukan banyak pekerjaan untuk mendapatkan Komentar yang terkait dengan Pengguna.

Sudahkah Anda mempertimbangkan untuk membuat Jenis Posting Kustom untuk Pengguna dan kemudian menggunakan salah satu user_metabidang untuk menyimpan post_id, atau postmetabidang untuk menyimpan user_id, atau keduanya? Jika Anda melakukannya maka Anda akan mendapatkan komentar tanpa usaha sama sekali.

MEMPERBARUI

Berikut ini adalah kode yang dikembangkan setelah diskusi kami di komentar.

Saya bermaksud menulis sesuatu seperti ini sejak lama, tetapi pertanyaan Anda membuat saya menjadikannya prioritas. Saya telah membuat 'towfiq-person'jenis posting khusus untuk Anda dan saya telah mengaturnya untuk secara otomatis menambahkan posting Orang setiap kali seorang Pengguna ditambahkan dan menggunakan alamat email sebagai kunci pengait dalam bidang kustom posting yang disebut '_email'.

Ini juga mengaitkan Pengguna dengan alamat email yang sesuai dengan posting Orang jika Pengguna ditambahkan atau diperbarui dengan email yang sama dengan Orang yang ada (ini mungkin atau mungkin bukan ide yang baik.) Dan itu referensi silang Pengguna dengan Orang dan Orang dengan Pengguna menggunakan bidang postmeta dan usermeta '_user_id'dan '_person_id', masing-masing.

Ini tentu saja aturan bisnis yang saya pilih untuk diterapkan tetapi mungkin ternyata tidak sesuai untuk kasus penggunaan Anda dalam hal ini Anda mungkin perlu memodifikasinya. Anda juga dapat menemukan cara yang memungkinkan WordPress untuk keluar dari sinkronisasi tetapi sulit untuk mengetahuinya tanpa pengujian mendalam. Jika Anda menemukan masalah, Anda selalu dapat melihat untuk memperbarui logika untuk menyelesaikannya.

Anda dapat menyalin kode berikut ke functions.phpfile tema Anda :

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

Jika Anda memerlukan klarifikasi atas apa yang saya lakukan dan mengapa, tanyakan di komentar.

MikeSchinkel
sumber
Jadi, apa yang Anda sarankan adalah membuat jenis posting khusus dan mengimplementasikan loop ke halaman penulis. Dan kemudian memasang formulir komentar sehingga pengguna lain dapat memposting komentar ke posting kosong itu? Tetapi komentar yang sama akan ditampilkan ke setiap halaman profil pengguna. Ini dapat dihindari dengan membuat fungsi yang akan secara otomatis membuat pos kustom dengan judul nama pengguna dengan wp_insert_post () ketika pengguna terdaftar. Penulis pos dapat menjadi pengguna. Jadi, ketika kita menarik loop post kita memastikan postingan dengan author = user shows. Apakah saya ke arah yang benar? Apakah saya membuatnya rumit?
Towfiq
@ Talkfiq: Memang, per pengguna Anda membuat satu posting dari authorjenis posting kustom Anda . Kemudian pada taxonomy-author.phpfile template, Anda juga meminta semua posting penulis saat ini , dan dengan demikian "memalsukan" halaman penulis Anda. Anda juga bisa melakukannya sebaliknya (gunakan templat penulis dan sertakan pos kustom), tetapi kemudian Anda perlu mengelabui formulir komentar untuk menggunakan id posting yang tepat.
Jan Fabry
Terima kasih atas balasan Anda, Fabry. Saya tidak memiliki sedikit pengetahuan tentang taksonomi. Saya mencoba mengeluarkan sesuatu dari halaman ini: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Tapi gagal. dapatkah Anda memberi tahu saya apa itu taxonomy-author.php dan apa yang akan dilakukannya? dan jika saya mencoba sebaliknya, apakah Anda punya ide tentang menipu id posting ?? -Terima kasih
Towfiq
@ Widfiq: Kesalahan saya, seharusnya tidak taxonomy-author.php, tapi single-author.php. Anda tidak membuat taksonomi khusus, tetapi tipe pos kustom. Ini single-author.phpadalah file templat yang digunakan untuk menampilkan satu posting dari authorjenis posting khusus. Saya sarankan Anda pergi dengan cara ini, ini yang termudah (Anda juga dapat menggunakan paging ( /page/2/) jika Anda memiliki banyak posting dari penulis itu).
Jan Fabry
1
@Tfifiq? Bagaimana saya melewatkan itu ketika saya meninjau kode saya? Hmm, maaf. Bagaimanapun, itu seharusnya sangat membantu ketika Anda memberi tahu saya di mana kesalahan terjadi. :) Saya juga terkejut itu berhasil pada akhirnya tanpa kesalahan. BTW, saya menggunakan hook yang berbeda sebelumnya jadi itu kode sisa. Inilah yang harus memperbaikinya: if ($person->post_type=='towfiq-person') {. Beri tahu saya ...
MikeSchinkel
0

Cukup tambahkan loop jenis posting khusus di dalam author.php dan gunakan formulir komentar posting kustom itu. Saya sudah melakukannya berkali-kali dan itu bekerja dengan baik.

<?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
sumber
Tambahkan yang di atas atau di bawah loop author.php
Pete