-
投稿者投稿
-
2019年2月21日 4:38 PM #10830
優先度はかなり低いのですが、
テーマは子テーマでも本来は上書きできるのですが、プラグインの上書きって元のプラグインを変更する場合は、更新をすると変更点を更新されてしまうので、別のプラグインを作って中の処理を変えなければ出来ませんよね?
bbpress-supportやmember-postのアドオンプラグインについても、元のプラグインを変更することなくtemplatesを他のプラグインなどで上書き出来れば良いなと思いました。
難しいでしょうか?♥ 0いいねをした人: 居ません2019年2月21日 4:44 PM #10832Member Postの方は、多分このフィルターで出来るのかなと思ったのですが、
$template_path = apply_filters( 'snow_monkey_member_post_tepmlate_path', $template_path, $slug );
フィルタ名が誤字ってしまっているようでした…(>.<
こちらも合わせてご報告いたします……。また、このフックで変更出来ますでしょうか?
♥ 0いいねをした人: 居ません2019年2月21日 10:04 PM #10864言われてみて、確かにプラグイン版の
get_template_part()
みたいなのを Snow Monkey に持たせておけば、各アドオン間でビューの呼び出し方法を共通化できるし共通のカスタマイズ手法も提供できるので良いかなと思ったのですが、とはいえテーマの範疇でもないきがして、ちょっと悩むところですね。テーマに持たせずに小さな composer のライブラリとしてつくって、各アドオンでそれを使うというのはアリかもなと思ったり…。
Member Postの方は、多分このフィルターで出来るのかなと思ったのですが、
です! Snow Monkey Member Post v1.1.6 で正しい綴りに修正しました。間違った綴りにあわせてフックさせている場合は変更してください!
♥ 0いいねをした人: 居ません2019年2月21日 11:29 PM #10877テーマの範疇でもない
プラグインの範疇でも無い想定外の事を私の制作の方でやっちゃってるので、難しく考えることになっちゃって…申し訳ないです。
プラグインを幾つも作った際に、
snow_monkey_template_part_root
のフックを掛けちゃうと、Rootの取り合いになっちゃう為に上手く動作しなくなっちゃうから、配布するとか拡張目当ての共通プラグインでは使わないようにする等の注意は必要かなと思ったりしています。
slug などで分岐はできるのですが、同じテンプレートの場合は、優先度が高い低い関係なく最後に設定された return の値に合わせられてしまいますよね?また、
Helper::get_template_part
でフックしている template_parts を呼び出すと、その呼び出したテンプレートが同 filter をフックをしている場合は、無限ループに陥るので、それもremove_filter
で消したりする必要があるようなのですが、remove_filter
って無名関数とか使えない(?)ので、ちょっとそこだけ別 function で記述するなど、ややスムーズにならないーとか考えてしまっています…。上手くお互いのプラグインを上書きできる仕組みって、それこそテーマの範疇じゃないのですが、今後、そういうのも上手く使えるようになると嬉しいです。
ただ、他のテーマにない事でもありますし、ゆっくりと私の制作の方でも試行錯誤しながら良案を模索していければ良いなと思います。Snow Monkey Member Post v1.1.6 で正しい綴りに修正しました。
ありがとうございます!メンバー限定のテンプレートフックなども色々試していきます!♥ 0いいねをした人: 居ません2019年2月21日 11:46 PM #10882プラグインを幾つも作った際に、
snow_monkey_template_part_root
のフックを掛けちゃうと、Rootの取り合いになっちゃう為に上手く動作しなくなっちゃうから、配布するとか拡張目当ての共通プラグインでは使わないようにする等の注意は必要かなと思ったりしています。ぐわーそうか、もともと「子テーマの代替」で考えていたので、ちょっとそこ配慮が不足していました。単一のルートを返すのではなく、配列にして、そのルートにあれば使う、なければ次のルートを使う、みたいなフックのほうが良さそうですね。いまさら
snow_monkey_template_part_root
を変更するとちょっと影響が大きそうなので、別なフックを追加する等で良い感じにできないか試行錯誤してみます。slug などで分岐はできるのですが、同じテンプレートの場合は、優先度が高い低い関係なく最後に設定された return の値に合わせられてしまいますよね?
ですね。フックは一般的には優先度が高いものほど後で実行されるだったかなと思います。
また、
Helper::get_template_part
でフックしている template_parts を呼び出すと、その呼び出したテンプレートが同 filter をフックをしている場合は、無限ループに陥るので、それもremove_filter
で消したりする必要があるようなのですが、remove_filter
って無名関数とか使えない(?)ので、ちょっとそこだけ別 function で記述するなど、ややスムーズにならないーとか考えてしまっています…。ちょっと「また、Helper::get_template_partでフックしているtemplate_partsを呼び出すと、その呼び出したテンプレートが同filterをフックをしている場合は、無限ループに陥る」を具体的に想像できなかったのですが、確かに
remove_filter()
は無名関数消せないですね…。♥ 0いいねをした人: 居ません2019年2月22日 12:23 AM #10884具体的に想像できなかったのですが、確かに remove_filter() は無名関数消せないですね…。
template-parts/common/infobarだと、その中で呼ばれているので、こんな感じでしょうか?
add_filter( 'snow_monkey_get_template_part_template-parts/common/infobar', function( $name, $vars ) { ob_start(); \Framework\Helper::get_template_part( 'template-parts/common/infobar' ); // このフックが呼ばれ続けるので無限ループに $html = ob_get_clean(); echo $html; }, 10, 2 );
♥ 0いいねをした人: 居ません2019年2月23日 4:35 PM #11000あ、なんというか、そういうことをしないといけないシチュエーションが思い浮かばない…という感じでして。単純に中でテンプレートを呼びだしたいだけだとしたら、
add_filter( 'snow_monkey_get_template_part_template-parts/common/infobar', function( $name, $vars ) { ob_start(); \get_template_part( 'template-parts/common/infobar' ); $html = ob_get_clean(); echo $html; }, 10, 2 );
のように、コアの
get_template_part()
を使うのはどうでしょう?♥ 0いいねをした人: 居ません2019年2月24日 12:14 AM #11005コアの get_template_part() を使うのはどうでしょう?
そういうことをしないといけないシチュエーションが思い浮かばない確かに、コアのget_template_part()を使うと、思い浮かばなかったです……
ただ、一つ思ったのですが…
コアのget_template_part()を使った場合は、my_snow_monkeyで、templateのrootをフックで変更して、置換した場合、別のプラグインは、my_snow_monkeyで変更されたtemplateファイルを取れないのかなと。
多分ですが、別のプラグインでは、コアのget_template_partを使ってしまうと問題が起こるんじゃないかなと思っています。
my_snow_monkey以外の他のプラグインでは、コアのget_template_partを使ってしまうと、テーマ側のファイルを見てしまうので、my_snow_monkeyに置かれているtemplateのファイルを参照しない…と言うことにならないでしょうか?
それがHelperを使ったget_template_partだとrootが設定されているので、他のプラグインでもmy_snow_monkeyのtemplate_partsを見ますし、それが無い場合は最終的にはテーマ側のtemplate_partsを参照するので、正しくmy_snow_monkeyの上書き結果を他のプラグインも見れるんじゃと思ってます。
単純にHelper::get_template_part()で呼び出すと、無限ループするtemplate_partsもあると言うだけで全てが使えない訳でもないですが、ちょっと注意が必要かなと言う感じです。Helper::get_template_part()で呼び出した場合でも、その呼び出しているフックを無限ループにならないように、removeしてあげれば使えますし、実際には今のままでも問題はないです。ただ、そう考えながら、今、フォーラムに書いてて気づいたのですが、
そもそもtemplate_partsのフックしたhtmlって複数のプラグインで結果を共有して置換出来ないんじゃ……と。
my_snow_monkeyでフックしてAをBに置換とした場合、別のプラグインで優先度を下げてそのフックのCをDに置換しても、置換後のhtmlを取れていないので、AをBに置換した結果ってget_template_part()で取得したhtmlで反映できないんじゃ…と今、思いました。
2つ以上のプラグインで置換した場合の結果って、最終的にフックを掛けたCをDにすると言う結果だけが表示されるのかなって。これも、もともと「子テーマの代替」で考えていたキタジマさんの設計思想をかなり無視して難しく勝手に考えている事でもあります。申し訳ありません。
これもまた想定外のことを難しく勝手に考えてしまっているだけかもしれません…。しかし、フックで上書きを使い、2つ以上のプラグインで拡張させてみると言う考えはまだ捨てず、上手くプラグイン同士が両立出来る仕組みをもう少し試行錯誤してみたいとも思っています。
♥ 0いいねをした人: 居ません2019年3月7日 10:00 AM #11517そもそもtemplate_partsのフックしたhtmlって複数のプラグインで結果を共有して置換出来ない
後から優先度の問題だったことに気づきまして、複数のプラグインでも結果を共有した形で置換出来ました。
上書きする際は優先度を9999など高くして一番最初に上書きさせる、カスタマイザーなどの場合や置換の場合など10より低くしたりする事で、先にSnow Monkeyが読み込んでいるフック処理などを実行させるなどする事で正しく反映が出来ました。
こちら、多数のプラグインで結果を上書きできるのを確認できましたので、こちらの問題はスルーしてください。。。また5.3.0からのsnow_monkey_template_part_root_hierarchyフックの追加、ありがとうございます。
そのフックと、検索ボックスのテンプレートパーツとして呼び出すアップデートとカスタム投稿ではtemplates/view/content-XXX.phpが呼び出される仕様などから、
template_partsにプラグインからもっと上手くフックを使って色々出来ないかとか試したい事も増えましたので、
色々と試したいと思います。試した結果などは、今後何らかの形でお伝えできればと思います。ほぼ解決できたのではないかと思えるので、一度このトピックを閉じさせていただきます。
♥ 0いいねをした人: 居ません -
投稿者投稿
- トピック「アドオンプラグインのtemplatesを上書きしたい」には新しい返信をつけることはできません。