管理者以外が投稿したコメントを管理者が編集したときに、そのコメントの著者(厳密にはuser_ID
?)を管理者に変更したいです。
フィルターのcomment_save_pre
にフックして、コメントが編集されたときに編集者が管理者権限を持っていて、尚且つ編集するコメントが管理者権限を持つ編集者以外だったらuser_ID
をその編集者(管理者)のものに書き換える処理にしたら良いのかなという大まかなイメージはあるのですが、具体的なコードが思いつかずに行き詰まっています。
コードの実例やアドバイスなど、何かしらの回答を頂けると嬉しく思います。
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
多分こんな感じでいけるのでは。
PHP
1// ID書き換え 2function my_pre_user_id( $user_id ) { 3 if ( is_user_logged_in() ) { 4 $user = wp_get_current_user(); 5 if ( $user->ID && $user->ID === 1 ) { // 書き換えたいユーザーIDを指定 6 $user_id = $user->ID; 7 } 8 } 9 return $user_id; 10} 11add_filter( 'pre_user_id' , 'my_pre_user_id' );
【pre_user_id | Hook | WordPress Developer Resources】
https://developer.wordpress.org/reference/hooks/pre_user_id/
PHP
1// 名前も書き換え 2function my_pre_comment_author_name( $name ) { 3 if ( is_user_logged_in() ) { 4 $user = wp_get_current_user(); 5 if ( $user->ID && $user->ID === 1 ) { // 書き換えたいユーザーIDを指定 6 $name = $user->display_name; // 表示名( $user->first_name / $user->last_name も使用可) 7 } 8 } 9 return $name; 10} 11add_filter( 'pre_comment_author_name', 'my_pre_comment_author_name' );
【pre_comment_author_name | Hook | WordPress Developer Resources】
https://developer.wordpress.org/reference/hooks/pre_comment_author_name/
pre_comment_author_name と pre_user_id は wp_filter_comment の中で呼ばれていて、wp_new_comment / wp_update_comment 双方から呼ばれているため、新規投稿でも更新でもフックが呼ばれます。
【comment.php in tags/4.5/src/wp-includes - WordPress Trac】
https://core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/comment.php#wp_filter_comment
管理者のみに絞り込んでいるこの箇所
PHP
1if ( $user->ID && $user->ID === 1 ) {}
は
PHP
1if ( $user->ID && $user->has_cap( 'install_plugins' ) ) {} 2/* OR */ 3if ( $user->ID && in_array( 'administrator', (array) $user->roles ) ) {}
と書いたほうがより汎用性が高いので追記。
追記:
コメントにflatさんが書かれていた通り、is_admin()
を使えば管理画面に絞れますよね、気付きませんでした。コメント周りのコードを追っていて更新時のみにする方法を思いついたので追記しておきます。'preprocess_comment'
は新規コメントにのみ使われるフックでかつ wp_filter_comment()
の前に実行されるので、そこで pre_comment_author_name
pre_user_id
のフィルターを外してしまう戦略です。
テストしていないので、きちんと動いた方のコードを優先して使ってください。(すいません、自己満足です)
PHP
1function my_preprocess_comment( $commentdata ) { 2 if ( is_admin() 3 && is_user_logged_in() 4 && current_user_can( 'administrator' ) 5 && isset( $commentdata[ 'comment_ID' ] ) // 確実に新規コメント時にしか実行されないはずだが 'comment_ID' が入っていないことを確認(問題無ければ削除してもよい) 6 && $commentdata[ 'comment_ID' ] > 0 // 〃 7 ) { // 新規投稿のみフックを無効化 8 remove_filter( 'pre_user_id' , 'my_pre_user_id' ); 9 remove_filter( 'pre_comment_author_name', 'my_pre_comment_author_name' ); 10 } 11 return $commentdata; 12} 13add_filter( 'preprocess_comment' , 'my_preprocess_comment' );
投稿2016/04/16 13:16
編集2016/04/17 09:12総合スコア69458
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/16 15:29 編集
2016/04/17 09:13
2016/04/18 10:07 編集