コメント投稿で更新日を変更したい
-
初めまして、WP初心者です。よろしくお願い致します。
プラグインを使わずに掲示板を作成しています。
コメント投稿順に投稿ページを表示して1~2件の最終コメントを表示したいと考えています。
こちらのイメージです
ttp://www.ashh.net/bbs/index.php「get_comments」では、同じ投稿ページが出てくるので無理と考えて更新順で並べる方法を考えました。
しかし、コメントでは更新日は変更されないようなので、困っています。
コメント投稿で更新日を変更する方法
もしくは
その他で実現できる方法がありましたら、ご教授お願いしたいです。よろしくお願い致します。
-
考え方だけですが例えば
- 「コメントが投稿された時に呼び出されるフック」を使って、そのコメントが付けられた投稿のカスタムフィールドに(その時の)日時を入れる。
- 投稿一覧のメインループについて pre_get_posts を使って、カスタムフィールドに入っている日時で並べ替える。
不勉強なもので「コメントが投稿された時に呼び出されるフック」が何という名前か知らないのですが。(余談ですが、投稿されたコメントが承認待ちならカスタムフィールドを更新しないとか、承認待ちの投稿済みコメントが後から承認されたらカスタムフィールドを更新するとかも考慮したほうがよいかも。)
2番は下記のトピックが参考になると思います。
[解決済み] 検索結果をカスタムフィールド「ふりがな」毎に並べたいこんにちわ、
凄くシンプルに
コメントが投稿される度に投稿データの post_modified を更新するのはいかがですか?
こんな感じで処理はできます。function my_wp_insert_comment( $comment_id, $comment ) { // 省略 // ここで対象のポストの post_modified を更新する。 } add_filter( 'wp_insert_comment', 'my_wp_insert_comment', 10, 2 );
$comment_id
には新しく作成されたコメント ID、$comment
の中にはコメントの情報が Object で入っています。
こんな感じです。object(stdClass)#434 (15) { ["comment_ID"]=> string(3) "132" ["comment_post_ID"]=> string(4) "2664" ["comment_author"]=> string(12) "KUCKLU" ["comment_author_email"]=> string(23) "kuck1u@example.com" ["comment_author_url"]=> string(0) "" ["comment_author_IP"]=> string(12) "192.168.xxx.xxx" ["comment_date"]=> string(19) "2015-02-12 09:45:55" ["comment_date_gmt"]=> string(19) "2015-02-12 09:45:55" ["comment_content"]=> string(72) "テストコメントです。" ["comment_karma"]=> string(1) "0" ["comment_approved"]=> string(1) "0" ["comment_agent"]=> string(121) "Mozilla/x.x (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/xxx.xx (KHTML, like Gecko) Chrome/xx.x.xxx.xxx Safari/xxx.xx" ["comment_type"]=> string(0) "" ["comment_parent"]=> string(1) "0" ["user_id"]=> string(1) "0" }
gblsm 様
KUCKLU 様
ご指導ありがとうございます。某サイトの方から、ご教授いただきまして下記のコードでコメント投稿でページの更新日を変更する事が出来ました。感謝です。
add_action( ‘comment_post’, ‘my_comment_post’, 15, 1 );
function my_comment_post( $comment_ID ) {
$comment_data = get_comment( $comment_ID );
$my_data = array();
$my_data[‘ID’] = $comment_data->comment_post_ID;
$my_data[‘post_modified’] = $comment_data->comment_date;
$my_data[‘post_modified_gmt’] = $comment_data->comment_date_gmt;
wp_update_post( $my_data );
}
正直このコードに意味は良くわかっていないのですが、結果として実現できています。これで「最新コメント順で投稿ページ一覧を出力」は出来たのですが、そこに最新コメント1件を追加しての一覧は出来ませんでした。
当初の目標は「最新コメント順で投稿ページ一覧&その投稿での最新コメント1件を表示」なので、達成!とは言えない状態です。
私が調べた結果では、出来ない!ように感じました。
ですが、出来るよ!とのご意見を待ちたいです。よろしくお願い致します。
例えば投稿のタイトルを
the_title()
で表示できている時は、投稿IDをthe_ID()
で取得してから、その投稿IDとソート順(降順)とコメント数(1)を指定してget_comments()
を呼び出せば最新コメントを取得できます。参考: Function Reference/get_comments
これで「最新コメント順で投稿ページ一覧を出力」は出来たのですが、そこに最新コメント1件を追加しての一覧は出来ませんでした。
使っておられるテーマや、テンプレートに書かれたphpコードがわからないと、上記よりも具体的な意見を貰うのは難しいのではないでしょうか。
gblsm 様
KUCKLU 様
ありがとうございます。出来る!と分かっただけで有りがたいのですが、実際にどうすれば良いのか?は全くイメージ出来ていないです。
テーマは5年以上前のテーマを勝手に変更して使っていたモノを引っ張りだして使っているので名前もわからないです。
phpコードは必要であればUPしますので、いつでも要求して下さい。
さて本題に入りますが、query postsで取得しようとするとコメントタグではエラーとなりました。
なので出来ない!と勝手に判断していましたが、どのようなコードであれば表示できるのでしょうか。
ヒントだけでも十分なので、宜しくお願いします。query postsで取得しようとするとコメントタグではエラーとなりました。
pachilarさん、先ほどのコメントにヒントを書いてありますよ。ゆっくり、読んでくださいね。以下に、繰り返します。
例えば投稿のタイトルを the_title() で表示できている時は、投稿IDを the_ID() で取得してから、その投稿IDとソート順(降順)とコメント数(1)を指定して get_comments() を呼び出せば最新コメントを取得できます。
gblsm 様
ありがとうございます。何度やってもエラーとなり上手く出来ないです。
現在は
<?php $args = array( 'category' => 34, 'numberposts'=> -1, 'orderby' => 'modified' ); $postslist = get_posts( $args ); foreach ( $postslist as $post ) : setup_postdata( $post ); ?> <span>◆ <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><?php comments_number('(0)','(1)','(%)'); ?> </span> <?php endforeach; wp_reset_postdata(); ?>
このようなコードで更新順にタイトルとコメント数は表示できています。
ご指摘いただいたようにget_comments()を追加する方向でやってみましたが、ダメでした。
甘えてばかりで申し訳ありませんが、どのようにget_comments()を追加すれば良いのか、ご指導いただければと思います。(すみません)前回上げたコードですが「comment_post」を使うと保留コメントやスパムでも更新されてしまうので「wp_insert_comment」こちらへ変更しました。
pachilarさん
「やってみましたが、ダメでした」だけではコメントしようと思っても情報不足でコメントし辛いですよ。ダメだったphpコードを示した方がアドバイスを貰いやすいと思います。
それで、こんな風にして出力できました。
<?php $args = array( 'category' => 34, 'numberposts'=> -1, 'orderby' => 'modified' ); $postslist = get_posts( $args ); foreach ( $postslist as $post ) : setup_postdata( $post ); ?> <div>◆ <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><?php comments_number('(0)','(1)','(%)'); ?> </div> <div>最新コメント: <?php $comments = get_comments( array( 'post_id' => get_the_ID(), 'number' => 1 ) ); wp_list_comments( array(), $comments ); ?> </div> <?php endforeach; wp_reset_postdata(); ?>
gblsm 様
コードまで書いて頂きありがとうございます。確かにダメだったとだけ言われても答えような無いですよね。
これからは気を付けます。書いていただいたコードで表示は出来たのですが、日付についているコメントへのリンクがページ送りの最初になっていて機能していませんでした。
Greg’s Threaded Comment Numberingプラグインの為にcallbackが掛っているのが原因かも知れません。
他の表示方法として
<?php $comments = get_comments( array( 'post_id' => get_the_ID(), 'status' => 'approve', 'number' => 1 ) ); $post = get_post($comment->comment_post_ID); ?> <?php comment_text(); ?>
これでは同じコメントしか出てこない結果となりました。
wp_list_commentsでしか表示は出来ないのでしょうか?
Greg’s Threaded Comment Numberingプラグインの為にcallbackが掛っているのが原因かも知れません。
そのプラグインを停止してみて、コメントへのリンクが正しく機能すれば、プラグインが原因でしょう。
他の表示方法として
<?php 中略 ?> <?php comment_text(); ?>
これでは同じコメントしか出てこない結果となりました。
関数
comment_text
を引数無しで呼び出しているので、いつも同じコメントになりますよ。comment_text
の説明を確かめてください。
テンプレートタグ/comment_text
それから、get_comments
を呼び出した後にget_post
を改めて呼び出す必要はないと思います。get_comments
の戻り値はコメントオブジェクトの配列なので(今回はnumber
を 1 にしたので要素は一つですが)、配列の要素を取り出せばそれがコメントオブジェクトですから。下記のようになります。
<?php $comments = get_comments( array( 'post_id' => get_the_ID(), 'status' => 'approve’, 'number' => 1 ) ); $mycomment = reset( $comments ); comment_text( $mycomment->comment_ID ); comment_date( 'Y/n/j G:i:s T', $mycomment->comment_ID ); ?>
get_comments
の説明も確かめてくださいね。
Function Reference/get_commentsgblsm 様
ありがとうございます。感謝とともに上手く出来ない自分に歯痒いです。<?php $comments = get_comments( array( 'post_id' => get_the_ID(), 'status' => 'approve’, 'number' => 1 ) ); $mycomment = reset( $comments ); comment_text( $mycomment->comment_ID ); comment_date( 'Y/n/j G:i:s T', $mycomment->comment_ID ); ?>
こちらのコードでは表示はされるのですが
numberが効かず1件のみコメント表示
<?php comments_link(); ?>・<?php comment_ID(); ?>が効かない
コメントへのリンクは付けられませんでした。どちらもパラメータが効かず$mycomment->comment_IDが使えない&ループの中で使うらしく結果的に無理でした。
<?php $args = array( 'category' => 34, 'numberposts'=> -1, 'orderby' => 'modified' ); $postslist = get_posts( $args ); foreach ( $postslist as $post ) : setup_postdata( $post ); ?> <div>◆ <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><?php comments_number('(0)','(1)','(%)'); ?> </div> <div>最新コメント: <?php $comments = get_comments( array( 'post_id' => get_the_ID(), 'number' => 1 ) ); wp_list_comments( array(), $comments ); ?> </div> <?php endforeach; wp_reset_postdata(); ?>
こちらのコードも再トライしましたが、やはりコメントへのリンクが効かずプラグインを停止しても変わりませんでした。
プラグインを使って
wp_list_comments( array(‘type’ => ‘comment’,’status’ => ‘approve’,’callback’ => ‘gtcn_basic_callback’) , $comments );
と書いてみましたがダメでした。使い勝手の面から最初の(wp_list_commentsを使わない)方法でnumberが有効となりコメントへのリンクが出来れば理想的なのですが・・・・・
gblsm 様には何度もお世話になっていますので、お時間のある時にご教授いただければと思います。
急がず待ちますので、申し訳ありませんが宜しくお願い致します。横から失礼します。
コメントへのリンク
というのがよく分からないのですが・・・
こういうことですかね?
※ループはメインループでやってますので、適当にサブループに変えるなりしてください。<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <div>◆ <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div> <?php $comment_args = array( 'post_id' => get_the_ID(), 'number' => 2, 'type' => 'comment', 'status' => 'approve' ); $comment_data = get_comments( $comment_args ); foreach ( $comment_data as $comment ) : comment_text( $comment->comment_ID ); comment_date( 'Y/n/j G:i:s T', $comment->comment_ID ); endforeach; if ( comments_open() || get_comments_number() ) : ?> <div> <?php comments_popup_link( __( 'Leave a comment', 'mytheme_text_domain' ), __( '1 Comment', 'mytheme_text_domain' ), __( '% Comments', 'mytheme_text_domain' ) ); ?> </div> <?php endif; endwhile; endif; ?>
- トピック「コメント投稿で更新日を変更したい」には新たに返信することはできません。