Sviluppo e nerditudineRighe di
Righe di
codice.
Snippet, esperimenti tecnici, architetture e appunti di sviluppo frontend e backend.

Digitalmente pensieroso
Caricamento feed...
Snippet, esperimenti tecnici, architetture e appunti di sviluppo frontend e backend.

Snippet PHP per personalizzare esteticamente la pagina di login di WordPress tramite functions.php. Logo, colori e redirect.
function custom_login_styles() { ?>
<style type="text/css">
/* Modifica il logo */
#login h1 a, .login h1 a {
background-image: url(<?php echo get_stylesheet_directory_uri(); ?>/assets/images/custom-logo.png);
height: 80px;
width: 320px;
background-size: contain;
background-repeat: no-repeat;
padding-bottom: 20px;
}
/* Modifica il colore di sfondo della pagina */
body.login {
background-color: #1a1a1a;
}
/* Modifica il pulsante di login */
#wp-submit {
background-color: #0073aa;
border-color: #006799;
box-shadow: none;
text-shadow: none;
}
</style>
<?php }
add_action( 'login_enqueue_scripts', 'custom_login_styles' );
Come usare Keystatic come CMS per authoring e Zod per validare la SEO e i tipi al build-time in Next.js senza lock-in.
import fs from "node:fs";
import path from "node:path";
import matter from "gray-matter";
import { z } from "zod";
// Schema Zod per validare il contenuto generato dal CMS
const articleSchema = z.object({
title: z.string().min(1).max(80),
date: z.coerce.date(),
// La SEO description è obbligatoria tra 50 e 160 caratteri:
// se manca o è troppo corta, il build di Next.js fallisce.
description: z.string().min(50).max(160),
status: z.enum(["beta", "rc", "production"]).default("beta"),
draft: z.boolean().default(false),
});
export function getArticle(filePath: string) {
const fileContent = fs.readFileSync(filePath, "utf8");
const { data, content } = matter(fileContent);
// Validazione rigida prima della generazione statica
const parsed = articleSchema.safeParse(data);
if (!parsed.success) {
throw new Error(
`Frontmatter non valido in ${filePath}:\n${parsed.error.message}`,
);
}
return {
...parsed.data,
body: content.trim(),
};
}