<?php
add_action('wpcf7_init', 'wpcf7_add_form_tag_acceptance', 10, 0);
function wpcf7_add_form_tag_acceptance()
{
wpcf7_add_form_tag('acceptance', 'wpcf7_acceptance_form_tag_handler', array('name-attr' => true));
}
function wpcf7_acceptance_form_tag_handler($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';
}
if ($tag->has_option('invert')) {
$class .= ' invert';
}
if ($tag->has_option('optional')) {
$class .= ' optional';
}
$atts = array('class' => trim($class));
$item_atts = array();
$item_atts['type'] = 'checkbox';
$item_atts['name'] = $tag->name;
$item_atts['value'] = '1';
$item_atts['tabindex'] = $tag->get_option('tabindex', 'signed_int', true);
if ($validation_error) {
$item_atts['aria-invalid'] = 'true';
$item_atts['aria-describedby'] = wpcf7_get_validation_error_reference($tag->name);
} else {
$item_atts['aria-invalid'] = 'false';
}
if ($tag->has_option('default:on')) {
$item_atts['checked'] = 'checked';
}
$item_atts['class'] = $tag->get_class_option();
$item_atts['id'] = $tag->get_id_option();
$item_atts = wpcf7_format_atts($item_atts);
$content = empty($tag->content) ? (string) reset($tag->values) : $tag->content;
$content = trim($content);
if ($content) {
if ($tag->has_option('label_first')) {
$html = sprintf('<span class="wpcf7-list-item-label">%2$s</span><input %1$s />', $item_atts, $content);
} else {
$html = sprintf('<input %1$s /><span class="wpcf7-list-item-label">%2$s</span>', $item_atts, $content);
}
$html = sprintf('<span class="wpcf7-list-item"><label>%s</label></span>', $html);
} else {
$html = sprintf('<span class="wpcf7-list-item"><input %1$s /></span>', $item_atts);
}
$atts = wpcf7_format_atts($atts);
$html = sprintf('<span class="wpcf7-form-control-wrap %1$s"><span %2$s>%3$s</span>%4$s</span>', sanitize_html_class($tag->name), $atts, $html, $validation_error);
return $html;
}
add_filter('wpcf7_validate_acceptance', 'wpcf7_acceptance_validation_filter', 10, 2);
function wpcf7_acceptance_validation_filter($result, $tag)
{
if (!wpcf7_acceptance_as_validation()) {
return $result;
}
if ($tag->has_option('optional')) {
return $result;
}
$name = $tag->name;
$value = !empty($_POST[$name]) ? 1 : 0;
$invert = $tag->has_option('invert');
if ($invert and $value or !$invert and !$value) {
$result->invalidate($tag, wpcf7_get_message('accept_terms'));
}
return $result;
}
add_filter('wpcf7_acceptance', 'wpcf7_acceptance_filter', 10, 2);
function wpcf7_acceptance_filter($accepted, $submission)
{
$tags = wpcf7_scan_form_tags(array('type' => 'acceptance'));
foreach ($tags as $tag) {
$name = $tag->name;
if (empty($name)) {
continue;
}
$value = !empty($_POST[$name]) ? 1 : 0;
$content = empty($tag->content) ? (string) reset($tag->values) : $tag->content;
$content = trim($content);
if ($value and $content) {
$submission->add_consent($name, $content);
}
if ($tag->has_option('optional')) {
continue;
}
$invert = $tag->has_option('invert');
if ($invert and $value or !$invert and !$value) {
$accepted = false;
}
}
return $accepted;
}
add_filter('wpcf7_form_class_attr', 'wpcf7_acceptance_form_class_attr', 10, 1);
function wpcf7_acceptance_form_class_attr($class)
{
if (wpcf7_acceptance_as_validation()) {
return $class . ' wpcf7-acceptance-as-validation';
}
return $class;
}
function wpcf7_acceptance_as_validation()
{
if (!($contact_form = wpcf7_get_current_contact_form())) {
return false;
}
return $contact_form->is_true('acceptance_as_validation');
}
add_filter('wpcf7_mail_tag_replaced_acceptance', 'wpcf7_acceptance_mail_tag', 10, 4);
function wpcf7_acceptance_mail_tag($replaced, $submitted, $html, $mail_tag)
{
$form_tag = $mail_tag->corresponding_form_tag();
if (!$form_tag) {
return $replaced;
}
if (!empty($submitted)) {
$replaced = __('Consented', 'contact-form-7');
} else {
$replaced = __('Not consented', 'contact-form-7');
}
$content = empty($form_tag->content) ? (string) reset($form_tag->values) : $form_tag->content;
if (!$html) {
$content = wp_strip_all_tags($content);
}
$content = trim($content);
if ($content) {
$replaced = sprintf(_x('%1$s: %2$s', 'mail output for acceptance checkboxes', 'contact-form-7'), $replaced, $content);
}
return $replaced;
}
add_action('wpcf7_admin_init', 'wpcf7_add_tag_generator_acceptance', 35, 0);
function wpcf7_add_tag_generator_acceptance()
{
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add('acceptance', __('acceptance', 'contact-form-7'), 'wpcf7_tag_generator_acceptance');
}
function wpcf7_tag_generator_acceptance($contact_form, $args = '')
{
$args = wp_parse_args($args, array());
$type = 'acceptance';
$description = __("Generate a form-tag for an acceptance checkbox. For more details, see %s.", 'contact-form-7');
$desc_link = wpcf7_link(__('https://contactform7.com/acceptance-checkbox/', 'contact-form-7'), __('Acceptance checkbox', 'contact-form-7'));
?>
<div class="control-box">
<fieldset>
<legend><?php
echo sprintf(esc_html($description), $desc_link);
?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-name');
?>"><?php
echo esc_html(__('Name', 'contact-form-7'));
?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php
echo esc_attr($args['content'] . '-name');
?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-content');
?>"><?php
echo esc_html(__('Condition', 'contact-form-7'));
?></label></th>
<td><input type="text" name="content" class="oneline large-text" id="<?php
echo esc_attr($args['content'] . '-content');
?>" /></td>
</tr>
<tr>
<th scope="row"><?php
echo esc_html(__('Options', 'contact-form-7'));
?></th>
<td>
<fieldset>
<legend class="screen-reader-text"><?php
echo esc_html(__('Options', 'contact-form-7'));
?></legend>
<label><input type="checkbox" name="optional" class="option" checked="checked" /> <?php
echo esc_html(__('Make this checkbox optional', 'contact-form-7'));
?></label>
</fieldset>
</td>
</tr>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-id');
?>"><?php
echo esc_html(__('Id attribute', 'contact-form-7'));
?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php
echo esc_attr($args['content'] . '-id');
?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-class');
?>"><?php
echo esc_html(__('Class attribute', 'contact-form-7'));
?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php
echo esc_attr($args['content'] . '-class');
?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="<?php
echo $type;
?>" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php
echo esc_attr(__('Insert Tag', 'contact-form-7'));
?>" />
</div>
</div>
<?php
}