是否在用户配置文件页面中发表评论?

时间:2010-12-31 作者:Towfiq

我正试图在本教程的指导下构建自定义用户配置文件:How to make a WordPress profile page

我已经成功地实现了我的主题,一切都很好。现在,我想实现的是在用户配置文件页面中获取评论模板,其他注册用户可以在其配置文件页面上发表评论,有点像facebook wall或last。fm shoutbox。

我试着这样做:

在作者页面中,我添加了这一行:

<?php comments_template(); ?>
但它没有出现。然后我试着这样做:Get WordPress comments outside of WordPress

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

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

如果有人能给我指明正确的方向,我将永远感激。

感谢斯托菲克一世。

2 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@Towfiq:

评论在数据库中与帖子相关。您需要做大量工作才能获得与用户相关的评论。

您是否考虑过创建Custom Post Type 对于用户,然后使用user_meta 要存储的字段post_id, 或者postmeta 要存储的字段user_id, 或者两者都有?如果你这样做了,那么你会毫不费力地得到评论。

更新以下是我们在评论中讨论后开发的代码。

很长时间以来,我一直想写这样的东西,但你的问题发现让我把它作为优先事项。我创造了一个\'towfiq-person\' 您和我的自定义帖子类型已将其设置为每当添加用户时自动添加个人帖子,并使用电子邮件地址作为帖子自定义字段中的关联键,该字段名为\'_email\'.

如果用户被添加或更新为与现有用户相同的电子邮件,它还会将用户与相应的电子邮件地址关联到Person post(这可能是个好主意,也可能不是个好主意)并且它使用Posteta和usermeta字段交叉引用User with Person和Person with User\'_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();
如果你需要澄清我做了什么以及为什么,只需在评论中提问。

SO网友:Pete

只需在author中添加一个自定义post类型循环。并使用该自定义帖子的评论表单。我做过很多次,效果很好。

<?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

结束

相关推荐

I can't view or add comments

嘿,那里。我刚刚建立了这个网站。http://www.paledogstudios.com 它工作得很好,只是我似乎看不到过去的评论(这个博客是从blogger导入的)或添加评论。我知道这是代码而不是设置,因为有人告诉我,但他没有进一步帮助我。他说这可能在索引上。php帮助