🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

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

Q&A

解決済

2回答

1253閲覧

Wordpress 子テーマのプラグイン内の翻訳関数をフックに利用する方法

jo-ji

総合スコア16

WordPress

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

0グッド

0クリップ

投稿2021/01/25 03:48

編集2021/01/31 12:48

以下の質問の続きです。
Wordpress プラグイン カスタマイズについて
<回答>
フック( add_action() add_filter() )による変更が基本になります。
フックが無い場合は、場合によって対応が変わります。(プラグインの目的にもよります)

プラグイン内部で使用されている関数の内部にあるフックを使う
例えば、多言語化されたプラグインの場合、文字を出力する箇所で
__() _e() などの翻訳関数を使っていることがあるため、その関数自体のフックを利用する。

---------------------------------------------------------------以上引用終わり----

回答の中で、『 __() _e() など翻訳関数自体をフックに利用』とありますが、
書き方がわかりません。

(例)プラグイン events-manager

//翻訳関数 <label for='booking_comment'><?php _e('Comment', 'events-manager') ?></label> //翻訳関数へのフック function add_before_after( $data ){ $data = "ここから". $data . "ここまで"; return $data; } add_filter('Comment', 'add_before_after', 11);

上記の翻訳関数によるラベルにフィルターフックを掛けることは可能ですか?
例えば、ラベル名'booking_comment'の前後に文字を付け加えるfilterフック。
上記サンプルコードの修正点を教えてください。

又、通常フック[do_action() apply_filters()]と翻訳関数自体のフックでは
処理速度やシステムの安定性に差が出ますか?

もしくは通常フック以外は、出来るだけ避けた方が良いですか?

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、_eの'Comment'はフィルター名ではありません。
_eとは何をしているのかを確認すると

PHP

1function _e( $text, $domain = 'default' ) { 2 echo translate( $text, $domain ); 3}

となっており、translate関数を出力しているだけですね。
ではtranslate関数はどうなているかを確認すると

PHP

1function translate( $text, $domain = 'default' ) { 2 $translations = get_translations_for_domain( $domain ); 3 $translation = $translations->translate( $text ); 4 $translation = apply_filters( 'gettext', $translation, $text, $domain ); 5 $translation = apply_filters( "gettext_{$domain}", $translation, $text, $domain ); 6 return $translation; 7}

となっています。
*参考
https://developer.wordpress.org/reference/functions/translate/

ここで翻訳した結果を返しているわけですが、その前にapply_filtersが二つあります。
このフィルターを使うといいでしょう。
試していませんが

PHP

1add_filter('gettext_events-manager', 'add_before_after', 11,3); 2function add_before_after($translation, $text, $domain ){ 3 if($text = 'Comment'){ 4 $translation = "ここから". $translation . "ここまで"; 5 } 6return $translation; 7} 8

でいけるのではないでしょうか?

投稿2021/01/25 04:21

gogoweb_ikeda

総合スコア1426

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

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

kei344

2021/01/25 04:26

gettext_with_contextとかを通る可能性もあるので、場合によってはそのあたりも対応する必要があるとは思います。 【WordPressで翻訳ファイルを修正せずにテキストを変更する方法 – Simple Colors】 https://www.warna.info/archives/1581/
jo-ji

2021/01/25 06:30

>>でいけるのではないでしょうか? いけました。回答ありがとうございます。「翻訳関数にフックする」意味が分かりました。 ただ、プラグイン内のすべての_e()翻訳関数? ラベル?'Comment'?やダッシュボードに、 フィルターが作用しています。 フックポイントを限定する対策はありますか(ファイル名を追加するなど)? 対策が見つかりませんでした。対策があれば教えてください。 引数について教えてください。 関数の引数($translation, $text, $domain)は、どうして3つなのですか? $domainは、フィルター名[gettext_events-manager]で指定するから、不要では? 又、引数名は自由に選んでよいですか? (例)$label,$comment,$pluginなど 引数名の記載順番は、自由にしても良いですか?(例) $text, $domain,$translation 引数の意味が良くわかりませんでした。
gogoweb_ikeda

2021/01/25 07:01

>ただ、プラグイン内のすべての_e()翻訳関数? ラベル?'Comment'?やダッシュボードに、 >フィルターが作用しています。 >フックポイントを限定する対策はありますか(ファイル名を追加するなど)? >対策が見つかりませんでした。対策があれば教えてください。 特定のページや投稿時のみに限定するならis_pageやis_singleで判定するといいでしょう。 管理画面以外にするなら!is_adminがいいかもしれません。 *引数について 引数が3つなのは元のapply_filtersで3つの引数を渡しているからです。 使わない引数でも元のapply_filtersの引数の数だけ指定したほうが無難化と思います。 add_before_afterで使用している引数の名前は自由に変更できますが、順番はapply_filtersで指定された順番になります。 $foo = apply_filters("hoge",$arg1,$arg2,$arg3); add_filter("hoge","hogeFunc",10,3); function hogeFunc($a,$b,$c){ } だった場合は$arg1の内容が$aに、$arg2の内容が$bに、$arg3の内容が$cにはいることになります。 同じ変数名にしておいた方が混乱が少ないと思われます。 >kei344さん。 今回は_e()のみの表示でしたが他の翻訳関数も考慮にいれるならそちらの修正もしたほうがよさそうですね。
jo-ji

2021/01/25 10:12

>gogoweb_ikedaさん 親切かつ丁寧な説明、ありがとうございました。 m(_ _)m 今までの疑問が解けてスッキリしました。 深く感謝いたします。
guest

0

投稿2021/01/25 04:23

kei344

総合スコア69596

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

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

jo-ji

2021/01/25 05:44

kei344さん。あなたの約5年前の回答が、テラテイルで一番参考になっています。 今回も含め、回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問