web-dev-qa-db-fra.com

Commenter dans la page de profil de l'utilisateur?

J'essaie de créer un profil utilisateur personnalisé en suivant les instructions de ce tutoriel: Comment créer une page de profil WordPress

Je l'ai mis en œuvre avec succès dans mon thème, tout fonctionne bien. Maintenant, ce que je veux réaliser est d’obtenir le modèle de commentaire dans la page de profil de l’utilisateur, où un autre utilisateur enregistré peut poster un commentaire sur sa page de profil, comme un mur facebook ou un shoutbox last.fm.

J'essaye comme ça:

Dans la page de l'auteur, j'ai ajouté cette ligne:

<?php comments_template(); ?>

Mais cela ne se voit pas. Puis j'ai essayé de cette façon: Obtenir des commentaires WordPress en dehors de WordPress

Il ajoute bien le modèle de commentaire mais ne fonctionne pas. Lorsque vous cliquez sur le bouton d'envoi, il est redirigé vers une page vierge.

Je pense que l'objectif n'est pas réalisable facilement, il nécessite la création d'une base de données personnalisée pour que chaque utilisateur puisse stocker les commentaires, car le système de commentaires ne stocke que les commentaires de certaines pages ou de certaines publications, pas plus que pour une autre page telle que archive ou auteur.

Si quelqu'un peut me montrer la bonne direction, je vous en serai toujours reconnaissant.

Merci Towfiq I.

8
Towfiq

Bonjour @Towfiq :

Les commentaires sont liés dans la base de données aux publications. Vous devrez faire beaucoup de travail pour que les commentaires se rapportent aux utilisateurs.

Avez-vous envisagé de créer un type de publication personnalisé pour les utilisateurs, puis utilisez soit un champ user_meta pour stocker le post_id, soit un champ postmeta pour stocker le user_id, ou les deux? Si vous le faisiez, vous obtiendriez les commentaires sans aucun effort.

METTRE À JOUR

Ce qui suit est un code développé après notre discussion dans les commentaires.

Je voulais écrire quelque chose comme ça depuis longtemps, mais la réponse à votre question m'a amené à en faire une priorité. J'ai créé un type d'article 'towfiq-person' personnalisé pour vous et je l'ai configuré pour ajouter automatiquement un article Personne chaque fois qu'un utilisateur est ajouté. Il utilise l'adresse e-mail comme clé d'association dans un champ d'article personnalisé appelé '_email'.

Il associe également un utilisateur avec une adresse électronique appropriée à la publication Personne si un utilisateur est ajouté ou mis à jour avec le même courrier électronique qu'une personne existante (cela peut ou peut ne pas être une bonne idée.)} -références Utilisateur avec Personne et Utilisateur avec Utilisateur utilisant les champs postcode et usermeta '_user_id' et '_person_id', respectivement.

Ce sont bien sûr des règles de gestion que j'ai choisi de mettre en œuvre, mais elles peuvent s'avérer inappropriées pour votre cas d'utilisation, auquel cas vous devrez peut-être les modifier. Vous pouvez également trouver des moyens par lesquels WordPress permet à ces deux-là de se désynchroniser, mais il est difficile de le savoir sans tests exhaustifs. Si vous rencontrez des problèmes, vous pouvez toujours chercher à mettre à jour la logique pour les résoudre.

Vous pouvez copier le code suivant dans le fichier functions.php de votre thème:

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

Si vous avez besoin d'éclaircissements sur ce que j'ai fait et pourquoi, demandez simplement dans les commentaires.

13
MikeSchinkel

Ajoutez simplement une boucle de type de publication personnalisée dans author.php et utilisez le formulaire de commentaire de cette publication personnalisée. Je l'ai fait plusieurs fois et cela fonctionne très bien.

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

0
Pete