サポート » 使い方全般 » コメントを承認した時のアクションフックについて教えてください

  • 解決済 msthings

    (@msthings)


    コメントを承認した時のみ、更新日が更新されるコードを書きたいです。
    現在、下記コードで動いています。

    add_action( 'wp_set_comment_status', 'comment_modified', 15, 1 );
    function comment_modified( $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 );
    }

    しかし、このコードだとコメントをゴミ箱に入れたタイミングでも更新されてしまい、
    さらに削除する時にはNotice: Trying to get property of non-object inというエラーが出てしまいます。(削除自体はできています)
    このコードだとコメントのステータスが変わった全てのタイミングで更新日が更新されるような形になっていると思うのですが、これを”コメントを承認した時のみ”にすることはできますでしょうか?

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • フックする関数の第2引数でコメントの新しいステータスを受け取れるので、それを使って「承認時」を判定できます。
    WordPress › wp_set_comment_status | Hook | WordPress Developer Resources

    トピック投稿者 msthings

    (@msthings)

    add_action( 'wp_set_comment_status', 'comment_modified', 15, 1 );
    function comment_modified( $comment_ID, $comment_status ) {
    if ( 1 == $comment_status ) {
    $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 );
    }
    }

    こんな感じでやってみたのですができませんでした。。。
    どこが間違ってますでしょうか?
    書き方のヒントを頂けると助かります。

    トピック投稿者 msthings

    (@msthings)

    自分なりに調べて下記のコードで思い通りの動きになりました。
    が、スマートではないような気がします。。。

    add_action( 'wp_set_comment_status', 'comment_modified', 15, 1 );
    function comment_modified( $comment_ID ) {
    $status = wp_get_comment_status( $comment_ID );
    	if ( 'approved' == $status ) {
    		$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 );
    	}
    }

    問題ありませんでしょうか。。。?

    うろ覚えですが、wp_update_postをたたいたときに、post_modified, post_modified_gmtは更新されるはずだったので、

    $my_data['post_modified'] = $comment_data->comment_date;
    $my_data['post_modified_gmt'] = $comment_data->comment_date_gmt;

    は不要かと思います。

    ところで第二引数を取るには

    add_action( 'wp_set_comment_status', 'comment_modified', 15, 2 );

    のようにadd_actionの第4引数を関数へ渡す引数の数にしてください。

    (ところでそれだと承認以外のコメントの編集でも発火する気が。)

    あと、お節介かもしれませんが、最近コメントのついた記事の一覧などを作るのであれば、WP_Comment_Queryを使う方法もありますね。記事を更新したわけでも無いのに、更新がかかるのは自然では無いのでトラブルの火種になりそう。

    // WP_Comment_Query arguments
    $args = array (
    	'order'          => 'DESC',
    	'orderby'        => 'comment_date',
    );
    
    // The Comment Query
    $comment_query = new WP_Comment_Query;
    $comments = $comment_query->query( $args );
    
    foreach( $comments as $comment ) {
        $post_id = $comment->comment_post_ID; //コメントがついたページのID
        $post = get_post( $post_id );
         setup_postdata( $post ); ?>
    	<li>
    		<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    	</li>
        <?php
        endforeach;
     wp_reset_postdata();?>
    
    }
    トピック投稿者 msthings

    (@msthings)

    Toro_Unit (Hiroshi Urabe)さん、Hinaloeさんありがとうございます!
    お二人の助言を参考に下記コードで問題なく動くようになりました。

    add_action( 'wp_set_comment_status', 'comment_modified', 15, 2 );
    function comment_modified( $comment_id, $comment_status ) {
    if ( 'approve' == $comment_status ) {
    		$comment_data = get_comment( $comment_id );
    		$my_data = array();
    		$my_data['ID'] = $comment_data->comment_post_ID;
    		wp_update_post( $my_data );
     }
    }

    承認以外の動作(編集、ゴミ箱、削除)では動かなかったので大丈夫のようです。
    あ、あとこれはWPを掲示板のような形式にして利用しようと思っているので大丈夫かと思います。
    WP_Comment_Queryは初めて知ったのですが、コメントの並び替えをする時に使えますね!
    ありがとうございます!

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「コメントを承認した時のアクションフックについて教えてください」には新たに返信することはできません。