サポート » プラグイン » タームの値をCF7で選択でき選択不可の設定もしたい

  • 解決済 ilnel

    (@ilnel)


    初めて投稿します。
    カスタム投稿のsingle.phpにContactform7を設置しております。
    タクソノミーのタームの値をすべてContactform7のselectに表示し、タームにチェックが入っていれば選択でき、チェックを外すと表示される(グレーなど色変更)が選択できないようにしたく、
    functions.phpに設定を書き、CF7のショートコードにデータを渡したいと思っておりますが、タームの値をselectに表示する事すらできない状態です。

    https://stackoverflow.com/questions/27867260/contact-form-7-and-custom-post-type
    を参考に、カスタム投稿のタイトルをContactform7のselectに表示する事は出来ましたが、応用ができず困っております。

    https://whitewood-hp.com/web-tips/archives/3911
    を参考にカスタムフィールドの選択肢の値を「$_POST」を使ってContactform7に渡す記述方法も試しましたがうまくいかず、困っています。

    何かいい書き方や方法があれば教えていただきたいです。
    よろしくお願いいたします。

    • このトピックはilnelが2年、 10ヶ月前に変更しました。
    • このトピックはilnelが2年、 10ヶ月前に変更しました。
10件の返信を表示中 - 1 - 10件目 (全10件中)
  • こんにちは

    チェックを外すと表示される(グレーなど色変更)が選択できないようにしたく、

    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 );
    トピック投稿者 ilnel

    (@ilnel)

    アドバイスありがとうございます!
    まだそこまでできておりませんが、参考にいたします!

    とりあえずひととおり動くサンプルコードを書いてみました。

    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 );
    トピック投稿者 ilnel

    (@ilnel)

    ありがとうございます!

    サンプルコードを、functions.phpに書き、下の値をそれぞれ変更し
    $id = 123; // コンタクトフォームの ID。
    $name = ‘menu-123’; // ドロップダウンメニューの名前。
    $tax = ‘foo’; // タクソノミーのスラッグ。

    管理画面のフォームも下記のように変更しましたが、
    そのまま表示されるか、空っぽのselectボックスが表示されるかでうまく表示されません。。。
    [menu-123]や[select menu-123]

    • この返信は2年、 10ヶ月前にilnelが編集しました。
    • この返信は2年、 10ヶ月前に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 );

    • この返信は2年、 10ヶ月前にishitakaが編集しました。
    トピック投稿者 ilnel

    (@ilnel)

    ありがとうございます!サンプルコードを入れ直してみましたが、やはりうまく表示されません。。。

    別の書き方で、タームの値を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

    トピック投稿者 ilnel

    (@ilnel)

    できました!!ありがとうございます!!
    複数の設定を行っても動き、メールにも反映されました!

    ただ「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 );

    「必須」の設定は効いていると思うのですが…

    トピック投稿者 ilnel

    (@ilnel)

    ありがとうございます!どちらもできました!!

    今回実装したいことがどこにも書いてなくて、半ば諦めかけていたので本当に救われました!!
    丁寧に教えてくださりありがとうございました!!

    • この返信は2年、 10ヶ月前にilnelが編集しました。
10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「タームの値をCF7で選択でき選択不可の設定もしたい」には新たに返信することはできません。