Коментуючи сторінку профілю користувача?


9

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

Я успішно втілив її в свою тему, все працює добре. Тепер я хочу досягти шаблону коментарів на сторінці профілю користувача, де інший зареєстрований користувач може розміщувати коментарі на своїй сторінці профілю, як-от стіна facebook або shoutbox last.fm.

Я пробую це так:

На сторінці автора я додав цей рядок:

<?php comments_template(); ?>

Але це не з’являється. Потім я спробував такий спосіб: отримуйте коментарі до WordPress поза WordPress

Він додає шаблон коментаря в порядку, але не працює. При натисканні на кнопку подання він перенаправляє на порожню сторінку.

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

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

Спасибі Towfiq I

Відповіді:


13

Привіт @Towfiq :

Коментарі в базі даних пов'язані з повідомленнями. Вам потрібно буде зробити багато роботи, щоб коментарі стосувалися користувачів.

Чи обмірковували ви створити користувацький тип публікації для користувачів, а потім використовуєте або user_metaполе для зберігання post_id, або postmetaполе для зберігання user_idабо обидва? Якби ви це зробили, тоді ви б зовсім не доклали коментарів.

ОНОВЛЕННЯ

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

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

Він також пов'язує користувача з відповідним адресою електронної пошти на пост Person при додаванні користувача або оновлюється з тієї ж електронної пошти в якості існуючого особи (це може або не може бути гарною ідеєю.) І перехресні посилання користувача з особи і люди за допомогою користувача 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();

Якщо вам потрібні роз'яснення, що я робив і чому, просто запитайте в коментарях.


Отже, те, що ви пропонуєте, це створити спеціальний тип публікації та впровадити цикл на сторінку автора. А потім виставити форму коментарів, щоб інші користувачі могли публікувати коментарі до цієї пустої публікації? Але однакові коментарі будуть показані на кожній сторінці профілю користувачів. Цього можна уникнути, створивши функцію, яка автоматично створить власну публікацію із заголовком імені користувача з 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спеціального типу публікації. Я пропоную вам піти цим шляхом, це найпростіше (ви також можете користуватися пейджингом ( /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


Додайте вище або нижче авторський цикл
Піт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.