問題描述
我正在本教程的指導下建立自定義使用者個人資料: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_id 或 postmeta 欄位來儲存 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。