สวัสดี@Towfiq :
ความคิดเห็นที่เกี่ยวข้องในฐานข้อมูลเพื่อโพสต์ คุณจะต้องทำงานอย่างหนักเพื่อรับความคิดเห็นที่เกี่ยวข้องกับผู้ใช้
คุณได้พิจารณาสร้างประเภทโพสต์ที่กำหนดเองสำหรับผู้ใช้แล้วใช้user_meta
ฟิลด์เพื่อเก็บpost_id
หรือpostmeta
ฟิลด์เพื่อเก็บuser_id
หรือทั้งสอง? ถ้าคุณทำอย่างนั้นคุณจะได้รับความคิดเห็นโดยไม่ต้องพยายามเลย
UPDATE
สิ่งที่ตามมาคือการพัฒนาโค้ดหลังจากการอภิปรายของเราในความคิดเห็น
ฉันตั้งใจจะเขียนบางสิ่งเช่นนี้มาเป็นเวลานาน แต่คำถามของคุณทำให้ฉันได้รับความสำคัญเป็นอันดับแรก ฉันได้สร้างประเภทโพสต์ที่กำหนดเองสำหรับคุณและฉันได้ตั้งขึ้นโดยอัตโนมัติเพิ่มโพสต์คนเมื่อใดก็ตามที่ผู้ใช้จะมีการเพิ่มและจะใช้ที่อยู่อีเมลที่เป็นคีย์การเชื่อมโยงในด้านการโพสต์ที่กำหนดเองที่เรียกว่า 'towfiq-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();
หากคุณต้องการคำชี้แจงใด ๆ กับสิ่งที่ฉันทำและทำไมเพียงแค่ถามในความคิดเห็น