ユーザープロフィールページにコメントしますか?


9

このチュートリアルのガイダンスでカスタムユーザープロファイルを作成しようとしています:WordPressプロファイルページの作成方法

私はそれを私のテーマにうまく実装しました、すべてがうまくいきます。ここで私が達成したいのは、ユーザープロファイルページでコメントテンプレートを取得することです。他の登録済みユーザーは、Facebookの壁や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がこれら2つを同期させない方法を見つけることもできますが、徹底的なテストを行わずにそれを知ることは困難です。問題が見つかった場合は、いつでもロジックを更新して解決することができます。

次のコードをテーマの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()でユーザー名のタイトルでカスタム投稿を自動作成する関数を作成することで回避できます。投稿の作成者がユーザーである可能性があります。つまり、投稿のループをプルするときに、author = userを含む投稿が表示されることを確認します。私は正しい方向にいますか?複雑にしていますか?
Towfiq 2010

@Towfiq:実際、ユーザーごとにauthorカスタム投稿タイプの投稿を1つ作成します。次に、taxonomy-author.phpテンプレートファイルで、現在の作成者のすべての投稿をクエリし、作成者のページを "偽装"します。別の方法で作成することもできます(作成者テンプレートを使用し、カスタム投稿を含めます)が、コメントフォームをだまして正しい投稿IDを使用する必要があります。
Jan Fabry、

返信ありがとうございます。分類についての知識はほとんどありません。このページから何かを取得しようとしました:codex.wordpress.org/Template_Hierarchy#Custom Taxonomies displayしかし失敗しました。taxonomy-author.phpとは何で、何をするのか教えてください。そして、私が他の方法で試してみた場合、投稿IDを騙すことについて何か考えがありますか?
Towfiq

@Towfiq:私のミス、それはすべきではないtaxonomy-author.php、しかしsingle-author.php。カスタム分類法を作成するのではなく、カスタム投稿タイプを作成します。single-author.php単一のポスト表示するために使用されるテンプレートファイルでauthorカスタムポストタイプを。この方法をお勧めします。これが最も簡単です(/page/2/その著者からの投稿が多い場合は、ページング()を使用することもできます)。
Jan Fabry

1
@Towfiq?コードを確認したとき、どのようにそれを見逃しましたか?申し訳ありません。とにかく、どこでエラーが発生したかを教えてくれると、それはどれほど役立つでしょう。:)私はそれがエラーなしに私の側でうまくいったことにも驚いています。ところで、私は以前に別のフックを使用していたので、それは残りのコードでした。これを修正する必要があるのは次のとおりif ($person->post_type=='towfiq-person') {です。知らせて...
MikeSchinkel、2011年

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ループの下に追加
ピート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.