在用户个人资料页面中发表评论?


9

我正在尝试在本教程的指导下构建自定义用户个人资料:如何制作WordPress个人资料页面

我已经成功地将其实现为我的主题,并且一切正常。现在,我要实现的是在用户个人资料页面中获取评论模板,其他注册用户可以在其个人资料页面上发布评论,例如facebook wall或last.fm shoutbox。

我正在这样尝试:

在作者页面中,我添加了以下行:

<?php comments_template(); ?>

但是它没有出现。然后我尝试这种方式:在WordPress之外获取WordPress注释

它可以添加注释模板,但是不起作用。当您单击提交按钮时,它会重定向到空白页。

我认为这个目标并不容易实现,它需要为每个用户创建自定义数据库来存储评论,因为评论系统仅存储特定页面或帖子的评论,而不能存储任何其他页面(如存档或作者页面)的评论。

如果有人能告诉我正确的方向,我将永远感激不已。

感谢TowfiqI。

Answers:


13

@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();

如果您需要对我的工作及其原因进行澄清,请在评论中提出。


因此,您的建议是创建一个自定义帖子类型,并实现到作者页面的循环。然后提出评论表格,以便其他用户可以对空白帖子发表评论?但是,相同的注释将显示在每个用户个人资料页面上。可以通过创建函数来避免这种情况,该函数将在注册用户时使用wp_insert_post()使用用户名标题自动创建自定义帖子。帖子的作者可以是用户。因此,当我们拉动帖子循环时,请确保显示具有author = user的帖子。我的方向正确吗?我会让事情变得复杂吗?
Towfiq 2010年

@Towfiq:确实,每个用户都会创建一个author自定义帖子类型的帖子。然后,在taxonomy-author.php模板文件上,您还查询当前作者的所有帖子,从而“伪造”您的作者页面。您也可以采用其他方法(使用作者模板并包括自定义帖子)来完成此操作,但是随后您需要欺骗评论表单以使用正确的帖子ID。
Jan Fabry 2010年

感谢您的答复Fabry。我对分类法了解甚少。我试图从此页面中获取一些信息:codex.wordpress.org/Template_Hierarchy#Custom分类法显示但失败。您能告诉我taxonomy-author.php是什么,它将做什么?如果我尝试另一种方法,您是否有欺骗帖子ID的想法?-谢谢
Towfiq

@Towfiq:我的错,应该不是taxonomy-author.php,而是single-author.php。您不是创建自定义分类法,而是创建自定义帖子类型。本single-author.php是用于显示的单篇文章的模板文件author自定义后的类型。我建议您采用这种方式,这是最简单的方法(/page/2/如果您有很多来自该作者的帖子,也可以使用分页())。
Jan Fabry'1

1
@Towfiq?当我查看我的代码时,我怎么会想念它?嗯,对不起。无论如何,当您告诉我错误发生在哪里时,应该有多大帮助。:)我也很惊讶它能正确无误地工作。顺便说一句,我之前使用了另一个钩子,所以那是残余代码。以下是应解决的问题:if ($person->post_type=='towfiq-person') {。让我知道...
MikeSchinkel 2011年

0

只需在author.php中添加一个自定义帖子类型循环,然后使用该自定义帖子的评论表单即可。我已经做了很多次,效果很好。

<?php /* Display the author's comments from the custom post type (AAA) */ ?>
<?php
$authorid = get_the_author_meta( ID, $userID );
$args=array('author' => $authorid,'post_type' => 'AAA', 'numberposts' => -1);
$cquery=new WP_Query($args);
if($cquery->have_posts()):
while($cquery->have_posts()):
$cquery->the_post();
?>          
<div class="comments-area">
    <?php comments_template(); ?>
</div>
<?
    endwhile;
        wp_reset_postdata();
    endif;
?>

https://github.com/pjeaje/code-snippets/blob/gh-pages/GP%20author.php%20with%20multiple%20loops


将以上内容添加到author.php循环的上方或下方
皮特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.