質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1548閲覧

コメントを管理者が編集したときに、編集したコメントの著者を管理者に変更する

flat

総合スコア617

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2016/04/16 12:03

管理者以外が投稿したコメントを管理者が編集したときに、そのコメントの著者(厳密にはuser_ID?)を管理者に変更したいです。
フィルターのcomment_save_preにフックして、コメントが編集されたときに編集者が管理者権限を持っていて、尚且つ編集するコメントが管理者権限を持つ編集者以外だったらuser_IDをその編集者(管理者)のものに書き換える処理にしたら良いのかなという大まかなイメージはあるのですが、具体的なコードが思いつかずに行き詰まっています。
コードの実例やアドバイスなど、何かしらの回答を頂けると嬉しく思います。
よろしくお願い致します。

kei344👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
kei344

総合スコア69458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flat

2016/04/16 15:29 編集

回答して下さりありがとうございます。 IDだけでなく著者名にも対応して下さり大変感謝しています。 >新規投稿でも更新でもフックが呼ばれます。 更新時のみ適用というのが理想ですが、こればかりは仕方ないですね。 このようなフックがあることに全く気づいていなかったので大変助かりました。 ちなみに、回答して下さったコードは一部を次のように書き換えて使うことにしました。 if (is_admin() && is_user_logged_in() && current_user_can('administrator') && get_current_user_id() === 1) { $user = wp_get_current_user(); $user_id = $user->ID; } ずっと疑問に思いながら考え続けていたので本当に助かりました。 ありがとうございました。 --- このコメントを書いた後で追記に気付いてしまいました。 少し悩みますが、問題が無さそうに見えるのでとりあえずこのままのコードにしてみようと思います。
kei344

2016/04/17 09:13

さらに追記しました。
flat

2016/04/18 10:07 編集

細かな点までフォローして下さりありがとうございます。 追記して下さったコードですが、新規投稿時は無条件でフィルターを無効化したかったので、条件分岐を除いて利用することにしました。 動作の方もきちんと新規投稿時にフィルターが無効化され、更新・編集時にはフィルターが適用されていることを確認しました。 また、書き換えを行う関数の条件分岐なのですが、get_current_user_id() が「ログイン済みユーザーのIDを取得」する関数なので is_user_logged_in() は外すことにしました。 あとは get_current_user_id() でユーザーを特定しているので current_user_can('administrator') も動作的には外して良いのですが、やはり管理者権限を持っているかどうかはきちんと判別しておきたいので残しました。 追加の回答を頂いたことで新たな改善点にも気付くことができ、とても有意義な機会を得ることができました。 親切な心遣いに心より感謝致します:)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問