検索フォームのテンプレートフックについて

  • このトピックには9件の返信、4人の参加者があり、最後にmimiにより5ヶ月前に更新されました。
10件の投稿を表示中 - 1 - 10件目 (全10件中)
  • 投稿者
    投稿
  • #20689
    Hatsuki
    閲覧者
    5

    トピックを新しく立てる方は次の項目も記述してください(要望トピックの場合は不要です)。

    【お使いの Snow Monkey のバージョン】v7.2.0
    【お使いのブラウザ】Safari
    【当該サイトのURL】(公開できる場合は書いていただいたほうがスムーズです)

    ===
    add_filter( 'snow_monkey_get_template_part_template-parts/common/search-form-404' ...
    とかならフックが効くようですが、
    add_filter( 'snow_monkey_get_template_part_template-parts/common/search-form' ....
    はフックが効かないようです。この場合、renderのフックでif文の分岐をするしかないでしょうか?

    検索フォームのフックを種類別に処理する際で、何か良い分岐方法があれば教えて欲しいと思います。

    0
    #20802
    キタジマ タカシ
    キーマスター
    339

    template-parts/common/search-form-xxx.php が僕の環境にはなかったので、試しに下記のコードを試してみたのですが、

    add_action(
    	'snow_monkey_get_template_part_template-parts/content/entry/content/content',
    	function( $name, $vars ) {
    		var_dump( $name );
    		?>
    		あいうえお
    		<?php
    	},
    	10,
    	2
    );

    固定ページでは string(3) "page" あいうえお、404 ページでは string(3) "404" あいうえお と、意図通り動いているようでした。

    ‘snow_monkey_get_template_part_xxx` フックはフックが1つまでしかかけれない(2個目以降は無視される)のでそこに引っかかっているとかですかね?

    なんらかアドオンをつくっている感じであれば、共有してもらえばこっちでも確認してみますよ!

    追伸:
    ちなみに ‘snow_monkey_get_template_part_xxxはアクションフックなので、add_filterじゃなくてadd_action` するのが正しいです。

    0
    #20863
    Hatsuki
    閲覧者
    5

    template-parts/common/search-form-xxx.php が僕の環境にはなかったので、試しに下記のコードを試してみたのですが、

    んーと、ちょっとやりたい事が上手く出来ないと言うか何と言うか…
    単純に検索フォームの位置を判別して置換を適用したいなと思ってます。

    ちょっとコードが適当ですが…

    add_filter( 'snow_monkey_template_part_render', [ $this, '_template_part_render' ], 10, 4 );
    
    public function _template_part_render( $html, $slug, $name, $vars ) {
    	if ( 'template-parts/common/search-form' !== $slug ) {
    		return $html;
    	}
    	echo $name;
    	ob_start();
    	View::render( 'form/index' );
    	$form_html = ob_get_clean();
    	$html = mb_ereg_replace(
    		'</form>',
    		$form_html . '</form>',
    		$html
    	);
    	return $html;
    }

    とした場合には、オーバーレイ時(overlay-search-box)、見つからない時(no-match)、404時(404)は$nameにも代入されて正しく反映されますが、
    サイドバー等のウィジェットで出している検索フォームに関してはフックが掛からないっぽいです。
    これをどうにかする場合、検索フォームの場合はget_search_formを使えばいけるっぽいんですが…そうした場合、全検索フォームに対して引っかかるが、フォームの位置判断が出来ない。

    フックが1つまでしかかけれない(2個目以降は無視される)

    ありゃ…それは気づかなかった…。と言うことは、自作してるアドオン系プラグインでは思い切り使ってるので他のプラグインで掛からなくなってたっぽいのもあったのかも。一度整理し直さないとですね…。ちょっと何か考えるとして、snow_monkey_get_template_part_template-は、なるべく使わないようにとりあえずの修正をすればって感じですか。
    renderフックなら問題なさそうなので、そっち使います。

    > 追伸:

    oh……適当に書いてしまってました。
    まあ、開発中はfilterで書いて後から直すって事の方が多いです…(actionフックはfilterって書いても動くし)

    0
    #20951
    キタジマ タカシ
    キーマスター
    339

    サイドバー等のウィジェットで出している検索フォームに関してはフックが掛からないっぽいです。

    検索ウィジェットは WordPress コアのものなので、 template-parts/common/search-form 経由では呼ばれてないんです。独自の検索フォームウィジェットをつくらないと難しいのかも…ですね。

    ありゃ…それは気づかなかった…。と言うことは、自作してるアドオン系プラグインでは思い切り使ってるので他のプラグインで掛からなくなってたっぽいのもあったのかも。一度整理し直さないとですね…。ちょっと何か考えるとして、snow_monkey_get_template_part_template-は、なるべく使わないようにとりあえずの修正をすればって感じですか。

    それぞれのフックの意図としては、

    snow_monkey_get_template_part_xxx … テンプレートをつくらなくても、 functions.php などから中身を定義できる
    snow_monkey_template_part_render … テンプレートの書き換え

    となります。 snow_monkey_get_template_part_xxx は書き換え用途ではなく、複数個フックした場合は最終のものだけが反映される形になって混乱するかなと思ったので、最初のだけ反映されるようにしています。なのでこれは基本エンドユーザーが使って、プラグインからは使わないほうがスマートかもしれませんね…。

    0
    #51563
    mimi
    参加者
    8

    こんにちは。お世話になっております!
    ドロワーメニューの検索ボックスのプレースホルダーを書き換える必要があり、テンプレートをいじろうとしているのですが、このスレッドを読む限り、template-parts/common/search-form を上書きしても意味がなく、Snow Monkeyの検索ボックスはコアから上書きされていない、searchform.phpが存在してない状態なのでしょうか?
    ドロワーメニュー template-parts/nav/drawer.php 自体をごっそり取っ替える方が早いですか??
    ベストプラクティスがあれば教えていただけると助かります。

    0
    #51575
    キタジマ タカシ
    キーマスター
    339

    えっと、ドロワーメニューの検索ボックスということだったら、それは

    Helper::get_template_part( 'template-parts/common/search-form', 'drawer' );
    

    というコードで呼び出されていて、実際に呼び出されるのは template-parts/common/search-form.php、その中身は

    get_search_form();
    

    だけとなっています。なので、最も簡単なのは子テーマか My Snow Monkey の中に template-parts/common/search-form-drawer.php をつくって、オリジナルな検索フォームをつくる方法かなと思います。

    3
    #51576
    キタジマ タカシ
    キーマスター
    339

    あ、もしかしたらご存知かもしれませんが、デバックモードが有効(WP_DEBUGtrue)になっているのであれば、HTML のソースコード中に、実際にどのテンプレートが呼び出されているかが HTML コメントとして出力されます。開発環境ではデバッグモードを有効化しておくと便利です!

    3
    #51586
    Kmical Lights
    参加者
    143

    私が元作っていた検索条件フォームの場合、
    get_search_form にフックを仕掛けて変更してました。
    多分、プレースホルダーでもこんな感じで置換すればいけるかと…。

    add_filter( 'get_search_form', [ __CLASS__, '_get_search_form' ], 9999, 1 );
    static function _get_search_form( $_html ) {
    	$_html = str_replace(
    		'<input type="search" placeholder="検索 &hellip;"',
    		'<input type="search" placeholder="ホゲホゲ &hellip;"',
    		$_html
    	);
    	return $_html;
    }

    しかし、この get_search_form フックの問題は、サイト内の全検索部分に掛かってくるって事で
    ドロワーとかの検索フォームだけに掛けたいってのが難しい感じですね。

    > キタジマ氏
    最後に読まれたテンプレート名を取得できるような関数とかあれば、何とかなるかもですが、そう言うのって Snow Monkey のテンプレート系の処理でもやれましたっけ?

    3
    #51608
    キタジマ タカシ
    キーマスター
    339

    @Kmical Lights さん

    最後に読まれたテンプレート名を取得できるような関数とかあれば、何とかなるかもですが、そう言うのって Snow Monkey のテンプレート系の処理でもやれましたっけ?

    これはないですねー。今回の場合はドロワー内の検索ボックスは

    Helper::get_template_part( 'template-parts/common/search-form', 'drawer' );
    

    で読み込まれているので、snow_monkey_template_part_render でやるのであれば、下記のような感じで絞り込みできます。

    add_filter(
    'snow_monkey_template_part_render',
    	function( $html, $slug, $name ) {
    		if ( 'template-parts/common/search-form' === $slug && 'drawer' === $name ) {
    			return str_replace( ... );
    		}
    		return $html;
    	},
    	10,
    	3
    );
    4
    #51877
    mimi
    参加者
    8

    お返事遅くなってすみません!
    vendor/inc2734/wp-basis/src/view/searchform.php が見つけられなかったので混乱しておりました。

    今回の案件では
    template-parts/common/search-form-drawer.php を作成して対応しようと思います、ありがとうございます!
    デバックモードも初っ端から大活用中です。素晴らしい機能をありがとうございます。
    お陰で大分と構成の理解が進みました!

    1
10件の投稿を表示中 - 1 - 10件目 (全10件中)
  • このトピックに返信するにはログインが必要です。