แสดงความคิดเห็นในหน้าโปรไฟล์ผู้ใช้?


9

ฉันกำลังพยายามสร้างโปรไฟล์ผู้ใช้เองด้วยคำแนะนำของบทช่วยสอนนี้: วิธีสร้างหน้าโปรไฟล์ WordPress

ฉันนำไปใช้กับธีมสำเร็จแล้วทุกอย่างทำงานได้ดี ตอนนี้สิ่งที่ฉันต้องการบรรลุคือการได้รับแม่แบบความคิดเห็นในหน้าโปรไฟล์ผู้ใช้ซึ่งผู้ใช้ที่ลงทะเบียนรายอื่นสามารถโพสต์ความคิดเห็นในหน้าโปรไฟล์ของเขาได้เช่น facebook wall หรือ last.fm shoutbox

ฉันกำลังลองแบบนี้:

ในหน้าผู้เขียนฉันเพิ่มบรรทัดนี้:

<?php comments_template(); ?>

แต่มันไม่ปรากฏขึ้น จากนั้นฉันก็ลองวิธีนี้: รับความคิดเห็น WordPress นอก WordPress

มันเพิ่มแม่แบบความคิดเห็นเป็นไร แต่ใช้งานไม่ได้ เมื่อคุณคลิกที่ปุ่มส่งมันจะเปลี่ยนเส้นทางไปยังหน้าว่าง

ฉันคิดว่าเป้าหมายไม่สามารถทำได้อย่างง่ายดายมันต้องมีการสร้างฐานข้อมูลที่กำหนดเองสำหรับผู้ใช้แต่ละรายเพื่อเก็บความคิดเห็นเนื่องจากระบบความคิดเห็นจะเก็บเฉพาะความคิดเห็นของหน้าหรือโพสต์บางหน้าไม่ใช่สำหรับหน้าอื่น ๆ

หากใครสามารถแสดงให้ฉันเห็นทิศทางที่ถูกต้องฉันจะขอบคุณตลอดไป

ขอบคุณ Towfiq I.

คำตอบ:


13

สวัสดี@Towfiq :

ความคิดเห็นที่เกี่ยวข้องในฐานข้อมูลเพื่อโพสต์ คุณจะต้องทำงานอย่างหนักเพื่อรับความคิดเห็นที่เกี่ยวข้องกับผู้ใช้

คุณได้พิจารณาสร้างประเภทโพสต์ที่กำหนดเองสำหรับผู้ใช้แล้วใช้user_metaฟิลด์เพื่อเก็บpost_idหรือpostmetaฟิลด์เพื่อเก็บuser_idหรือทั้งสอง? ถ้าคุณทำอย่างนั้นคุณจะได้รับความคิดเห็นโดยไม่ต้องพยายามเลย

UPDATE

สิ่งที่ตามมาคือการพัฒนาโค้ดหลังจากการอภิปรายของเราในความคิดเห็น

ฉันตั้งใจจะเขียนบางสิ่งเช่นนี้มาเป็นเวลานาน แต่คำถามของคุณทำให้ฉันได้รับความสำคัญเป็นอันดับแรก ฉันได้สร้างประเภทโพสต์ที่กำหนดเองสำหรับคุณและฉันได้ตั้งขึ้นโดยอัตโนมัติเพิ่มโพสต์คนเมื่อใดก็ตามที่ผู้ใช้จะมีการเพิ่มและจะใช้ที่อยู่อีเมลที่เป็นคีย์การเชื่อมโยงในด้านการโพสต์ที่กำหนดเองที่เรียกว่า 'towfiq-person''_email'

นอกจากนี้ยังเชื่อมโยงผู้ใช้กับที่อยู่อีเมลที่เหมาะสมกับโพสต์บุคคลหากผู้ใช้เพิ่มหรืออัปเดตด้วยอีเมลเดียวกับบุคคลที่มีอยู่(ซึ่งอาจเป็นหรือไม่เป็นความคิดที่ดี)และเป็นการอ้างอิงผู้ใช้กับบุคคลและ บุคคลที่มีผู้ใช้ที่ใช้ฟิลด์ postmeta และ usermeta '_user_id'และ'_person_id'ตามลำดับ

เหล่านี้เป็นกฎเกณฑ์ทางธุรกิจที่ฉันเลือกที่จะใช้ แต่อาจเป็นไปได้ว่าไม่เหมาะสมกับกรณีการใช้งานของคุณในกรณีนี้คุณอาจต้องแก้ไข คุณอาจหาวิธีที่ WordPress อนุญาตให้สองสิ่งนี้หลุดพ้นจากการซิงค์ แต่มันก็ยากที่จะรู้ว่าไม่มีการทดสอบที่ละเอียดถี่ถ้วน หากคุณพบปัญหาคุณสามารถดูการปรับปรุงตรรกะเพื่อแก้ไขปัญหาได้เสมอ

คุณสามารถคัดลอกรหัสต่อไปนี้ไปยังfunctions.phpไฟล์ธีมของคุณ:

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

หากคุณต้องการคำชี้แจงใด ๆ กับสิ่งที่ฉันทำและทำไมเพียงแค่ถามในความคิดเห็น


ดังนั้นสิ่งที่คุณแนะนำคือสร้างประเภทโพสต์ที่กำหนดเองและนำลูปไปใช้ในหน้าผู้เขียน จากนั้นวางฟอร์มความคิดเห็นเพื่อให้ผู้ใช้รายอื่นสามารถโพสต์ความคิดเห็นในโพสต์ว่างเปล่านั้นได้ แต่ความคิดเห็นแบบเดียวกันจะปรากฏในหน้าโปรไฟล์ผู้ใช้ทุกคน มันสามารถหลีกเลี่ยงได้โดยการสร้างฟังก์ชั่นซึ่งจะสร้างโพสต์ที่กำหนดเองโดยอัตโนมัติด้วยชื่อของชื่อผู้ใช้ด้วย wp_insert_post () เมื่อผู้ใช้ลงทะเบียน ผู้เขียนโพสต์อาจเป็นผู้ใช้ ดังนั้นเมื่อเราดึงลูปของโพสต์เรามั่นใจว่าโพสต์ที่มีผู้เขียน = ผู้ใช้แสดง ฉันไปในทิศทางที่ถูกต้องหรือไม่? ฉันกำลังทำให้มันซับซ้อนหรือไม่
Towfiq

@Towfiq: แน่นอนต่อผู้ใช้หนึ่งรายคุณสร้างหนึ่งโพสต์ของauthorประเภทโพสต์ที่คุณกำหนดเอง จากนั้นในtaxonomy-author.phpไฟล์เทมเพลตคุณสามารถค้นหาโพสต์ทั้งหมดของผู้เขียนปัจจุบันและทำให้ "ปลอม" หน้าผู้แต่งของคุณ คุณสามารถใช้วิธีอื่น ๆ ได้ (ใช้เทมเพลตผู้แต่งและรวมถึงโพสต์ที่กำหนดเอง) แต่คุณต้องหลอกลวงแบบฟอร์มการแสดงความคิดเห็นเพื่อใช้รหัสโพสต์ที่ถูกต้อง
Jan Fabry

ขอบคุณสำหรับคำตอบของคุณ Fabry ฉันไม่มีความรู้เกี่ยวกับอนุกรมวิธานน้อยมาก ฉันพยายามเอาบางสิ่งออกจากหน้านี้: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies แสดง แต่ล้มเหลว คุณสามารถบอกฉันว่า taxonomy-author.php คืออะไรและจะทำอย่างไร และถ้าฉันลองวิธีอื่นคุณมีความคิดเกี่ยวกับการหลอกรหัสโพสต์หรือไม่? -thanks
Towfiq

@Towfiq: ความผิดพลาดของฉันมันไม่ควรจะเป็นแต่taxonomy-author.php single-author.phpคุณไม่ได้สร้าง taxonomy ที่กำหนดเอง แต่เป็นประเภทโพสต์ที่กำหนดเอง single-author.phpเป็นแฟ้มแม่แบบที่ใช้ในการแสดงโพสต์เดียวของauthorโพสต์ที่กำหนดเองประเภท ฉันขอแนะนำให้คุณใช้วิธีนี้เป็นวิธีที่ง่ายที่สุด (คุณสามารถใช้การเพจ ( /page/2/) หากคุณมีโพสต์มากมายจากผู้เขียนคนนั้น)
Jan Fabry

1
@Towfiq? ฉันจะพลาดได้อย่างไรเมื่อฉันตรวจสอบรหัสของฉัน? อืมขอโทษ อย่างไรก็ตามมันจะมีประโยชน์แค่ไหนเมื่อคุณบอกฉันว่าเกิดข้อผิดพลาดขึ้นที่ไหน :) ฉันก็ประหลาดใจที่มันทำงานได้ในตอนท้าย BTW ฉันใช้ hook ที่แตกต่างกันมาก่อนเพื่อให้เป็นรหัสที่เหลือ if ($person->post_type=='towfiq-person') {นี่คือสิ่งที่ควรจะแก้ไขมัน แจ้งให้เราทราบ ...
MikeSchinkel

0

เพียงเพิ่มลูปประเภทโพสต์ที่กำหนดเองภายใน author.php และใช้แบบฟอร์มความคิดเห็นของโพสต์ที่กำหนดเอง ฉันทำไปแล้วหลายครั้งและใช้งานได้ดี

<?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


เพิ่มด้านบนหรือด้านล่างของ author.php loop
Pete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.