問題描述

我正在本教程的指導下建立自定義用户個人資料:How to make a WordPress profile page

我已經成功地實施了我的主題,一切都很好。現在我想要實現的是在用户個人資料頁面中獲取評論模板,其他註冊用户可以在他的個人資料頁面上發表評論,有點像 Facebook 牆或 last.fm shoutbox 。

我正在嘗試這樣:

在作者頁面我添加了這一行:

<?php comments_template(); ?>

但它沒有出現。然後我試過這樣:Get WordPress comments outside of WordPress

它添加了註釋模板,但是不起作用。當您點擊提交按鈕時,它將重定向到空白頁面。

我認為目標不容易實現,它需要為每個用户創建自定義數據庫以存儲註釋,因為註釋系統僅存儲某些頁面或文章的註釋,而不是任何其他頁面,如存檔或作者頁面。

如果有人能告訴我正確的方向,我將永遠感激。

感謝 Towfiq I.

最佳解決思路

嗨 @Towfiq:

註釋在數據庫中與帖子相關。您必須做很多工作才能獲得與用户相關的評論。

您是否考慮為用户創建 Custom Post Type,然後使用 user_meta 字段存儲 post_idpostmeta 字段來存儲 user_id,或兩者兼有?如果你這樣做,那麼你會收到意見,毫不費力。

UPDATE

以下是我們在評論中討論之後開發的代碼。

我一直在寫這樣的東西很長一段時間,但你的問題發現讓我成為一個優先事項。我已經為您創建了一個'towfiq-person'自定義帖子類型,我已設置它自動添加一個人的帖子,每當添加用户,並使用電子郵件地址作為關聯鍵在一個自定義字段稱為'_email'

如果用户添加或更新與現有人員相同的電子郵件地址,那麼用户還可以將用户與適當的電子郵件地址相關聯 (這可能是或可能不是一個好主意) 。它與人和人的 cross-references 用户用户分別使用 postmeta 和 usermeta 字段'_user_id''_person_id'

這些當然是我選擇實施的業務規則,但是它們可能不適合您的 use-case,在這種情況下,您可能需要修改它們。您也可能會發現 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();

如果您需要澄清我所做的和為什麼,請在評論中提問。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。