Cómo personalizar Contact Form 7 en WordPress con un SVG hecho a mano
() translation by (you can also view the original English article)



Nota: Este tutorial supone que estás en cierto modo familiarizado con WordPress y Contact Form 7.
Suponiendo que has instalado CF7 en un proyecto de WordPress, discutamos los pasos necesarios para lograr que el formulario sea compatible con este complemento.
1. Incluye sprites de SVG
Para comenzar, tenemos que incluir los sprites de SVG en nuestro proyecto.
En el tutorial anterior usamos un único elemento <svg>
, que contenía todos los diferentes elementos que necesitábamos en forma de elementos <symbol>
, cada uno con un id
único. Cada vez que necesitábamos uno de los elementos en nuestro formulario, empleábamos un elemento <use>
, haciendo referencia al id de esta forma:
1 |
<svg>
|
2 |
<use xlink:href="#checkbox_empty"></use> |
3 |
</svg>
|
Ahora, dentro de nuestro tema de WordPress, vamos a crear un archivo PHP nuevo para que contenga el marcado del sprite de SVG:



Luego incorporaremos este contenido SVG justo después de la etiqueta de apertura body
en el header.php
de nuestro tema:



2. Crea el formulario de contacto
El segundo paso es crear el formulario desde el interior de WordPress.



Usaremos una combinación de códigos cortos de CF7 junto con un poco de HTML personalizado.
Aquí hay dos cosas importantes:
- En primer lugar, si ves el tutorial anterior, todos los elementos hijos del formulario están envueltos dentro de los elementos contenedores
.handmade-form
y.container
. Más tarde, cuando llamemos al formulario, adjuntaremos estas clases contenedoras directamente al elementoform
. - En segundo lugar, no podemos recrear al 100% el marcado de las casillas de verificación personalizadas con los códigos cortos de CF7 disponibles. Para superar esta limitación, escribiremos un poco de código JavaScript personalizado. Además, para una manipulación más sencilla, la lista
.checkbox-list
no seguirá siendo unul
, sino que la convertiremos en undiv
.
Este es el código que tenemos que agregar al editor de CF7:
1 |
<h1>Contact us</h1> |
2 |
<ul>
|
3 |
<li class="grid grid-2"> |
4 |
<div class="form-wrapper"> |
5 |
[text* your-name placeholder "Name*"] |
6 |
<svg>
|
7 |
<use xlink:href="#input1"></use> |
8 |
</svg>
|
9 |
</div>
|
10 |
<div class="form-wrapper"> |
11 |
[text* your-surname placeholder "Surname*"] |
12 |
<svg>
|
13 |
<use xlink:href="#input2"></use> |
14 |
</svg>
|
15 |
</div>
|
16 |
</li>
|
17 |
<li class="grid grid-2"> |
18 |
<div class="form-wrapper"> |
19 |
[email* your-email placeholder "Email*"] |
20 |
<svg>
|
21 |
<use xlink:href="#input3"></use> |
22 |
</svg>
|
23 |
</div>
|
24 |
<div class="form-wrapper"> |
25 |
[tel your-phone placeholder "Phone"] |
26 |
<svg>
|
27 |
<use xlink:href="#input4"></use> |
28 |
</svg>
|
29 |
</div>
|
30 |
</li>
|
31 |
<li class="form-wrapper"> |
32 |
[textarea your-message placeholder "Message"] |
33 |
<svg>
|
34 |
<use xlink:href="#textarea"></use> |
35 |
</svg>
|
36 |
</li>
|
37 |
<li class="form-wrapper"> |
38 |
<fieldset>
|
39 |
<legend>Select preferred method of contact</legend> |
40 |
<div class="checkbox-list"> |
41 |
[radio contact-method default:1 "email" "phone"] |
42 |
</div>
|
43 |
<svg>
|
44 |
<use xlink:href="#fieldset"></use> |
45 |
</svg>
|
46 |
</fieldset>
|
47 |
</li>
|
48 |
<li class="grid grid-3"> |
49 |
<div class="form-wrapper"> |
50 |
<button type="submit" class="wpcf7-form-control wpcf7-submit">SUBMIT</button> |
51 |
<svg>
|
52 |
<use xlink:href="#button"></use> |
53 |
</svg>
|
54 |
</div>
|
55 |
<div class="form-wrapper"> |
56 |
<button type="reset">RESET</button> |
57 |
<svg>
|
58 |
<use xlink:href="#button"></use> |
59 |
</svg>
|
60 |
</div>
|
61 |
</li>
|
62 |
</ul>
|
3. Agrega los estilos CSS para el formulario
Cambiando de tema, vamos a poner en cola un nuevo archivo CSS en el archivo functions.php
de nuestro proyecto, de esta forma (es posible que tu carpeta de destino sea diferente):
1 |
wp_enqueue_style( 'customcss', get_template_directory_uri() . '/assets/css/custom.css' ); |
Aquí colocaremos la mayoría de los estilos de la demostración estática, con algunas adiciones nuevas para los mensajes de edición que vienen con CF7.
Estos son todos los estilos necesarios:
1 |
/* RESET RULES & INITIAL SET UP
|
2 |
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
3 |
@font-face { |
4 |
font-family: "Summer"; |
5 |
src: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/162656/Summer%20Font%20Regular.woff); |
6 |
}
|
7 |
|
8 |
@font-face { |
9 |
font-family: "Summer Bold"; |
10 |
src: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/162656/Summer%20Font%20Bold.woff); |
11 |
}
|
12 |
|
13 |
:root { |
14 |
--white: #fff; |
15 |
--red: #e31b23; |
16 |
}
|
17 |
|
18 |
* { |
19 |
padding: 0; |
20 |
margin: 0; |
21 |
border: none; |
22 |
box-sizing: border-box; |
23 |
}
|
24 |
|
25 |
a { |
26 |
color: inherit; |
27 |
text-decoration: none; |
28 |
}
|
29 |
|
30 |
input, |
31 |
textarea, |
32 |
button { |
33 |
font-family: inherit; |
34 |
font-size: 100%; |
35 |
background: none; |
36 |
outline: none; |
37 |
}
|
38 |
|
39 |
[type="radio"] { |
40 |
position: absolute; |
41 |
left: -9999px; |
42 |
}
|
43 |
|
44 |
button, |
45 |
label { |
46 |
cursor: pointer; |
47 |
}
|
48 |
|
49 |
textarea { |
50 |
resize: none; |
51 |
}
|
52 |
|
53 |
ul { |
54 |
list-style: none; |
55 |
}
|
56 |
|
57 |
body { |
58 |
font: 32px/1.2 "Summer"; |
59 |
margin: 1.5rem 0; |
60 |
}
|
61 |
|
62 |
.container { |
63 |
max-width: 800px; |
64 |
margin: 0 auto; |
65 |
padding: 0 1.5rem; |
66 |
}
|
67 |
|
68 |
|
69 |
/* FORM ELEMENTS
|
70 |
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
71 |
.handmade-form h1, |
72 |
.handmade-form li, |
73 |
.handmade-form .grid > *:not(:last-child) { |
74 |
margin-bottom: 1.5rem; |
75 |
}
|
76 |
|
77 |
.handmade-form .form-wrapper, |
78 |
.handmade-form input:not([type="radio"]), |
79 |
.handmade-form textarea, |
80 |
.handmade-form button, |
81 |
.handmade-form .checkbox-list label { |
82 |
position: relative; |
83 |
}
|
84 |
|
85 |
.handmade-form input:not([type="radio"]), |
86 |
.handmade-form textarea, |
87 |
.handmade-form button, |
88 |
.handmade-form .checkbox-list label { |
89 |
z-index: 1; |
90 |
}
|
91 |
|
92 |
.handmade-form input:not([type="radio"]), |
93 |
.handmade-form textarea, |
94 |
.handmade-form button { |
95 |
width: 100%; |
96 |
}
|
97 |
|
98 |
.handmade-form input:not([type="radio"]), |
99 |
.handmade-form textarea, |
100 |
.handmade-form fieldset { |
101 |
padding: 15px; |
102 |
}
|
103 |
|
104 |
.handmade-form textarea { |
105 |
height: 200px; |
106 |
vertical-align: top; |
107 |
}
|
108 |
|
109 |
.handmade-form legend { |
110 |
padding-top: 15px; |
111 |
margin: 0 auto; |
112 |
}
|
113 |
|
114 |
.handmade-form ::placeholder { |
115 |
color: inherit; |
116 |
/*Fix opacity issue on Firefox*/
|
117 |
opacity: 1; |
118 |
}
|
119 |
|
120 |
.handmade-form .form-wrapper svg { |
121 |
position: absolute; |
122 |
top: 0; |
123 |
left: 0; |
124 |
width: 100%; |
125 |
height: 100%; |
126 |
}
|
127 |
|
128 |
.handmade-form button { |
129 |
font-family: "Summer Bold"; |
130 |
color: var(--white); |
131 |
padding: 5px 10px; |
132 |
}
|
133 |
|
134 |
|
135 |
/* RADIO BUTTONS
|
136 |
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
137 |
.handmade-form .checkbox-list { |
138 |
display: flex; |
139 |
justify-content: center; |
140 |
}
|
141 |
|
142 |
.handmade-form .checkbox-list .first { |
143 |
margin-right: 50px; |
144 |
}
|
145 |
|
146 |
.handmade-form .checkbox-list label svg { |
147 |
top: 50%; |
148 |
left: -25px; |
149 |
width: 20px; |
150 |
height: 20px; |
151 |
transform: translateY(-50%); |
152 |
}
|
153 |
|
154 |
.handmade-form .checkbox-list label .checkmark { |
155 |
/*the value of the stroke-* properties comes from the getTotalLength() method*/
|
156 |
stroke-dasharray: 233.69552612304688; |
157 |
stroke-dashoffset: 233.69552612304688; |
158 |
transition: stroke-dashoffset 0.5s linear; |
159 |
}
|
160 |
|
161 |
.handmade-form [type="radio"]:checked + label .checkmark { |
162 |
stroke-dashoffset: 0; |
163 |
}
|
164 |
|
165 |
|
166 |
/* MQ
|
167 |
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
168 |
@media screen and (min-width: 600px) { |
169 |
.handmade-form .grid { |
170 |
display: grid; |
171 |
grid-gap: 1.5rem; |
172 |
}
|
173 |
|
174 |
.handmade-form .grid-2 { |
175 |
grid-template-columns: repeat(2, 1fr); |
176 |
}
|
177 |
|
178 |
.handmade-form .grid-3 { |
179 |
grid-template-columns: repeat(3, 1fr); |
180 |
}
|
181 |
|
182 |
.handmade-form .grid > *:not(:last-child) { |
183 |
margin-bottom: 0; |
184 |
}
|
185 |
}
|
186 |
|
187 |
|
188 |
/* OUTPUT MESSAGES CF7
|
189 |
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
190 |
span.wpcf7-form-control-wrap { |
191 |
display: block; |
192 |
}
|
193 |
|
194 |
span.wpcf7-not-valid-tip { |
195 |
position: absolute; |
196 |
bottom: 5px; |
197 |
right: 5px; |
198 |
font-size: 24px; |
199 |
}
|
200 |
|
201 |
div.wpcf7-validation-errors, |
202 |
div.wpcf7-acceptance-missing, |
203 |
div.wpcf7-mail-sent-ng, |
204 |
div.wpcf7-aborted, |
205 |
div.wpcf7-mail-sent-ok { |
206 |
border: none; |
207 |
color: var(--red); |
208 |
margin: 0; |
209 |
}
|
210 |
|
211 |
div.wpcf7-mail-sent-ok { |
212 |
color: green; |
213 |
}
|
Nota: Para este ejemplo estoy usando un tema simple. Sin embargo, dependiendo de tu tema, algunos de estos estilos pueden sobrescribirse. Teniendo en cuenta este hecho, si el formulario no tiene la apariencia esperada en tu proyecto, asegúrate de verificar los estilos de tu tema y hacer los cambios necesarios.
4. Agrega el código JavaScript
A continuación, vamos a poner en cola un nuevo archivo JavaScript en el archivo functions.php
de nuestro proyecto, de esta forma (es posible que tu carpeta de destino sea diferente):
1 |
wp_enqueue_script( 'customjs', get_template_directory_uri() . '/assets/js/custom.js', array(), '', true ); |
2 |
Después, en su interior, vamos a escribir el código necesario para la funcionalidad de las casillas de verificación:
1 |
const radios = document.querySelectorAll(".checkbox-list .wpcf7-list-item"); |
2 |
const wpcf7Elm = document.querySelector(".wpcf7"); |
3 |
|
4 |
radios.forEach((radio) => { |
5 |
const input = radio.querySelector("input"); |
6 |
input.nextElementSibling.remove(); |
7 |
const inputValue = input.value; |
8 |
input.id = inputValue; |
9 |
const label = document.createElement("label"); |
10 |
label.setAttribute("for", inputValue); |
11 |
label.innerHTML = ` |
12 |
<svg>
|
13 |
<use xlink:href="#checkbox_empty"></use>
|
14 |
</svg>
|
15 |
<svg class="checkmark">
|
16 |
<use xlink:href="#checkmark"></use>
|
17 |
</svg>
|
18 |
By ${inputValue} |
19 |
`; |
20 |
radio.appendChild(label); |
21 |
});
|
Paso adicional: personaliza los mensajes de salida
Solo por diversión, agreguemos uno de nuestros SVGs personalizados a los mensajes de salida de AJAX.



Para hacer esto no usaremos CSS en absoluto; en su lugar, aprovecharemos los eventos AJAX de Contact Form 7:
1 |
const wpcf7Elm = document.querySelector(".wpcf7"); |
2 |
const output = document.querySelector(".wpcf7-response-output"); |
3 |
const html = ` |
4 |
<svg>
|
5 |
<use xlink:href="#fieldset"></use>
|
6 |
</svg>
|
7 |
`; |
8 |
|
9 |
wpcf7Elm.addEventListener("wpcf7submit", () => { |
10 |
setTimeout(() => { |
11 |
output.classList.add("form-wrapper"); |
12 |
output.insertAdjacentHTML("beforeend", html); |
13 |
}, 100); |
14 |
});
|
5. Llama al formulario de contacto
Por último, pero no por eso menos importante, vamos a incluir el código corto generado de CF7 en la parte de nuestro proyecto que sea deseada:
1 |
[contact-form-7 id="5" title="Handmade SVG Form" html_class="handmade-form container"] |
Observa las clases agregadas a través del atributo html_class
.
Complementos prémium de formularios de contacto
Los complementos gratuitos son perfectos cuando estás comenzando con WordPress, pero si quieres pasar al siguiente nivel con tus sitios y ahorrar tiempo al hacerlo, considera un complemento prémium de formularios de contacto de CodeCanyon.
- WordPressLos mejores complementos de formularios de contacto de WordPressNona Blackman
- WordPressElige un generador de formularios: los 7 mejores generadores de formularios de WordPress comparadosNona Blackman
- Complementos de WordPressCrea un formulario de contacto con la función de arrastrar y soltar usando el complemento FormCraft 3 de WordPressDaniel Strongin
¡Acabas de personalizar un Contact Form 7 con SVG!
¡Y hemos terminado, amigos! En este tutorial seguimos el proceso para convertir un formulario SVG estático a algo dinámico incorporándolo en un popular complemento de formularios de WordPress. Ojalá que los pasos hayan sido claros para ti y que lo pongas en práctica.
¿Alguna vez has hecho alguna personalización para Contact Form 7?
Si tienes alguna pregunta o problema, ¡házmelo saber en los comentarios a continuación!