Comentando na página de perfil do usuário?

9

Estou tentando criar um perfil de usuário personalizado com as orientações deste tutorial: Como criar uma página de perfil do WordPress

Eu o implementei com sucesso no meu tema, tudo está funcionando bem. Agora, o que eu quero é obter o modelo de comentário na página de perfil do usuário, onde outro usuário registrado pode postar comentários em sua página de perfil, como o mural do facebook ou o shoutbox last.fm.

Estou tentando assim:

Na página do autor, adicionei esta linha:

<?php comments_template(); ?>

Mas isso não aparece. Então tentei da seguinte maneira: obter comentários do WordPress fora do WordPress

Ele adiciona o modelo de comentário, mas não funciona. Quando você clica no botão enviar, ele é redirecionado para uma página em branco.

Eu acho que o objetivo não é alcançável facilmente, requer a criação de banco de dados personalizado para cada usuário armazenar os comentários, pois o sistema de comentários armazena apenas comentários de determinada página ou publicação, não para qualquer outra página, como arquivo ou página do autor.

Se alguém puder me mostrar a direção certa, serei eternamente grato.

Obrigado Towfiq I.

Towfiq
fonte

Respostas:

13

Olá, @Towfiq :

Os comentários estão relacionados no banco de dados com Postagens. Você precisará fazer muito trabalho para que os Comentários se relacionem com os Usuários.

Você já pensou em criar um Tipo de postagem personalizado para usuários e, em seguida, use um user_metacampo para armazenar o post_id, ou um postmetacampo para armazenar o user_idou ambos? Se você fizesse isso, receberia os comentários sem nenhum esforço.

ATUALIZAR

O que segue é um código desenvolvido após nossa discussão nos comentários.

Eu pretendo escrever algo assim por um longo tempo, mas sua busca por perguntas me fez priorizá-la. Criei um 'towfiq-person'tipo de postagem personalizado para você e configurei-o para adicionar automaticamente uma postagem da Pessoa sempre que um Usuário for adicionado e ele usa o endereço de email como a chave de associação em um campo personalizado da postagem chamado '_email'.

Ele também associa um Usuário com um endereço de email apropriado à postagem da Pessoa, se um Usuário for adicionado ou atualizado com o mesmo email de uma Pessoa existente (isso pode ou não ser uma boa idéia.) E faz referência cruzada de Usuário com Pessoa e Pessoa com Usuário usando os campos postmeta e usermeta '_user_id'e '_person_id', respectivamente.

É claro que essas são regras de negócios que eu escolhi implementar, mas elas podem não ser apropriadas para o seu caso de uso. Nesse caso, pode ser necessário modificá-las. Você também pode encontrar maneiras de o WordPress permitir que esses dois fiquem fora de sincronia, mas é difícil saber isso sem testes exaustivos. Se você encontrar problemas, sempre poderá atualizar a lógica para resolvê-los.

Você pode copiar o seguinte código no functions.phparquivo do seu tema :

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

Se você precisar de algum esclarecimento sobre o que fiz e por quê, basta perguntar nos comentários.

MikeSchinkel
fonte
Então, o que você está sugerindo é criar um tipo de postagem personalizado e implementar o loop na página do autor. E, em seguida, coloque o formulário de comentários para que outros usuários possam postar comentários nessa postagem em branco? Mas os mesmos comentários serão mostrados em todas as páginas de perfil dos usuários. Isso pode ser evitado através da criação de uma função que criará automaticamente uma postagem personalizada com o título do nome de usuário com wp_insert_post () quando um usuário estiver registrado. O autor da postagem pode ser o usuário. Então, quando puxamos o loop da postagem, garantimos que a postagem com o autor = usuário seja exibida. Estou na direção certa? Estou dificultando?
Towfiq 31/12/10
@Towfiq: De fato, por usuário, você cria uma postagem do seu authortipo de postagem personalizada. Em seguida, no taxonomy-author.phparquivo de modelo, você também consulta todas as postagens do autor atual e, assim, "falsifica" sua página de autor. Você também pode fazer o contrário (usar o modelo do autor e incluir a postagem personalizada), mas precisará enganar o formulário de comentários para usar o ID da postagem correto.
Jan Fabry
Obrigado pela sua resposta Fabry. Eu não tenho muito pouco conhecimento sobre taxonomia. Tentei obter algo desta página: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Mas falhou. você pode me dizer o que é taxonomy-author.php e o que ele fará? e se eu tentar o contrário, você tem alguma idéia sobre enganar o ID da postagem? obrigado
Towfiq
@Towfiq: Meu erro, não deveria ser taxonomy-author.php, mas single-author.php. Você não cria uma taxonomia personalizada, mas um tipo de postagem personalizado. O single-author.phpé o arquivo de modelo usado para exibir uma única postagem do authortipo de postagem personalizada. Eu sugiro que você siga esse caminho, é o mais fácil (você também pode usar paging ( /page/2/) se tiver muitas postagens desse autor).
Jan Fabry
11
@Towfiq? Como eu perdi isso quando revisei meu código? Hmm, desculpe. De qualquer forma, deve ser útil quando você me diz onde ocorreu o erro. :) Também estou surpreso que funcionou do meu lado sem erros. BTW, eu estava usando um gancho diferente antes, então isso era código remanescente. Aqui está o que deve corrigi-lo: if ($person->post_type=='towfiq-person') {. Deixe-me saber ...
MikeSchinkel
0

Basta adicionar um loop de tipo de postagem personalizado dentro de author.php e usar o formulário de comentários dessa postagem personalizada. Eu já fiz isso muitas vezes e funciona muito bem.

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

Pete
fonte
Adicione acima ou abaixo do loop author.php
Pete