¿Comenta en la página de perfil de usuario?

9

Estoy tratando de crear un perfil de usuario personalizado con la guía de este tutorial: Cómo hacer una página de perfil de WordPress

Lo he implementado con éxito en mi tema, todo funciona bien. Ahora lo que quiero lograr es obtener la plantilla de comentarios en la página de perfil de usuario, donde otro usuario registrado puede publicar comentarios en su página de perfil, como el muro de Facebook o el shoutbox de last.fm.

Lo estoy intentando así:

En la página del autor se agrega esta línea:

<?php comments_template(); ?>

Pero no aparece. Luego intenté de esta manera: obtener comentarios de WordPress fuera de WordPress

Agrega bien la plantilla de comentarios, pero no funciona. Cuando hace clic en el botón Enviar, se redirige a una página en blanco.

Creo que el objetivo no se puede lograr fácilmente, requiere la creación de una base de datos personalizada para que cada usuario almacene los comentarios, ya que el sistema de comentarios solo almacena comentarios de cierta página o publicación, no para cualquier otra página como archivo o página de autor.

Si alguien me puede mostrar la dirección correcta, siempre estaré agradecido.

Gracias Towfiq I.

Towfiq
fuente

Respuestas:

13

Hola @Towfiq :

Los comentarios están relacionados en la base de datos con las publicaciones. Tendrá que hacer mucho trabajo para obtener comentarios que se relacionen con los usuarios.

¿Ha considerado crear un Tipo de publicación personalizado para los usuarios y luego usar un user_metacampo para almacenar el post_id, o un postmetacampo para almacenar el user_id, o ambos? Si hicieras eso, obtendrías los comentarios sin ningún esfuerzo.

ACTUALIZAR

Lo que sigue es un código desarrollado después de nuestra discusión en los comentarios.

He tenido la intención de escribir algo como esto durante mucho tiempo, pero su búsqueda de preguntas me hizo priorizar. Creé un 'towfiq-person'tipo de publicación personalizado para usted y lo configuré para agregar automáticamente una publicación de Persona cada vez que se agrega un Usuario y utiliza la dirección de correo electrónico como la clave de asociación en un campo personalizado de publicación llamado '_email'.

También asocia a un Usuario con una dirección de correo electrónico apropiada a la publicación de la Persona si un Usuario se agrega o actualiza con el mismo correo electrónico que una Persona existente (esto puede o no ser una buena idea). Y hace referencias cruzadas de Usuario con Persona y Persona con usuario que utiliza los campos postmeta y usermeta '_user_id'y '_person_id', respectivamente.

Por supuesto, estas son las reglas de negocios que elegí implementar, pero pueden resultar no ser apropiadas para su caso de uso, en cuyo caso es posible que deba modificarlas. También puede encontrar formas en que WordPress permite que estos dos se desincronicen, pero es difícil saberlo sin pruebas exhaustivas. Si encuentra problemas, siempre puede buscar actualizar la lógica para resolverlos.

Puede copiar el siguiente código en el functions.phparchivo de su 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();

Si necesita alguna aclaración sobre lo que hice y por qué, solo pregunte en los comentarios.

MikeSchinkel
fuente
Entonces, lo que sugiere es crear un tipo de publicación personalizado e implementar el bucle en la página del autor. ¿Y luego poner el formulario de comentarios para que otros usuarios puedan publicar comentarios en esa publicación en blanco? Pero los mismos comentarios se mostrarán en la página de perfil de cada usuario. Se puede evitar creando una función que cree automáticamente publicaciones personalizadas con el título del nombre de usuario con wp_insert_post () cuando un usuario está registrado. El autor de la publicación podría ser el usuario. Entonces, cuando sacamos el ciclo de la publicación, nos aseguramos de que se muestre la publicación con el autor = usuario. ¿Estoy en la dirección correcta? ¿Lo estoy haciendo complicado?
Towfiq
@Towfiq: De hecho, por usuario crea una publicación de su authortipo de publicación personalizada. Luego, en el taxonomy-author.phparchivo de plantilla, también consulta todas las publicaciones del autor actual y, por lo tanto, "falsifica" su página de autor. También puede hacerlo al revés (use la plantilla del autor e incluya la publicación personalizada), pero luego debe engañar el formulario de comentarios para usar la identificación de publicación correcta.
Jan Fabry
Gracias por tu respuesta Fabry. No tengo muy poco conocimiento sobre taxonomía. Traté de sacar algo de esta página: codex.wordpress.org/Template_Hierarchy#Custom Taxonomies display Pero fallé. ¿me puede decir qué es taxonomy-author.php y qué hará? y si lo intento al revés, ¿tienes idea de engañar a la identificación de la publicación? -gracias
Towfiq
@Towfiq: Mi error, no debería ser taxonomy-author.php, pero single-author.php. No crea una taxonomía personalizada, sino un tipo de publicación personalizada. El single-author.phpes el archivo de plantilla que se utiliza para mostrar una sola publicación del authortipo de publicación personalizada. Te sugiero que vayas de esta manera, es la más fácil (también puedes usar paginación ( /page/2/) si tienes muchas publicaciones de ese autor).
Jan Fabry
1
@Towfiq? ¿Cómo me perdí eso cuando revisé mi código? Hmm, disculpa. De todos modos, debería ser útil cuando me diga dónde ocurrió el error. :) También me sorprende que haya funcionado sin error. Por cierto, estaba usando un gancho diferente antes, así que ese era el código remanente. Esto es lo que debe solucionarlo: if ($person->post_type=='towfiq-person') {. Avísame ...
MikeSchinkel
0

Simplemente agregue un bucle de tipo de publicación personalizada dentro de author.php y use el formulario de comentarios de esa publicación personalizada. Lo he hecho muchas veces y funciona muy 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
fuente
Agregue lo anterior arriba o debajo del bucle author.php
Pete