こんにちは
チェックを外すと表示される(グレーなど色変更)が選択できないようにしたく、
option タグに disabled を指定することになると思いますが、wpcf7_form_tag では指定出来ないようです。
ショートコードで出力される select タグを書換える (do_shortcode_tag フック辺り) ことになるのかなと思います。
例:
add_filter( 'do_shortcode_tag', function( $output, $tag, $attr ) {
if ( 'contact-form-7' == $tag || 'contact-form' == $tag ) {
// ここで select タグを書換える。
//$output = preg_replace( '/(.*?<select name="ドロップダウンメニューの名前.*?>)(.*?)(<\/select>)/i', '${1}<option value="foo" disabled>foo</option>${3}', $output );
}
return $output;
}, 10, 3 );
アドバイスありがとうございます!
まだそこまでできておりませんが、参考にいたします!
とりあえずひととおり動くサンプルコードを書いてみました。
add_filter( 'do_shortcode_tag', function( $output, $tag, $attr ) {
if ( 'contact-form-7' == $tag || 'contact-form' == $tag ) {
$id = 123; // コンタクトフォームの ID。
$name = 'menu-123'; // ドロップダウンメニューの名前。
$tax = 'foo'; // タクソノミーのスラッグ。
if ( $id == $attr['id'] ) {
$terms = get_terms( $tax, array( 'hide_empty' => false) );
$selected = get_the_terms( get_the_ID(), $tax );
$term_ids = array_column( $selected, 'term_id' );
$options = '';
foreach( $terms as $term ) {
$disabled = ( false !== array_search( $term->term_id, $term_ids ) ) ? '' : ' disabled';
$options .= '<option value="' . esc_attr( $term->name ) . '"' . $disabled . '>' . esc_html( $term->name ) . '</option>';
}
$output = preg_replace( '/(.*?<select name="' . $name . '\[\].*?>)(.*?)(<\/select>)/i', '${1}' . $options . '${3}', $output );
}
}
return $output;
}, 10, 3 );
ありがとうございます!
サンプルコードを、functions.phpに書き、下の値をそれぞれ変更し
$id = 123; // コンタクトフォームの ID。
$name = ‘menu-123’; // ドロップダウンメニューの名前。
$tax = ‘foo’; // タクソノミーのスラッグ。
管理画面のフォームも下記のように変更しましたが、
そのまま表示されるか、空っぽのselectボックスが表示されるかでうまく表示されません。。。
[menu-123]や[select menu-123]
-
この返信は3年、 6ヶ月前にilnelが編集しました。
-
この返信は3年、 6ヶ月前にilnelが編集しました。
すみません、正規表現の検索パターンを間違えていました。
こちらではどうでしょうか。
$output = preg_replace( '/(.*?<select name="' . $name . '\[\].*?>)(.*?)(<\/select>)/i', '${1}' . $options . '${3}', $output );
↓
$output = preg_replace( '/(.*?<select.*?name="' . $name . '[\["].*?>)(.*?)(<\/select>)/i', '${1}' . $options . '${3}', $output );
ありがとうございます!サンプルコードを入れ直してみましたが、やはりうまく表示されません。。。
別の書き方で、タームの値をselectボックスに出すことまではできましたが、チェックの有無による選択制限がうまくいきません。
検証してみました。結果、問題なく表示されました。
get_terms() で指定のタクソノミーの全タームを取得して、get_the_terms() で投稿でチェックされているタームを取得しています。
$terms = get_terms( $tax, array( 'hide_empty' => false) );
$selected = get_the_terms( get_the_ID(), $tax );
$term_ids = array_column( $selected, 'term_id' );
この辺を変更すればいいのかなと思いますが、ちょっと分かりません。m(__)m
できました!!ありがとうございます!!
複数の設定を行っても動き、メールにも反映されました!
ただ「first_as_label」や「必須」の設定は効いていないようなので、設定が必要そうです。。
「first_as_label」を有効にするには、下記のように変更 (${2} を追加) すればできると思います。
$output = preg_replace( '/(.*?<select.*?name="' . $name . '[\["].*?>)(.*?)(<\/select>)/i', '${1}' . $options . '${3}', $output );
↓
$output = preg_replace( '/(.*?<select.*?name="' . $name . '[\["].*?>)(.*?)(<\/select>)/i', '${1}${2}' . $options . '${3}', $output );
「必須」の設定は効いていると思うのですが…
ありがとうございます!どちらもできました!!
今回実装したいことがどこにも書いてなくて、半ば諦めかけていたので本当に救われました!!
丁寧に教えてくださりありがとうございました!!
-
この返信は3年、 6ヶ月前にilnelが編集しました。