El teu web va lent o s’ha quedat antic: l’arreglo o te’n faig un de nou

Primer el reviso gratis i et dic què li passa. Si es pot arreglar, et passo un pressupost tancat. Si surt més a compte fer-ne un de nou, el refaig amb un dels plans, hi passo el teu contingut i mantinc les teves visites de Google sense cost extra.

Per a qui és

  • Webs que triguen a carregar i perden visites per això
  • Webs on actualitzar un connector fa por
  • Qui ha perdut posicions a Google des de l’últim canvi

Per a qui no és

  • Webs acabats de fer en què el problema és el contingut i no el codi
  • Botigues amb lògica complexa de WooCommerce: per a això hi ha el desenvolupament a mida

Com ho faig

El que canvio quan reviso un web.

Set exemples del tipus de canvi que surt d’una revisió. A l’esquerra el que sol haver-hi; a la dreta el que hi deixo. El codi és d’exemple: els problemes són els de sempre.

Tria un arranjament
Rendiment3
Accessibilitat2
Seguretat2
Tema de l’editor
index.htmlcss/listado.csssrc/lib/listado.tspartials/menu.htmlcontacto.htmlwp-content/themes/casa/tarjeta.phpsrc/pages/api/contacto.ts
Abans i després de index.html
                     <!-- Portada: la imagen es lo primero que se pinta. --> <section class="hero grid gap-6 py-24">-  <img src="portada.jpg" class="w-full rounded-xl">+  <img src="portada.avif" class="w-full rounded-xl"+       width="1600" height="900" decoding="async"+       fetchpriority="high" alt="Cocina en Chamberí">   <h1 class="text-5xl font-semibold tracking-tight">     Reformas integrales en Madrid, sin sorpresas   </h1>   <p class="max-w-prose text-lg text-neutral-400">     Presupuesto cerrado en 48 horas laborables.   </p>   <a href="/contacto" class="btn">Pedir presupuesto</a> </section>
                  
Abans i després de css/listado.css
                     .listado { display: grid; gap: 1rem; } -/* Tres saltos, y ninguno sabe cuánto sitio hay. */+/* La tarjeta mide su hueco, no la ventana. */-.tarjeta { padding: 16px; font-size: 18px; }+.listado { container-type: inline-size; }-+-@media (max-width: 900px) {+.tarjeta {-  .tarjeta { padding: 12px; font-size: 16px; }+  padding: clamp(0.5rem, 2cqi, 1rem);-}+  font-size: clamp(0.875rem, 1.6cqi, 1.125rem);-+  border-radius: clamp(0.25rem, 1cqi, 0.75rem);-@media (max-width: 600px) {+}-  .tarjeta { padding: 8px; font-size: 14px; }+-}+@container (min-width: 30rem) {+  .tarjeta { grid-template-columns: 8rem 1fr; }+}
                  
Abans i després de src/lib/listado.ts
                     export async function cargarListado() {   const items = await db.producto.findMany({     where: { activo: true },+    // La categoría entra en la misma ida.+    include: { categoria: true },   }); -  // Una consulta, y luego otra por item.-  for (const item of items) {-    item.categoria = await db.categoria-      .findUnique({ id: item.categoriaId });-  }    return items; }
                  
Abans i després de partials/menu.html
                    -<div class="menu__abrir"+<button class="menu__abrir"-     onclick="abrirMenu()">+        type="button"+        aria-expanded="false"+        aria-controls="menu">+  <span class="sr-only">Abrir el menú</span>   <span></span>   <span></span>-</div>+</button>  <nav id="menu" class="menu">   <a href="/servicios">Servicios</a>   <a href="/proyectos">Proyectos</a>   <a href="/precios">Precios</a>   <a href="/contacto">Contacto</a> </nav>
                  
Abans i després de contacto.html
                     <form method="post" action="/contacto">   <label for="email">Correo</label>-  <input id="email" type="email"+  <input id="email" type="email"-         name="email">+         name="email"+         aria-invalid="true"+         aria-describedby="email-error"> -  <span class="error">+  <span class="error" id="email-error"+        role="alert">     Escribe un correo válido   </span>    <button type="submit">Enviar</button> </form>
                  
Abans i després de wp-content/themes/casa/tarjeta.php
                     <section class="listado"> <?php foreach ( $productos as $p ) : ?> <article class="tarjeta">-  <img src="<?php echo $p['imagen']; ?>" alt="">+  <img src="<?php echo esc_url( $p['imagen'] ); ?>"-  <h2><?php echo $p['nombre']; ?></h2>+       alt="<?php echo esc_attr( $p['nombre'] ); ?>">-  <p><?php echo $p['descripcion']; ?></p>+  <h2><?php echo esc_html( $p['nombre'] ); ?></h2>-  <a href="<?php echo $p['url']; ?>">+  <p><?php echo wp_kses_post( $p['descripcion'] ); ?></p>-    Ver ficha de <?php echo $p['nombre']; ?>+  <a href="<?php echo esc_url( $p['url'] ); ?>">-  </a>+    Ver ficha de <?php echo esc_html( $p['nombre'] ); ?>+  </a> </article> <?php endforeach; ?> </section>
                  
Abans i després de src/pages/api/contacto.ts
                     // El esquema estaba escrito y no lo miraba nadie. const Lead = z.object({   nombre: z.string().min(2).max(80),   email: z.email(),   mensaje: z.string().min(10).max(2000), });  export async function POST({ request }) {-  const datos = await request.json();+  const lead = Lead.safeParse(await request.json());-  await guardarLead(datos);+  if (!lead.success) {+    return new Response(null, { status: 422 });+  }+  await guardarLead(lead.data);   return new Response(null, { status: 204 }); }
                  

Per on començar

  1. Primer

    Radiografia del teu web

    gratis

    Et miro el web i en menys de 48 hores laborables et dic què li passa i què arreglaria primer.

    Demanar radiografia
  2. Després

    Refer el teu web antic

    590 €des de

    Si el teu no es pot arreglar, el refaig amb un dels plans. Hi passo el teu contingut i mantinc les teves visites de Google sense cost extra.

    Demanar pressupost gratis
  3. Perquè duri

    Manteniment continu

    49 €al mes

    Còpies, actualitzacions, seguretat i avís si el web cau, des del primer mes. Tres trams, segons quant vulguis canviar cada mes.

    Veure preus

Parlem del teu projecte?

Explica’m què necessites i et dono una primera valoració en menys de 24 hores laborables.

Resposta en 24 h laborables