Комментирование на странице профиля пользователя?

9

Я пытаюсь создать собственный профиль пользователя, следуя инструкциям этого урока: Как создать страницу профиля WordPress

Я успешно реализовал это в моей теме, все работает хорошо. Теперь я хочу получить шаблон комментария на странице профиля пользователя, где другой зарегистрированный пользователь может оставить комментарий на странице своего профиля, например, на стене в Facebook или в чате на Facebook.

Я пытаюсь это так:

На странице автора я добавил эту строку:

<?php comments_template(); ?>

Но это не проявляется. Тогда я попробовал так: получить комментарии WordPress вне WordPress

Это добавляет шаблон комментария хорошо, но, не работает. Когда вы нажимаете кнопку «Отправить», она перенаправляется на пустую страницу.

Я думаю, что цель не достижима легко, она требует создания базы данных для каждого пользователя для хранения комментариев, поскольку система комментариев хранит комментарии только определенной страницы или сообщения, а не какой-либо другой страницы, такой как архив или страница автора.

Если кто-то может показать мне правильное направление, я буду вечно благодарен.

Спасибо Towfiq I.

Towfiq
источник

Ответы:

13

Привет @ Towfiq :

Комментарии связаны в базе данных с сообщениями. Вам нужно будет проделать большую работу, чтобы получить комментарии для пользователей.

Рассматривали ли вы создание пользовательского типа записи для пользователей, а затем использовали user_metaполе для хранения post_idили postmetaполе для хранения user_id, или и то , и другое? Если бы вы сделали это, вы бы получили комментарии без каких-либо усилий.

ОБНОВИТЬ

Далее следует код, разработанный после нашего обсуждения в комментариях.

Я давно хотел написать что-то подобное, но ваш вопрос заставил меня сделать это приоритетом. Я создал 'towfiq-person'для вас пользовательский тип записи и настроил его на автоматическое добавление сообщения Person при каждом добавлении пользователя, и он использует адрес электронной почты в качестве связующего ключа в настраиваемом поле сообщения с именем '_email'.

Он также связывает пользователя с соответствующим адресом электронной почты в сообщении о человеке, если пользователь добавляется или обновляется с тем же адресом электронной почты, что и существующее лицо (это может или не может быть хорошей идеей). Он также ссылается на пользователя с человеком и Пользователь с пользователем, использующий поля postmeta и usermeta '_user_id'и '_person_id', соответственно.

Это, конечно, бизнес-правила, которые я выбрал для реализации, но они могут оказаться неподходящими для вашего варианта использования, и в этом случае вам может понадобиться изменить их. Вы также можете найти способы, с помощью которых WordPress позволяет этим двум синхронизироваться, но это трудно понять без всестороннего тестирования. Если вы обнаружите проблемы, вы всегда можете обновить логику для их устранения.

Вы можете скопировать следующий код в functions.phpфайл вашей темы :

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

Если вам нужны какие-либо пояснения к тому, что я сделал и почему, просто спросите в комментариях.

MikeSchinkel
источник
Итак, вы предлагаете создать собственный тип записи и реализовать цикл на странице автора. А затем разместите форму комментария, чтобы другие пользователи могли оставлять комментарии к этому пустому сообщению? Но те же комментарии будут показаны для каждой страницы профиля пользователя. Этого можно избежать, создав функцию, которая будет автоматически создавать пользовательский пост с заголовком имени пользователя с помощью wp_insert_post () при регистрации пользователя. Автор поста может быть пользователем. Итак, когда мы вытягиваем цикл публикации, мы проверяем, что пост с автором = пользователь показывает. Я в правильном направлении? Я делаю это сложно?
Towfiq
@Towfiq: Действительно, для каждого пользователя вы создаете один пост с вашим authorпользовательским типом поста. Затем в taxonomy-author.phpфайле шаблона вы также запрашиваете все сообщения текущего автора и таким образом «подделываете» страницу своего автора. Вы также можете сделать это наоборот (использовать шаблон автора и включить пользовательский пост), но тогда вам нужно обмануть форму комментирования, чтобы использовать правильный идентификатор поста.
Ян Фабри
Спасибо за ваш ответ, Фабри. Я не очень мало знаю о таксономии. Я пытался извлечь что-то из этой страницы: codex.wordpress.org/Template_Hierarchy#Custom Таксономии, но не удалось. Можете ли вы сказать мне, что такое таксономия-author.php и что она будет делать? и если я попробую наоборот, у вас есть идея обмануть почтовый идентификатор?
Towfiq
@Towfiq: Моя ошибка, это не должно быть taxonomy-author.php, но single-author.php. Вы не создаете пользовательскую таксономию, а пользовательский тип сообщения. Это single-author.phpфайл шаблона, который используется для отображения одного сообщения authorпользовательского типа сообщения. Я предлагаю вам пойти по этому пути, это проще всего (вы также можете использовать paging ( /page/2/), если у вас много постов от этого автора).
Ян Фабри
1
@Towfiq? Как я пропустил это, когда пересмотрел свой код? Хм, прости. В любом случае, это должно быть полезно, если вы скажете мне, где произошла ошибка. :) Я также удивлен, что это сработало на моем конце без ошибок. Кстати, раньше я использовал другой хук, так что это был остаточный код. Вот что следует исправить: if ($person->post_type=='towfiq-person') {. Дайте мне знать ...
MikeSchinkel
0

Просто добавьте пользовательский цикл типа сообщения в author.php и используйте форму комментария этого пользовательского сообщения. Я делал это много раз, и это прекрасно работает.

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

Пит
источник
Добавьте выше или ниже цикл author.php
Пит