Commenter dans la page de profil utilisateur?

9

J'essaie de créer un profil utilisateur personnalisé avec les conseils de ce tutoriel: Comment créer une page de profil WordPress

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

Je l'essaye comme ceci:

Dans la page auteur, je suis ajouté cette ligne:

<?php comments_template(); ?>

Mais cela n'apparaît pas. Ensuite, 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 Soumettre, il redirige 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 chaque utilisateur pour stocker les commentaires, car le système de commentaires ne stocke que les commentaires de certaines pages ou publications, pas pour toute autre page comme une page d'archive ou d'auteur.

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

Merci Towfiq I.

Towfiq
la source

Réponses:

13

Salut @Towfiq :

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

Avez-vous envisagé de créer un type de publication personnalisé pour les utilisateurs, puis d'utiliser un user_metachamp pour stocker le post_id, ou un postmetachamp pour stocker le user_id, ou les deux? Si vous faisiez cela, vous obtiendriez les commentaires sans aucun effort.

MISE À JOUR

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

J'avais l'intention d'écrire quelque chose comme ça depuis longtemps, mais votre recherche de questions m'a amené à en faire une priorité. J'ai créé un 'towfiq-person'type de publication personnalisé pour vous et je l'ai configuré pour ajouter automatiquement une publication Personne chaque fois qu'un utilisateur est ajouté et il utilise l'adresse e-mail comme clé d'association dans un champ personnalisé de publication appelé '_email'.

Il associe également un utilisateur avec une adresse e - mail appropriée au poste personne si un utilisateur est ajouté ou mis à jour avec le même courriel comme existant personne (ce qui peut ou ne peut pas être une bonne idée.) Et les références croisées utilisateur avec personne et Personne avec l'utilisateur utilisant les champs postmeta et usermeta '_user_id'et '_person_id', respectivement.

Ce sont bien sûr des règles commerciales que j'ai choisi de mettre en œuvre, mais elles peuvent ne pas convenir à votre cas d'utilisation, auquel cas vous devrez peut-être les modifier. Vous pouvez également trouver des moyens pour que WordPress permette à ces deux-là de se désynchroniser, mais il est difficile de le savoir sans des 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 functions.phpfichier 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.

MikeSchinkel
la source
Donc, ce que vous proposez est de créer un type de publication personnalisé et d'implémenter la boucle vers la page d'auteur. Et puis mettre en place le formulaire de commentaire afin que les autres utilisateurs puissent poster un commentaire sur ce message vierge Mais les mêmes commentaires seront affichés sur chaque page de profil des utilisateurs. Cela peut être évité en créant une fonction qui créera automatiquement une publication personnalisée avec le titre du nom d'utilisateur avec wp_insert_post () lorsqu'un utilisateur est enregistré. L'auteur du message pourrait être l'utilisateur. Ainsi, lorsque nous tirons la boucle du message, nous nous assurons que le message avec l'auteur = utilisateur s'affiche. Suis-je dans la bonne direction? Suis-je en train de compliquer les choses?
Towfiq
@Towfiq: En effet, par utilisateur, vous créez un message de votre authortype de message personnalisé. Ensuite, sur le taxonomy-author.phpfichier modèle, vous interrogez également tous les articles de l'auteur actuel , et ainsi "falsifiez" votre page d'auteur. Vous pouvez également le faire dans l'autre sens (utilisez le modèle d'auteur et incluez la publication personnalisée), mais vous devez ensuite tromper le formulaire de commentaires pour utiliser le bon identifiant de publication.
Jan Fabry
Merci pour ta réponse Fabry. Je n'ai pas très peu de connaissances sur la taxonomie. J'ai essayé de tirer quelque chose de cette page: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Mais a échoué. pouvez-vous me dire ce qu'est taxonomy-author.php et que fera-t-il? et si j'essaie dans l'autre sens, avez-vous une idée de tromper l'identifiant du message ?? -Merci
Towfiq
@Towfiq: Mon erreur, ça ne devrait pas l'être taxonomy-author.php, mais single-author.php. Vous ne créez pas une taxonomie personnalisée, mais un type de publication personnalisé. Le single-author.phpest le fichier modèle qui est utilisé pour afficher un seul poste de authortype poste personnalisé. Je vous suggère de suivre cette voie, c'est la plus simple (vous pouvez également utiliser paging ( /page/2/) si vous avez de nombreux articles de cet auteur).
Jan Fabry
1
@Towfiq? Comment ai-je manqué cela lorsque j'ai examiné mon code? Hmm, désolé. Quoi qu'il en soit, cela devrait être utile lorsque vous me dites où l'erreur s'est produite. :) Je suis également surpris que cela ait fonctionné de ma part sans erreur. BTW, j'utilisais un crochet différent auparavant, donc c'était du code résiduel. Voici ce qui devrait fixer: if ($person->post_type=='towfiq-person') {. Faites-moi savoir ...
MikeSchinkel
0

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

Pete
la source
Ajoutez ce qui précède au-dessus ou en dessous de la boucle author.php
Pete