2020-10-28/2023-05-23

WordPress内でクラスを使う

WordPress内でクラスを使う

WordPressのプラグインを作成するときにクラスを使用した時に疑問に思った点について。

[ $this, 'my_function' ]

このようにして関数を指定することは知っていました。

後から思うと変な疑問なのですが、

「これに引数って持たせられないのか」

と思っていました。

そこで、いろいろ考えてみた結果です。

経緯

管理画面用のメニューを作っていた時、4つは同じ形で作成できるから同じ関数を呼び出せばよいかと思いました。(設定したい項目は同じな為)

ここまでの思考は問題ないはずです。。

add_submenu_page( 'my_add_admin_menu', '設定1', '設定1', 'manage_options', 'my_setting1', [ $this, 'my_setting_callback' ] );
add_submenu_page( 'my_add_admin_menu', '設定2', '設定2', 'manage_options', 'my_setting2', [ $this, 'my_setting_callback' ] );
add_submenu_page( 'my_add_admin_menu', '設定3', '設定4', 'manage_options', 'my_setting3', [ $this, 'my_setting_callback' ] );
add_submenu_page( 'my_add_admin_menu', '設定4', '設定4', 'manage_options', 'my_setting4', [ $this, 'my_setting_callback' ] );

ここまではいいのですが、以下の段階で困りました。

「settings_fields」のグループ名、「do_settings_sections」にページ名を入れなければならないです。

しかし、表示したいセクションはバラバラ、ページ名もバラバラです。

そこでひらめいたのが「引数を指定してあげればできそう」と思いたったわけです。

public function my_setting_callback() {
?>
<div>
<h2設定</h2>
<form action="options.php" method="post">
<?php
settings_fields( 'sample_setting' );
do_settings_sections( 'sample_setting' );
submit_button();
?>
</form>
</div>
<?php
}
[ $this, 'my_setting_callback', 'setting1' ]

のようにして引数が渡らないか試したりもしました。

add_submenu_page( 'my_add_admin_menu', '設定1', '設定1', 'manage_options', 'my_setting1', $this->my_setting_callback() );

のように関数を実行系にしたりもしました。

結局、どちらもはずれなわけで、期待した動きはしてくれませんでした。

最終的には「my_setting_callback」関数内で$_GETでどのページなのか判断する方法に落ち着きました。

結論

結論としては持たせることはできないと思います。

これ、関数を実行しているわけではなく、使用する関数を指定しているだけということです。

$this->my_function()

このように実行する形で書かれていれば、当然引数を持たせることはできます。

ですが、この場合読み込まれた時点で実行されます。そのため、すべての表示が管理画面トップページに表示されてしまいます。

同じ間違いをする人は少ないと思いますが、勘違いで同じことをした人の参考になればと思います。

2020 KumaTechLab.