Привет @ Towfiq :
Комментарии связаны в базе данных с сообщениями. Вам нужно будет проделать большую работу, чтобы получить комментарии для пользователей.
Рассматривали ли вы создание пользовательского типа записи для пользователей, а затем использовали user_meta
поле для хранения post_id
или postmeta
поле для хранения user_id
, или и то , и другое? Если бы вы сделали это, вы бы получили комментарии без каких-либо усилий.
ОБНОВИТЬ
Далее следует код, разработанный после нашего обсуждения в комментариях.
Я давно хотел написать что-то подобное, но ваш вопрос заставил меня сделать это приоритетом. Я создал 'towfiq-person'
для вас пользовательский тип записи и настроил его на автоматическое добавление сообщения 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();
Если вам нужны какие-либо пояснения к тому, что я сделал и почему, просто спросите в комментариях.
author
пользовательским типом поста. Затем вtaxonomy-author.php
файле шаблона вы также запрашиваете все сообщения текущего автора и таким образом «подделываете» страницу своего автора. Вы также можете сделать это наоборот (использовать шаблон автора и включить пользовательский пост), но тогда вам нужно обмануть форму комментирования, чтобы использовать правильный идентификатор поста.taxonomy-author.php
, ноsingle-author.php
. Вы не создаете пользовательскую таксономию, а пользовательский тип сообщения. Этоsingle-author.php
файл шаблона, который используется для отображения одного сообщенияauthor
пользовательского типа сообщения. Я предлагаю вам пойти по этому пути, это проще всего (вы также можете использовать paging (/page/2/
), если у вас много постов от этого автора).if ($person->post_type=='towfiq-person') {
. Дайте мне знать ...Просто добавьте пользовательский цикл типа сообщения в author.php и используйте форму комментария этого пользовательского сообщения. Я делал это много раз, и это прекрасно работает.
https://github.com/pjeaje/code-snippets/blob/gh-pages/GP%20author.php%20with%20multiple%20loops
источник