1 | <?php
|
---|
2 | /**
|
---|
3 | ** A base module for [quiz]
|
---|
4 | **/
|
---|
5 |
|
---|
6 | /* Shortcode handler */
|
---|
7 |
|
---|
8 | function wpcf7_quiz_shortcode_handler( $tag ) {
|
---|
9 | global $wpcf7_contact_form;
|
---|
10 |
|
---|
11 | if ( ! is_array( $tag ) )
|
---|
12 | return '';
|
---|
13 |
|
---|
14 | $type = $tag['type'];
|
---|
15 | $name = $tag['name'];
|
---|
16 | $options = (array) $tag['options'];
|
---|
17 | $pipes = $tag['pipes'];
|
---|
18 |
|
---|
19 | if ( empty( $name ) )
|
---|
20 | return '';
|
---|
21 |
|
---|
22 | $atts = '';
|
---|
23 | $id_att = '';
|
---|
24 | $class_att = '';
|
---|
25 | $size_att = '';
|
---|
26 | $maxlength_att = '';
|
---|
27 |
|
---|
28 | foreach ( $options as $option ) {
|
---|
29 | if ( preg_match( '%^id:([-0-9a-zA-Z_]+)$%', $option, $matches ) ) {
|
---|
30 | $id_att = $matches[1];
|
---|
31 |
|
---|
32 | } elseif ( preg_match( '%^class:([-0-9a-zA-Z_]+)$%', $option, $matches ) ) {
|
---|
33 | $class_att .= ' ' . $matches[1];
|
---|
34 |
|
---|
35 | } elseif ( preg_match( '%^([0-9]*)[/x]([0-9]*)$%', $option, $matches ) ) {
|
---|
36 | $size_att = (int) $matches[1];
|
---|
37 | $maxlength_att = (int) $matches[2];
|
---|
38 | }
|
---|
39 | }
|
---|
40 |
|
---|
41 | if ( $id_att )
|
---|
42 | $atts .= ' id="' . trim( $id_att ) . '"';
|
---|
43 |
|
---|
44 | if ( $class_att )
|
---|
45 | $atts .= ' class="' . trim( $class_att ) . '"';
|
---|
46 |
|
---|
47 | if ( $size_att )
|
---|
48 | $atts .= ' size="' . $size_att . '"';
|
---|
49 | else
|
---|
50 | $atts .= ' size="40"'; // default size
|
---|
51 |
|
---|
52 | if ( $maxlength_att )
|
---|
53 | $atts .= ' maxlength="' . $maxlength_att . '"';
|
---|
54 |
|
---|
55 | if ( is_a( $pipes, 'WPCF7_Pipes' ) && ! $pipes->zero() ) {
|
---|
56 | $pipe = $pipes->random_pipe();
|
---|
57 | $question = $pipe->before;
|
---|
58 | $answer = $pipe->after;
|
---|
59 | } else {
|
---|
60 | // default quiz
|
---|
61 | $question = '1+1=?';
|
---|
62 | $answer = '2';
|
---|
63 | }
|
---|
64 |
|
---|
65 | $answer = wpcf7_canonicalize( $answer );
|
---|
66 |
|
---|
67 | $html = '<span class="wpcf7-quiz-label">' . esc_html( $question ) . '</span> ';
|
---|
68 | $html .= '<input type="text" name="' . $name . '"' . $atts . ' />';
|
---|
69 | $html .= '<input type="hidden" name="_wpcf7_quiz_answer_' . $name . '" value="' . wp_hash( $answer, 'wpcf7_quiz' ) . '" />';
|
---|
70 |
|
---|
71 | $validation_error = '';
|
---|
72 | if ( is_a( $wpcf7_contact_form, 'WPCF7_ContactForm' ) )
|
---|
73 | $validation_error = $wpcf7_contact_form->validation_error( $name );
|
---|
74 |
|
---|
75 | $html = '<span class="wpcf7-form-control-wrap ' . $name . '">' . $html . $validation_error . '</span>';
|
---|
76 |
|
---|
77 | return $html;
|
---|
78 | }
|
---|
79 |
|
---|
80 | wpcf7_add_shortcode( 'quiz', 'wpcf7_quiz_shortcode_handler', true );
|
---|
81 |
|
---|
82 |
|
---|
83 | /* Validation filter */
|
---|
84 |
|
---|
85 | function wpcf7_quiz_validation_filter( $result, $tag ) {
|
---|
86 | global $wpcf7_contact_form;
|
---|
87 |
|
---|
88 | $type = $tag['type'];
|
---|
89 | $name = $tag['name'];
|
---|
90 |
|
---|
91 | $answer = wpcf7_canonicalize( $_POST[$name] );
|
---|
92 | $answer_hash = wp_hash( $answer, 'wpcf7_quiz' );
|
---|
93 | $expected_hash = $_POST['_wpcf7_quiz_answer_' . $name];
|
---|
94 | if ( $answer_hash != $expected_hash ) {
|
---|
95 | $result['valid'] = false;
|
---|
96 | $result['reason'][$name] = $wpcf7_contact_form->message( 'quiz_answer_not_correct' );
|
---|
97 | }
|
---|
98 |
|
---|
99 | return $result;
|
---|
100 | }
|
---|
101 |
|
---|
102 | add_filter( 'wpcf7_validate_quiz', 'wpcf7_quiz_validation_filter', 10, 2 );
|
---|
103 |
|
---|
104 |
|
---|
105 | /* Ajax echo filter */
|
---|
106 |
|
---|
107 | function wpcf7_quiz_ajax_echo_filter( $items ) {
|
---|
108 | global $wpcf7_contact_form;
|
---|
109 |
|
---|
110 | if ( ! is_a( $wpcf7_contact_form, 'WPCF7_ContactForm' ) )
|
---|
111 | return $items;
|
---|
112 |
|
---|
113 | if ( ! is_array( $items ) )
|
---|
114 | return $items;
|
---|
115 |
|
---|
116 | $fes = $wpcf7_contact_form->form_scan_shortcode(
|
---|
117 | array( 'type' => 'quiz' ) );
|
---|
118 |
|
---|
119 | if ( empty( $fes ) )
|
---|
120 | return $items;
|
---|
121 |
|
---|
122 | $refill = array();
|
---|
123 |
|
---|
124 | foreach ( $fes as $fe ) {
|
---|
125 | $name = $fe['name'];
|
---|
126 | $pipes = $fe['pipes'];
|
---|
127 |
|
---|
128 | if ( empty( $name ) )
|
---|
129 | continue;
|
---|
130 |
|
---|
131 | if ( is_a( $pipes, 'WPCF7_Pipes' ) && ! $pipes->zero() ) {
|
---|
132 | $pipe = $pipes->random_pipe();
|
---|
133 | $question = $pipe->before;
|
---|
134 | $answer = $pipe->after;
|
---|
135 | } else {
|
---|
136 | // default quiz
|
---|
137 | $question = '1+1=?';
|
---|
138 | $answer = '2';
|
---|
139 | }
|
---|
140 |
|
---|
141 | $answer = wpcf7_canonicalize( $answer );
|
---|
142 |
|
---|
143 | $refill[$name] = array( $question, wp_hash( $answer, 'wpcf7_quiz' ) );
|
---|
144 | }
|
---|
145 |
|
---|
146 | if ( ! empty( $refill ) )
|
---|
147 | $items['quiz'] = $refill;
|
---|
148 |
|
---|
149 | return $items;
|
---|
150 | }
|
---|
151 |
|
---|
152 | add_filter( 'wpcf7_ajax_json_echo', 'wpcf7_quiz_ajax_echo_filter' );
|
---|
153 |
|
---|
154 | ?>
|
---|