web-dev-qa-db-ja.com

検索フォームテンプレートがページに含まれる回数を数える

いくつかの場所に検索フォームがあるテンプレートがあります。各検索フォームは同じもので、テキスト入力、2つのラジオボタン、ラジオボタンに関連付けられた2つのラベル、および送信ボタンが含まれています。これはget_search_form()への最初の呼び出しではうまく機能しますが、それ以降の呼び出しでラベルをクリックすると現在のフォームではなく最初の入力が変更されます。

入力は基本的に次のようになります。

<input type="radio" name="example" id="firstOption" />
<label for="firstOption">First Option</label>

<input type="radio" name="example" id="secondOption" />
<label for="secondOption">Second Option</label>

あなたがすでに考え出したかもしれないように、問題はラベルが特定のIDをターゲットにしているということです、そして、それらのIDがページ上に複数回現れるので、それは問題を引き起こしています。

解決策は、get_search_form()を呼び出すたびにIDに番号が付けられるように変更することです。

<!-- first call... -->
<input type="radio" name="example" id="firstOption0" />
<label for="firstOption0">First Option</label>

<input type="radio" name="example" id="secondOption0" />
<label for="secondOption0">Second Option</label>

<!-- second call... -->
<input type="radio" name="example" id="firstOption1" />
<label for="firstOption1">First Option</label>

<input type="radio" name="example" id="secondOption1" />
<label for="secondOption1">Second Option</label>

私は現在セッション変数を通してこれを動かしています、しかし私はユーザーがページのまわりでブラウズするにつれて数が変わるのが好きではありません。フォームが呼び出されるたびにセッション変数に1を追加するように設定しているので、ユーザーがサイト内を移動しても、セッションが終了するまで入力IDは増え続けます。

各ページで同じ番号にしたいと思います。含まれているテンプレートに固定されていて、ページナビゲーション間で固定されていない変数を格納する別の方法はありますか?

1
JacobTheDev

ほんのいくつかの簡単なアイデア:

A)インスタンスカウントを処理するためにstatic変数と共にget_search_formフィルタを使用した1つの提案があります。

add_filter( 'get_search_form', function( $form )
{
    static $instance = 0;
    $instance++;

    // Setup your form here with the $instance variable as needed:
    $form = '<form>...</form>';

    return $form;
} );

B)もう1つの回避策は追加することです。

$instance = apply_filters( 'wpse_search_instance', 0 );

searchform.phpファイルに追加します。ここで、functions.phpファイルに以下を追加します。

add_filter( 'wpse_search_instance', function( $count )
{
    static $instance = 0;
    return ++$instance; 
} );

しかし、この場合も、この種のインスタンスカウントは別のフィルタコールバックによって変更できます。

C)それではsearchform.phpファイルの中でこうすることもできます。

do_action( 'wpse_search_instance' );

$instance = did_action( 'wpse_search_instance' );

インスタンスカウントを処理します。これは、あなたが他の場所でwpse_search_countingアクションを起動しないことを前提としています。

D)get_search_form()関数の中に次のフックがあります。

 do_action( 'pre_get_search_form' );

だから我々は呼び出すだけでいいでしょう:

$instance = did_action( 'pre_get_search_form' );

searchform.php内私はこれがこれまでで最も簡単な回避策だと思います。

2
birgire