Advertisement
  1. Web Design
  2. UX/UI
  3. Forms

Cómo personalizar Contact Form 7 en WordPress con un SVG hecho a mano

Scroll to top
Read Time: 8 min

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

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:

As a first step we have to create a new fileAs a first step we have to create a new fileAs a first step we have to create a new file

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

Then include it in the header of our themeThen include it in the header of our themeThen include it in the header of our theme


2. Crea el formulario de contacto

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

The name of our handmade SVG formThe name of our handmade SVG formThe name of our handmade SVG form

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.container. Más tarde, cuando llamemos al formulario, adjuntaremos estas clases contenedoras directamente al elemento form.
  • 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 un ul, sino que la convertiremos en un div.

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.

Add a custom SVG to the output messageAdd a custom SVG to the output messageAdd a custom SVG to the output message

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.

¡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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.