Subscribers to posts

时间:2014-07-08 作者:abracadabra

把每一篇文章都当作对话的主题,并评论一段对话。现在一切都很好。我创建了一个名为“对话”的帖子类型。现在,我想列出用户参与的所有对话。

如何扩展wordpress的此功能?我的想法是创建一个名为wp_posts_users 具有user_idconv_id. 这方面有什么最佳做法吗?

我的最终目标是在用户页面上列出他参与的所有对话。

1 个回复
SO网友:gmazzap

如果对于“用户参与的所有对话”,您的意思是“用户发表评论的所有对话”,您不需要任何额外的表,只需要一个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查询已经运行时,不要再次运行它。当然,用户的注释应该使缓存无效。

结束

相关推荐

从wp_USERS中选择,也获取DisplayName

SELECT post_author, count(ID) as amount FROM dbold_posts WHERE WEEKOFYEAR( post_date ) = WEEKOFYEAR( NOW() ) AND post_status = \'publish\' AND post_type = \'post\' GROUP BY post_author 我不知道如何获取显示名称,而不是此查询中的“post\\