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

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

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

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

Q&A

解決済

2回答

497閲覧

自分で作った関数の引数が持つそれぞれの意味とは?

makii

総合スコア8

WordPress

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

0グッド

0クリップ

投稿2020/02/20 11:23

前提・実現したいこと

このコードがなぜタイトルに 「 」 がつくのか教えてください。
これはthe_title();で出力した際に「the_title();」になるというフックのようです。
しかしこのfunctionはテンプレートタグでもなく独自で作ったものですし、$titleもグローバル変数ではないはずです。
なぜどんな意味を持つかも指定されていないはずの第一引数($title)を挟むことによって、「the_title();」が実現されるのでしょうか、教えてください。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード function test_function( $title, $id = null){ return '「'.$title.'」'; } add_filter( 'the_title', 'test_function',10,2 );

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/20 11:33

フィルターフックについては調べましたか?
guest

回答2

0

onodaさんの回答と重複しますがWordPressのソースコードは読まれまたでしょうか?
一部抜粋すると、以下のようにapply_filters関数でthe_titleに紐づくフック関数をコールしています。
その際の1つめの引数がtitle、2つめの引数がidになるように設定しています。
ご自身が作成されたtest_function関数の戻り値がapply_filtersの戻り値になります。

PHP

1wp-includes\post-template.php 2 3function get_the_title( $post = 0 ) { 4 $post = get_post( $post ); 5 $title = isset( $post->post_title ) ? $post->post_title : ''; 6 $id = isset( $post->ID ) ? $post->ID : 0; 7 8 (省略) 9 10 /** 11 * Filters the post title. 12 * 13 * @since 0.71 14 * 15 * @param string $title The post title. 16 * @param int $id The post ID. 17 */ 18 return apply_filters( 'the_title', $title, $id ); 19}

投稿2020/02/20 23:28

tabuu

総合スコア2449

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

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

makii

2020/02/21 12:37

ありがとうございました!フックも奥が深いのですね
guest

0

ベストアンサー

提示のコードはthe_titleフィルターフックにtest_function関数をフックしている、つまり、the_title関数を実行するとthe_title関数で出力される文字列がtest_function関数で処理されてから出力されるようになるということです。

the_titleフィルターの実体はwp-includes\post-template.phpget_the_title関数内にあります。

「WordPress フィルターフック」とかのキーワードで調べるとたくさんのページで解説されていますので、参考にしてみてください。

追記(以下二件のコメントを受けて)

回答ありがとうございます。フックの効果とはthe_titleが読まれた時に関数を実行するだけですよね?例えばthe_titleの後ろに!をつけたいなら、関数内は$title . '!' );になりますよね、、しかしなぜそれが変数で書かれているのか、しかも第一引数で指定したものなのかがわかりません。function test_function{ return linkbefore,linkafterとかでいいのではないのですか?なぜワードプレスは$titleをグローバル変数でもないのに、the_title();で出力されたタイトルの代わりと判断できるのですか??

例えば、このフィルターフックの効果に、実行する関数の第一引数をタイトルと見なし、タイトルに付け加えたい記述は、’文字列’ . 第一引数で適当に決めたもの . '文字列’で書きなさいと決められているならわかりますが、、

テンプレートタグでもないのに(独自の関数)、第一引数をタイトルがあるべきところとみなす、なんてワードプレスはわかるのですか?
’文字列’ . 第2引数で適当に決めたもの . '文字列’ や、 ’文字列’ . 引数に書いておらず、さらに変数でもないもの . '文字列’ でもちゃんと文字列は付け加えられるのでしょうか。

  • フィルターフックした関数にはapply_filterで指定された変数が順番に引数として渡される
  • フィルターフックした関数に渡される第一引数はフィルターする値である
  • フィルターフックした関数はフィルターした値(加工した値)を戻り値とする

と、WordPressの仕組みでで決まっているという点を理解してください。

フックした関数側では別に引数の名前はなんでもよいです。たとえば以下でも構いません。

PHP

1function test_function( $aiueo, $id = null){ 2 return '「'.$aiueo.'」'; 3} 4add_filter( 'the_title', 'test_function',10,2 );

もし、この構造に不自然さを感じるようであれば、ご自分でPHPコードを書いて、WordPressのフィルターフックの仕組みを変更すればよいと思います。

投稿2020/02/20 11:46

編集2020/02/20 23:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

makii

2020/02/20 14:06

回答ありがとうございます。フックの効果とはthe_titleが読まれた時に関数を実行するだけですよね?例えばthe_titleの後ろに!をつけたいなら、関数内は$title . '!' );になりますよね、、しかしなぜそれが変数で書かれているのか、しかも第一引数で指定したものなのかがわかりません。function test_function{ return linkbefore,linkafterとかでいいのではないのですか?なぜワードプレスは$titleをグローバル変数でもないのに、the_title();で出力されたタイトルの代わりと判断できるのですか??
makii

2020/02/20 14:18 編集

例えば、このフィルターフックの効果に、実行する関数の第一引数をタイトルと見なし、タイトルに付け加えたい記述は、’文字列’ . 第一引数で適当に決めたもの . '文字列’で書きなさいと決められているならわかりますが、、 テンプレートタグでもないのに(独自の関数)、第一引数をタイトルがあるべきところとみなす、なんてワードプレスはわかるのですか? ’文字列’ . 第2引数で適当に決めたもの . '文字列’ や、 ’文字列’ . 引数に書いておらず、さらに変数でもないもの . '文字列’ でもちゃんと文字列は付け加えられるのでしょうか。
makii

2020/02/21 12:39

ありがとうございます!そう決まってないとおかしいですよね、、フックの裏側のファイルの動作をのぞいてみる契機になりそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問