Created
August 18, 2014 16:25
-
-
Save mindfullsilence/a50d639e7d976723a1ee to your computer and use it in GitHub Desktop.
Custom input fields for Contact Form 7 Wordpress Plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
** A base module for [select_posttype] and [select_posttype*] | |
**/ | |
/* Shortcode handler */ | |
add_action( 'wpcf7_init', 'wpcf7_add_shortcode_select_posttype' ); | |
function wpcf7_add_shortcode_select_posttype() { | |
wpcf7_add_shortcode( array( 'select_posttype', 'select_posttype*' ), | |
'wpcf7_select_posttype_shortcode_handler', true ); | |
} | |
function wpcf7_select_posttype_shortcode_handler( $tag ) { | |
$tag = new WPCF7_Shortcode( $tag ); | |
if ( empty( $tag->name ) ) | |
return ''; | |
$validation_error = wpcf7_get_validation_error( $tag->name ); | |
$class = wpcf7_form_controls_class( $tag->type ); | |
if ( $validation_error ) | |
$class .= ' wpcf7-not-valid'; | |
$atts = array(); | |
$atts['class'] = $tag->get_class_option( $class ); | |
$atts['id'] = $tag->get_id_option(); | |
$atts['tabindex'] = $tag->get_option( 'tabindex', 'int', true ); | |
if ( $tag->is_required() ) | |
$atts['aria-required'] = 'true'; | |
$atts['aria-invalid'] = $validation_error ? 'true' : 'false'; | |
$defaults = array(); | |
if ( $matches = $tag->get_first_match_option( '/^default:([0-9_]+)$/' ) ) | |
$defaults = explode( '_', $matches[1] ); | |
$multiple = $tag->has_option( 'multiple' ); | |
$include_blank = $tag->has_option( 'include_blank' ); | |
$first_as_label = $tag->has_option( 'first_as_label' ); | |
// $values = $tag->values; | |
$post_type = $tag->values[0]; | |
$posts = get_posts( | |
array( | |
'post_type' => $post_type, | |
'post_status' => 'publish' | |
) | |
); | |
$values = array(); | |
foreach($posts as $index => $item) { | |
$values[$index] = $item->post_title; | |
} | |
$labels = $values; | |
if ( $data = (array) $tag->get_data_option() ) { | |
$values = array_merge( $values, array_values( $data ) ); | |
$labels = array_merge( $labels, array_values( $data ) ); | |
} | |
$empty_select = empty( $values ); | |
if ( $empty_select || $include_blank ) { | |
array_unshift( $labels, '---' ); | |
array_unshift( $values, '' ); | |
} elseif ( $first_as_label ) { | |
$values[0] = ''; | |
} | |
$html = ''; | |
$hangover = wpcf7_get_hangover( $tag->name ); | |
foreach ( $values as $key => $value ) { | |
$selected = false; | |
if ( $hangover ) { | |
if ( $multiple ) { | |
$selected = in_array( esc_sql( $value ), (array) $hangover ); | |
} else { | |
$selected = ( $hangover == esc_sql( $value ) ); | |
} | |
} else { | |
if ( ! $empty_select && in_array( $key + 1, (array) $defaults ) ) { | |
$selected = true; | |
} | |
} | |
$item_atts = array( | |
'value' => $value, | |
'selected' => $selected ? 'selected' : '' ); | |
$item_atts = wpcf7_format_atts( $item_atts ); | |
$label = isset( $labels[$key] ) ? $labels[$key] : $value; | |
$html .= sprintf( '<option %1$s>%2$s</option>', | |
$item_atts, esc_html( $label ) ); | |
} | |
if ( $multiple ) | |
$atts['multiple'] = 'multiple'; | |
$atts['name'] = $tag->name . ( $multiple ? '[]' : '' ); | |
$atts = wpcf7_format_atts( $atts ); | |
$html = sprintf( | |
'<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>', | |
sanitize_html_class( $tag->name ), $atts, $html, $validation_error ); | |
return $html; | |
} | |
/* Validation filter */ | |
add_filter( 'wpcf7_validate_select', 'wpcf7_select_posttype_validation_filter', 10, 2 ); | |
add_filter( 'wpcf7_validate_select*', 'wpcf7_select_posttype_validation_filter', 10, 2 ); | |
function wpcf7_select_posttype_validation_filter( $result, $tag ) { | |
$tag = new WPCF7_Shortcode( $tag ); | |
$name = $tag->name; | |
if ( isset( $_POST[$name] ) && is_array( $_POST[$name] ) ) { | |
foreach ( $_POST[$name] as $key => $value ) { | |
if ( '' === $value ) | |
unset( $_POST[$name][$key] ); | |
} | |
} | |
if ( $tag->is_required() ) { | |
if ( ! isset( $_POST[$name] ) | |
|| empty( $_POST[$name] ) && '0' !== $_POST[$name] ) { | |
$result['valid'] = false; | |
$result['reason'][$name] = wpcf7_get_message( 'invalid_required' ); | |
} | |
} | |
if ( isset( $result['reason'][$name] ) && $id = $tag->get_id_option() ) { | |
$result['idref'][$name] = $id; | |
} | |
return $result; | |
} | |
/* Tag generator */ | |
add_action( 'admin_init', 'wpcf7_add_posttype_tag_generator_menu', 25 ); | |
function wpcf7_add_posttype_tag_generator_menu() { | |
if ( ! function_exists( 'wpcf7_add_tag_generator' ) ) | |
return; | |
wpcf7_add_tag_generator( 'select_posttype', __( 'Post-Type dropdown menu', 'contact-form-7' ), | |
'wpcf7-tg-pane-select-posttype', 'wpcf7_tg_pane_select_posttype' ); | |
} | |
function wpcf7_tg_pane_select_posttype( $contact_form ) { | |
?> | |
<div id="wpcf7-tg-pane-select-posttype" class="hidden"> | |
<form action=""> | |
<table> | |
<tr><td><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field?', 'contact-form-7' ) ); ?></td></tr> | |
<tr><td><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?><br /><input type="text" name="name" class="tg-name oneline" /></td><td></td></tr> | |
</table> | |
<table> | |
<tr> | |
<td><code>id</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br /> | |
<input type="text" name="id" class="idvalue oneline option" /></td> | |
<td><code>class</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br /> | |
<input type="text" name="class" class="classvalue oneline option" /></td> | |
</tr> | |
<tr> | |
<td><?php echo esc_html( __( 'Post Type', 'contact-form-7' ) ); ?><br /> | |
<select name="values"> | |
<?php $post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects'); | |
foreach($post_types as $post_type) : ?> | |
<option value="<?= $post_type->query_var; ?>"><?= $post_type->name; ?></option> | |
<?php endforeach; ?> | |
</select><br /> | |
<span style="font-size: smaller"><?php echo esc_html( __( "* What is the name of the post type?", 'contact-form-7' ) ); ?></span> | |
</td> | |
<td> | |
<br /><input type="checkbox" name="multiple" class="option" /> <?php echo esc_html( __( 'Allow multiple selections?', 'contact-form-7' ) ); ?> | |
<br /><input type="checkbox" name="include_blank" class="option" /> <?php echo esc_html( __( 'Insert a blank item as the first option?', 'contact-form-7' ) ); ?> | |
</td> | |
</tr> | |
</table> | |
<div class="tg-tag"><?php echo esc_html( __( "Copy this code and paste it into the form left.", 'contact-form-7' ) ); ?><br /><input type="text" name="select_posttype" class="tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div> | |
<div class="tg-mail-tag"><?php echo esc_html( __( "And, put this code into the Mail fields below.", 'contact-form-7' ) ); ?><br /><input type="text" class="mail-tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div> | |
</form> | |
</div> | |
<?php | |
} | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
** A base module for [select_taxonomy] and [select_taxonomy*] | |
**/ | |
/* Shortcode handler */ | |
add_action( 'wpcf7_init', 'wpcf7_add_shortcode_select_taxonomy' ); | |
function wpcf7_add_shortcode_select_taxonomy() { | |
wpcf7_add_shortcode( array( 'select_taxonomy', 'select_taxonomy*' ), | |
'wpcf7_select_taxonomy_shortcode_handler', true ); | |
} | |
function wpcf7_select_taxonomy_shortcode_handler( $tag ) { | |
$tag = new WPCF7_Shortcode( $tag ); | |
if ( empty( $tag->name ) ) | |
return ''; | |
$validation_error = wpcf7_get_validation_error( $tag->name ); | |
$class = wpcf7_form_controls_class( $tag->type ); | |
if ( $validation_error ) | |
$class .= ' wpcf7-not-valid'; | |
$atts = array(); | |
$atts['class'] = $tag->get_class_option( $class ); | |
$atts['id'] = $tag->get_id_option(); | |
$atts['tabindex'] = $tag->get_option( 'tabindex', 'int', true ); | |
if ( $tag->is_required() ) | |
$atts['aria-required'] = 'true'; | |
$atts['aria-invalid'] = $validation_error ? 'true' : 'false'; | |
$defaults = array(); | |
if ( $matches = $tag->get_first_match_option( '/^default:([0-9_]+)$/' ) ) | |
$defaults = explode( '_', $matches[1] ); | |
$multiple = $tag->has_option( 'multiple' ); | |
$include_blank = $tag->has_option( 'include_blank' ); | |
$first_as_label = $tag->has_option( 'first_as_label' ); | |
// $values = $tag->values; | |
$taxon = $tag->values[0]; | |
$terms = get_terms($taxon); | |
$values = array(); | |
foreach($terms as $index => $item) { | |
$values[$index] = $item->name; | |
} | |
$labels = $values; | |
if ( $data = (array) $tag->get_data_option() ) { | |
$values = array_merge( $values, array_values( $data ) ); | |
$labels = array_merge( $labels, array_values( $data ) ); | |
} | |
$empty_select = empty( $values ); | |
if ( $empty_select || $include_blank ) { | |
array_unshift( $labels, '---' ); | |
array_unshift( $values, '' ); | |
} elseif ( $first_as_label ) { | |
$values[0] = ''; | |
} | |
$html = ''; | |
$hangover = wpcf7_get_hangover( $tag->name ); | |
foreach ( $values as $key => $value ) { | |
$selected = false; | |
if ( $hangover ) { | |
if ( $multiple ) { | |
$selected = in_array( esc_sql( $value ), (array) $hangover ); | |
} else { | |
$selected = ( $hangover == esc_sql( $value ) ); | |
} | |
} else { | |
if ( ! $empty_select && in_array( $key + 1, (array) $defaults ) ) { | |
$selected = true; | |
} | |
} | |
$item_atts = array( | |
'value' => $value, | |
'selected' => $selected ? 'selected' : '' ); | |
$item_atts = wpcf7_format_atts( $item_atts ); | |
$label = isset( $labels[$key] ) ? $labels[$key] : $value; | |
$html .= sprintf( '<option %1$s>%2$s</option>', | |
$item_atts, esc_html( $label ) ); | |
} | |
if ( $multiple ) | |
$atts['multiple'] = 'multiple'; | |
$atts['name'] = $tag->name . ( $multiple ? '[]' : '' ); | |
$atts = wpcf7_format_atts( $atts ); | |
$html = sprintf( | |
'<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>', | |
sanitize_html_class( $tag->name ), $atts, $html, $validation_error ); | |
return $html; | |
} | |
/* Validation filter */ | |
add_filter( 'wpcf7_validate_select', 'wpcf7_select_taxonomy_validation_filter', 10, 2 ); | |
add_filter( 'wpcf7_validate_select*', 'wpcf7_select_taxonomy_validation_filter', 10, 2 ); | |
function wpcf7_select_taxonomy_validation_filter( $result, $tag ) { | |
$tag = new WPCF7_Shortcode( $tag ); | |
$name = $tag->name; | |
if ( isset( $_POST[$name] ) && is_array( $_POST[$name] ) ) { | |
foreach ( $_POST[$name] as $key => $value ) { | |
if ( '' === $value ) | |
unset( $_POST[$name][$key] ); | |
} | |
} | |
if ( $tag->is_required() ) { | |
if ( ! isset( $_POST[$name] ) | |
|| empty( $_POST[$name] ) && '0' !== $_POST[$name] ) { | |
$result['valid'] = false; | |
$result['reason'][$name] = wpcf7_get_message( 'invalid_required' ); | |
} | |
} | |
if ( isset( $result['reason'][$name] ) && $id = $tag->get_id_option() ) { | |
$result['idref'][$name] = $id; | |
} | |
return $result; | |
} | |
/* Tag generator */ | |
add_action( 'admin_init', 'wpcf7_add_taxonomy_tag_generator_menu', 25 ); | |
function wpcf7_add_taxonomy_tag_generator_menu() { | |
if ( ! function_exists( 'wpcf7_add_tag_generator' ) ) | |
return; | |
wpcf7_add_tag_generator( 'select_taxonomy', __( 'Taxonomy dropdown menu', 'contact-form-7' ), | |
'wpcf7-tg-pane-select-taxonomy', 'wpcf7_tg_pane_select_taxonomy' ); | |
} | |
function wpcf7_tg_pane_select_taxonomy( $contact_form ) { | |
?> | |
<div id="wpcf7-tg-pane-select-taxonomy" class="hidden"> | |
<form action=""> | |
<table> | |
<tr><td><input type="checkbox" name="required" /> <?php echo esc_html( __( 'Required field?', 'contact-form-7' ) ); ?></td></tr> | |
<tr><td><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?><br /><input type="text" name="name" class="tg-name oneline" /></td><td></td></tr> | |
</table> | |
<table> | |
<tr> | |
<td><code>id</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br /> | |
<input type="text" name="id" class="idvalue oneline option" /></td> | |
<td><code>class</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br /> | |
<input type="text" name="class" class="classvalue oneline option" /></td> | |
</tr> | |
<tr> | |
<td><?php echo esc_html( __( 'Post Type', 'contact-form-7' ) ); ?><br /> | |
<select name="values"> | |
<?php $args = array(); | |
$taxons = get_taxonomies($args, 'objects'); | |
foreach($taxons as $taxon) : ?> | |
<option value="<?= $taxon->name; ?>"><?= $taxon->labels->menu_name; ?></option> | |
<?php endforeach; ?> | |
</select><br /> | |
<span style="font-size: smaller"><?php echo esc_html( __( "* What is the name of the taxonomy?", 'contact-form-7' ) ); ?></span> | |
</td> | |
<td> | |
<br /><input type="checkbox" name="multiple" class="option" /> <?php echo esc_html( __( 'Allow multiple selections?', 'contact-form-7' ) ); ?> | |
<br /><input type="checkbox" name="include_blank" class="option" /> <?php echo esc_html( __( 'Insert a blank item as the first option?', 'contact-form-7' ) ); ?> | |
</td> | |
</tr> | |
</table> | |
<div class="tg-tag"><?php echo esc_html( __( "Copy this code and paste it into the form left.", 'contact-form-7' ) ); ?><br /><input type="text" name="select_taxonomy" class="tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div> | |
<div class="tg-mail-tag"><?php echo esc_html( __( "And, put this code into the Mail fields below.", 'contact-form-7' ) ); ?><br /><input type="text" class="mail-tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div> | |
</form> | |
</div> | |
<?php | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
select_posttype = generates a dropdown menu listing all titles published under the chosen post type.
select_taxonomy = generates a dropdown menu listing all terms published under the chosen taxonomy.