问题描述
我正在本教程的指导下建立自定义用户个人资料: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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。