Commentando nella pagina del profilo utente?


9

Sto cercando di creare un profilo utente personalizzato con la guida di questo tutorial: Come creare una pagina di profilo WordPress

L'ho implementato con successo sul mio tema, tutto funziona bene. Ora quello che voglio ottenere è ottenere il modello di commento nella pagina del profilo utente, dove altri utenti registrati possono pubblicare commenti sulla sua pagina del profilo, un po 'come la bacheca di Facebook o lo shoutbox di last.fm.

Lo sto provando in questo modo:

Nella pagina dell'autore ho aggiunto questa riga:

<?php comments_template(); ?>

Ma non si presenta. Quindi ho provato in questo modo: ottenere commenti WordPress al di fuori di WordPress

Aggiunge bene il modello di commento ma non funziona. Quando fai clic sul pulsante di invio reindirizza a una pagina vuota.

Penso che l'obiettivo non sia facilmente raggiungibile, richiede la creazione di database personalizzati per ogni utente per archiviare i commenti, poiché il sistema di commenti memorizza solo i commenti di determinate pagine o post, non per qualsiasi altra pagina come l'archivio o la pagina dell'autore.

Se qualcuno può mostrarmi la giusta direzione, sarò per sempre grato.

Grazie Towfiq I.

Risposte:


13

Ciao @Towfiq :

I commenti sono correlati nel database ai messaggi. Dovrai fare molto lavoro per ottenere commenti che riguardino gli utenti.

Hai preso in considerazione la creazione di un tipo di post personalizzato per gli utenti e quindi utilizzare un user_metacampo per memorizzare il post_ido un postmetacampo per memorizzare il user_ido entrambi? Se lo facessi, otterrai i commenti senza alcuno sforzo.

AGGIORNARE

Quello che segue è il codice sviluppato dopo la nostra discussione nei commenti.

Ho intenzione di scrivere qualcosa del genere per molto tempo, ma la tua ricerca di domande mi ha fatto diventare una priorità. Ho creato un 'towfiq-person'tipo di post personalizzato per te e l'ho impostato per aggiungere automaticamente un post Person ogni volta che viene aggiunto un utente e utilizza l'indirizzo e-mail come chiave di associazione in un campo personalizzato post chiamato '_email'.

Associa inoltre un Utente con un indirizzo e-mail appropriato al post Persona se un Utente viene aggiunto o aggiornato con la stessa e-mail di una Persona esistente (questa potrebbe essere o non essere una buona idea.) E fa riferimento incrociato Utente con Persona e Persona con utente che utilizza i campi postmeta e usermeta '_user_id'e '_person_id', rispettivamente.

Queste sono ovviamente regole commerciali che ho scelto di implementare, ma potrebbero non essere appropriate per il tuo caso d'uso, nel qual caso potresti doverle modificare. Puoi anche trovare modi in cui WordPress consente a questi due di non essere sincronizzati, ma è difficile saperlo senza test esaustivi. Se trovi problemi, puoi sempre cercare di aggiornare la logica per risolverli.

Puoi copiare il seguente codice nel functions.phpfile del tuo 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 hai bisogno di chiarimenti su cosa ho fatto e perché, basta chiedere nei commenti.


Quindi, ciò che stai suggerendo è creare un tipo di post personalizzato e implementare il ciclo nella pagina dell'autore. E poi compilare il modulo di commento in modo che altri utenti possano pubblicare commenti su quel post vuoto? Ma gli stessi commenti verranno mostrati nella pagina del profilo di ogni utente. Può essere evitato creando una funzione che creerà automaticamente un post personalizzato con il titolo del nome utente con wp_insert_post () quando un utente è registrato. L'autore del post potrebbe essere l'utente. Quindi, quando tiriamo il ciclo di post ci assicuriamo che il post con l'autore = utente mostri. Sono nella giusta direzione? Lo sto complicando?
Towfiq,

@Towfiq: in effetti, per utente crei un post del tuo authortipo di post personalizzato. Quindi, nel taxonomy-author.phpfile modello, esegui anche una query per tutti i post dell'autore corrente e quindi "falsi" la tua pagina autore. Puoi anche farlo al contrario (usa il modello dell'autore e includi il post personalizzato), ma poi devi ingannare il modulo per commentare per usare l'id del post giusto.
Jan Fabry,

Grazie per la tua risposta Fabry. Non ho pochissime conoscenze sulla tassonomia. Ho cercato di ottenere qualcosa da questa pagina: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Ma non ci sono riuscito. puoi dirmi cos'è taxonomy-author.php e cosa farà? e se provo il contrario, hai idea di ingannare l'ID del post ?? -Grazie
Towfiq

@Towfiq: errore mio, non dovrebbe essere taxonomy-author.php, ma single-author.php. Non crei una tassonomia personalizzata, ma un tipo di post personalizzato. Il single-author.phpè il file di modello che viene utilizzato per visualizzare un singolo post del authortipo di posta personalizzato. Ti suggerisco di andare in questo modo, è il più semplice (puoi anche usare il paging ( /page/2/) se hai molti post di quell'autore).
Jan Fabry

1
@Towfiq? Come mi sono perso quando ho rivisto il mio codice? Hmm, scusa. Ad ogni modo, dovrebbe essere utile quando mi dici dove si è verificato l'errore. :) Sono anche sorpreso che abbia funzionato senza errori dalla mia parte. A proposito, prima stavo usando un hook diverso, quindi era un codice residuo. Ecco cosa dovrebbe risolvere il problema: if ($person->post_type=='towfiq-person') {. Fammi sapere ...
MikeSchinkel,

0

Basta aggiungere un loop di tipo di post personalizzato all'interno di author.php e utilizzare il modulo di commento di quel post personalizzato. L'ho fatto molte volte e funziona benissimo.

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


Aggiungi quanto sopra sopra o sotto il ciclo author.php
Pete
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.