Ok, I’ve decided to move away from this idea and instead go with a custom module. Field generation and validation are working great!
While I don’t need the Tag Generator in order to use my custom shortcode, I’m puzzled by its behavior and was wondering if anyone could help me figure out why it’s doing what it’s doing.
I used the CF7 select.php
module as a template, and though I changed all the relevant instances of “select” to my tag name, when I attempt to generate a tag, I see
[select eqnlring-###]
instead of
[eqnlring eqnlring-###]
I can’t seem to find a reason why it’s doing this, and I hope someone will be able to clue me in.
Here is my custom module code in full:
<?php
/**
** A base module for [eqnlring] and [eqnlring*]
**/
/* Shortcode handler */
function wpcf7_add_shortcode_eqnlring() {
wpcf7_add_shortcode( array( 'eqnlring', 'eqnlring*' ),
'wpcf7_eqnlring_shortcode_handler', true );
}
function wpcf7_eqnlring_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;
$values = array();
$tag_args = array(
'number' => 0,
'format' => 'array',
'separator' => '',
'exclude' => '154, 155, 162, 164, 166, 167, 168, 169, 174, 175',
'echo' => false
);
$tag_cloud = wp_tag_cloud($tag_args);
foreach ($tag_cloud as $tag_name) {
$values[] = strip_tags($tag_name);
}
$labels = $tag->labels;
if ( $data = (array) $tag->get_data_option() ) {
$values = array_merge( $values, array_values( $data ) );
$labels = array_merge( $labels, array_values( $data ) );
}
$empty_eqnlring = empty( $values );
//if ( $empty_eqnlring || $include_blank ) {
// array_unshift( $labels, '---' );
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_eqnlring && 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['name'] = $tag->name;
$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_eqnlring', 'wpcf7_eqnlring_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_eqnlring*', 'wpcf7_eqnlring_validation_filter', 10, 2 );
function wpcf7_eqnlring_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_tag_generator_eqnlring', 27 );
function wpcf7_add_tag_generator_eqnlring() {
if ( ! function_exists( 'wpcf7_add_tag_generator' ) )
return;
wpcf7_add_tag_generator( 'eqnlring', __( 'EQNLR Ingredients List', 'contact-form-7' ),
'wpcf7-tg-pane-eqnlring', 'wpcf7_tg_pane_eqnlring' );
}
function wpcf7_tg_pane_eqnlring( $contact_form ) {
?>
<div id="wpcf7-tg-pane-eqnlring" 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>
</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" 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
}
?>