你好@Towfiq:
评论在数据库中与帖子相关。您需要做大量工作才能获得与用户相关的评论。
您是否考虑过创建Custom Post Type 对于用户,然后使用user_meta
要存储的字段post_id
, 或者postmeta
要存储的字段user_id
, 或者两者都有?如果你这样做了,那么你会毫不费力地得到评论。
更新以下是我们在评论中讨论后开发的代码。
很长时间以来,我一直想写这样的东西,但你的问题发现让我把它作为优先事项。我创造了一个\'towfiq-person\'
您和我的自定义帖子类型已将其设置为每当添加用户时自动添加个人帖子,并使用电子邮件地址作为帖子自定义字段中的关联键,该字段名为\'_email\'
.
如果用户被添加或更新为与现有用户相同的电子邮件,它还会将用户与相应的电子邮件地址关联到Person post(这可能是个好主意,也可能不是个好主意)并且它使用Posteta和usermeta字段交叉引用User with Person和Person with User\'_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();
如果你需要澄清我做了什么以及为什么,只需在评论中提问。