如果对于“用户参与的所有对话”,您的意思是“用户发表评论的所有对话”,您不需要任何额外的表,只需要一个SQL来获取用户发表评论的对话CPT的所有帖子。
这里有一个函数可以做到这一点:
/**
* Get posts (of a given CPT) an user has commented
*
* @param int|object|void $user User id or object to search. Void to use current user
* @param string $cpt Post type to get
* @return array|bool Posts array or FALSE if used bad arguments
*/
function get_user_conversations( $user = NULL, $cpt = \'conversation\' ) {
if ( empty( $user ) ) {
$user = get_current_user_id();
}
if ( is_object( $user ) && isset( $user->ID ) ) {
$user = $user->ID;
}
if ( ! is_numeric( $user ) || (int) $user <= 0 || ! post_type_exists( $cpt ) ) {
return FALSE;
}
global $wpdb;
$conv = $wpdb->get_results( $wpdb->prepare(
"SELECT * FROM {$wpdb->posts} p
INNER JOIN {$wpdb->comments} c ON p.ID = c.comment_post_ID
WHERE p.post_type = %s
AND p.post_status = \'publish\' AND c.user_id = %d
GROUP BY p.ID ORDER BY p.post_date DESC",
$cpt, $user
) );
return empty( $conv ) ? array() : array_map( \'get_post\', $conv );
}
用法可以通过将函数作为第一个参数传递给它来使用该函数:
在这种情况下,将不使用任何内容(或任何虚假值)。第二个参数是CPT slug,默认情况下为“对话”。
示例:
/* via user id */
get_user_conversations( 1 );
/* via user object, and using a different post type slug */
$user = new WP_User( 1 );
get_user_conversations( $user, \'myapp_conversation\' );
/* via current user */
get_user_conversations();
返回值函数可以返回:
阵列WP_Post
当给定用户未对任何帖子发表评论时,具有给定用户已对空数组发表评论的对话帖子类型的对象FALSE
将不存在的用户或错误值或未注册的帖子类型传递给函数时,或未传递任何内容且当前没有用户登录时当然,要使该功能发挥作用,您需要只接受注册用户的评论,如果您接受未登录访问者的评论,那么您可以修改该功能以查找用户电子邮件,希望您的访问者始终键入相同的电子邮件,并且始终键入良好。
还请注意,该函数不考虑注释状态,因此即使用户有任何未批准的注释,也会返回保留这些注释的对话。
建议的改进
尝试实现一种缓存:当SQL查询已经运行时,不要再次运行它。当然,用户的注释应该使缓存无效。