<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Opengraph on LinuxmanR4</title><link>https://linuxmanr4.com/tags/opengraph/</link><description>Recent content in Opengraph on LinuxmanR4</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>LinuxmanR4</copyright><lastBuildDate>Fri, 30 May 2025 19:47:17 +0000</lastBuildDate><atom:link href="https://linuxmanr4.com/tags/opengraph/index.xml" rel="self" type="application/rss+xml"/><item><title>De WhatsApp, Open Graph y unas tristes comillas</title><link>https://linuxmanr4.com/2025/05/30/whatsapp-open-graph-comillas/</link><pubDate>Fri, 30 May 2025 19:47:17 +0000</pubDate><guid>https://linuxmanr4.com/2025/05/30/whatsapp-open-graph-comillas/</guid><description>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/05/whatsapp-open-graph.jpg" alt="Featured image of post De WhatsApp, Open Graph y unas tristes comillas" />&lt;p>En estos días me he obsesionado con opengraph y como implementarlo en mis proyectos. Y de cierta forma lo había logrado en todos menos en uno y solamente me fallaba con Whatsapp. Me llevó varios días dar con la solución.&lt;/p>
&lt;h2 id="qué-es-open-graph">¿Qué es Open Graph?
&lt;/h2>&lt;p>&lt;a class="link" href="https://ogp.me/" target="_blank" rel="noopener"
>Open Graph&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
es un protocolo creado por Facebook que permite a los desarrolladores web definir cómo se muestra el contenido de una página cuando se comparte en redes sociales, como Facebook, Twitter, LinkedIn, WhatsApp, etc.&lt;/p>
&lt;p>Consiste en un conjunto de meta etiquetas ( &lt;strong>&lt;meta>&lt;/strong>) que se añaden al código HTML de una página para especificar información como el título, la descripción, la imagen y el tipo de contenido que aparecerán en la vista previa del enlace compartido.&lt;/p>
&lt;p>Por ejemplo, las etiquetas básicas de Open Graph incluyen:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>og:title&lt;/strong>: El título del contenido.&lt;/li>
&lt;li>&lt;strong>og:description&lt;/strong>: Una breve descripción del contenido.&lt;/li>
&lt;li>&lt;strong>og:image&lt;/strong>: La URL de la imagen que se mostrará.&lt;/li>
&lt;li>&lt;strong>og:url&lt;/strong>: La URL canónica de la página.&lt;/li>
&lt;li>&lt;strong>og:type&lt;/strong>: El tipo de contenido (por ejemplo, &amp;ldquo;article&amp;rdquo;, &amp;ldquo;website&amp;rdquo;, &amp;ldquo;video&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;p>Un ejemplo de implementación básica en HTML:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:title&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Título de la página&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:description&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Descripción del contenido de la página.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:image&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://ejemplo.com/imagen.jpg&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:url&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://ejemplo.com&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:type&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;website&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cómo-se-implementa-open-graph">¿Cómo se implementa Open Graph?
&lt;/h2>&lt;p>Pues hay varias opciones, por ejemplo en Wordpress le dejo esta responsabilidad &lt;a class="link" href="https://rankmath.com/" target="_blank" rel="noopener"
>Rank Math&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
mi plugin que se encarga del SEO. Y a la fecha no he tenido problemas.&lt;/p>
&lt;p>En el caso de &lt;a class="link" href="https://linuxmanr4.com/torreon/" >Torreón Antiguo&lt;/a>
en donde utilizo &lt;a class="link" href="https://linuxmanr4.com/2025/04/24/web-estatico-eleventy-javascript/" >Eleventy&lt;/a>
para generar el contenido. No hay de otra más que hacerlo a manita.&lt;/p>
&lt;p>Puede ser complicado y no hay una fórmula general, pero para que tengan una idea, esta es la parte de implementación que estoy utilizando.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- meta tags si es un artículo o la página principal --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{% if articulo.titulo %}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- metatags --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;description&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;{{ articulo.texto | replace(&amp;#34;&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="na">n&lt;/span>&lt;span class="err">&amp;#34;,&lt;/span> &lt;span class="err">&amp;#34;&lt;/span> &lt;span class="err">&amp;#34;)&lt;/span> &lt;span class="err">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">truncate&lt;/span>&lt;span class="err">(&lt;/span>&lt;span class="na">160&lt;/span>&lt;span class="err">)&lt;/span> &lt;span class="err">}}&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;keywords&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Torreón antiguo, La Laguna años 70, archivo fotográfico, leyendas, cultura norteña antigua, edificios de Torreón&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- opengraph --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:locale&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;es&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:url&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/{{ articulo.titulo | slugify }}.html&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:title&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;{{ articulo.titulo | truncate(50) }}&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:description&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;{{ articulo.texto | replace(&amp;#34;&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="na">n&lt;/span>&lt;span class="err">&amp;#34;,&lt;/span> &lt;span class="err">&amp;#34;&lt;/span> &lt;span class="err">&amp;#34;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">|&lt;/span> &lt;span class="na">truncate&lt;/span>&lt;span class="err">(&lt;/span>&lt;span class="na">160&lt;/span>&lt;span class="err">)&lt;/span> &lt;span class="err">}}&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:image&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/imagenes/{{ articulo.imagenes[0].nombre }}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:type&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;article&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:logo&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/android-chrome-192x192.png&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- twitter card --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:card&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;summary_large_image&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:site&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;@linuxmanr4&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:title&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;{{ articulo.titulo | truncate(50) }}&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:description&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;{{ articulo.texto | replace(&amp;#34;&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="na">n&lt;/span>&lt;span class="err">&amp;#34;,&lt;/span> &lt;span class="err">&amp;#34;&lt;/span> &lt;span class="err">&amp;#34;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">|&lt;/span> &lt;span class="na">truncate&lt;/span>&lt;span class="err">(&lt;/span>&lt;span class="na">160&lt;/span>&lt;span class="err">)&lt;/span> &lt;span class="err">}}&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:image&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/imagenes/{{ articulo.imagenes[0].nombre }}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:image:alt&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;{{ articulo.titulo }}&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{% else %}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- metatags --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;description&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Archivo nostálgico de la comunidad de Google+ Torreón antiguo. Revive el pasado con fotos históricas, relatos ciudadanos y recuerdos colectivos de la ciudad de Torreón Coahuila. Memoria visual preservada para las futuras generaciones.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;keywords&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Torreón antiguo, La Laguna años 70, archivo fotográfico, leyendas, cultura norteña antigua, edificios de Torreón&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- opengraph --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:locale&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;es&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:url&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:title&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Torreón antiguo, archivo nostálgico de la ciudad de Torreón&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:description&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;El alma digital de los recuerdos laguneros. Último refugio de la comunidad de Google+ sobre la historia local de Torreón&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:image&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/imagenes/casa_arocena.jpg&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:type&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;website&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:logo&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/android-chrome-192x192.png&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- twitter card --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:card&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;summary_large_image&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:site&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;@linuxmanr4&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:title&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Torreón antiguo, archivo nostálgico de la ciudad de Torreón&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:description&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Resguardo digital de la comunidad de Google+ sobre el Torreón del ayer. Fotos históricas, relatos ciudadanos y recuerdos preservados de la Comarca Lagunera.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:image&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/torreon/imagenes/casa_arocena.jpg&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;twitter:image:alt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Fotografía antigua de la Casa Arocena en color.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{% endif %}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hay una condición &lt;strong>if&lt;/strong> para distinguir si se trata de la página principal o de un artículo. Y crea los meta tags correspondientes para cada situación.&lt;/p>
&lt;p>El problema era en &lt;a class="link" href="https://centaurodelnorte.com/" target="_blank" rel="noopener"
>Centauro del Norte&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
, que utiliza &lt;a class="link" href="https://linuxmanr4.com/2021/07/14/lazy-load-rudimentario-para-sitios-que-utilizan-pelican/" >Pelican&lt;/a>
(similar a Eleventy, pero con Python). Tengo que codificar todo para que me construya las meta tags correspondientes.&lt;/p>
&lt;h2 id="revisando-con-un-validador-de-open-graph">Revisando con un validador de Open Graph
&lt;/h2>&lt;p>Me tardé más de lo debido en refinar todo el código, pero funcionó, bueno, casi.&lt;/p>
&lt;p>Funcionaba bien en Telegram, Twitter, pero cuando quería compartir el enlace en Whatsapp, pues nomás no. Solo mostraba un enlace pelón y así no me gustaba.&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/05/imagen.png">
&lt;/figure>
&lt;p>Intenté con un validador de opengraph de un sitio llamado &lt;a class="link" href="https://orcascan.com/tools/open-graph-validator?url=https%3A%2F%2Fcentaurodelnorte.com%2Ffrancisco-i-madero-un-hombre-de-ideales%2F" target="_blank" rel="noopener"
>OrcaScan&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
y parecía que todo estaba correcto ¿Entonces? ¿Qué estaba fallando?&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/05/imagen.jpg"
alt="Resultados de la validación de Open Graph por OrcaScan ">&lt;figcaption>
&lt;p>Resultados de la validación de Open Graph por OrcaScan&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Le invertí varios días picando código. Incluso encontré otros problemas que no estaba buscando, revisé el código HTML generado por Pelican y todo parecía correcto, hasta qué &amp;hellip;&lt;/p>
&lt;h2 id="la-minificación">La minificación
&lt;/h2>&lt;p>La minificación en desarrollo web es el proceso de reducir el tamaño de archivos de código, como HTML, CSS, JavaScript o JSON, eliminando elementos innecesarios sin alterar su funcionalidad. Esto incluye:&lt;/p>
&lt;ul>
&lt;li>Eliminar espacios en blanco, saltos de línea y tabulaciones.&lt;/li>
&lt;li>Quitar comentarios del código.&lt;/li>
&lt;li>Acortar nombres de variables, funciones o clases (en JavaScript, por ejemplo).&lt;/li>
&lt;li>Optimizar estructuras para usar menos caracteres (por ejemplo, eliminar puntos y comas innecesarios en JavaScript cuando es posible).&lt;/li>
&lt;/ul>
&lt;p>Básicamente, es una optimización del código para la máquina. La computadora no va a leer tus comentarios, no le interesan esas coquetonas líneas en blanco, o el abuso de tabuladores para identar el código, nooooo, se los brinca olímpicamente y la minificación es algo que suelo hacer antes de subir el proyecto a Internet.&lt;/p>
&lt;h2 id="el-problema-son-las-comillas">El problema son las comillas
&lt;/h2>&lt;p>Al revisar el código después de la minificación me di cuenta de que el código optimizado no tenía comillas.&lt;/p>
&lt;p>Me explico, usualmente muchos parámetros de los tags de HTML usan comillas, por ejemplo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">property&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;og:image&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://ejemplo.com/imagen.jpg&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El mismo código optimizado me aparecía así:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">&amp;lt;meta property=og:image content=https://ejemplo.com/imagen.jpg /&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>¿Esto es un problema? En teoría, no, es válido, aunque tiene sus reglas.&lt;/p>
&lt;p>No es obligatorio usar comillas en HTML5 para los valores de atributos sin espacios ni caracteres especiales, pero es una buena práctica usarlas siempre para mantener el código claro, consistente y compatible con diferentes herramientas y estándares.&lt;/p>
&lt;p>Ahora en Eleventy utilizo &lt;a class="link" href="https://www.11ty.dev/docs/transforms/#minify-html-output" target="_blank" rel="noopener"
>htmlmin&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
para esta tarea. En Pelican uso el &lt;a class="link" href="https://github.com/pelican-plugins/minify" target="_blank" rel="noopener"
>plugin minify&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
que durante la optimización elimina las comillas del código.&lt;/p>
&lt;p>No sería un inconveniente, pero &lt;strong>WhatsApp&lt;/strong> quiere esas comillas y ese es el verdadero problema.&lt;/p>
&lt;p>Sin esas comillas no funciona ¡Hágame usted el favor! 😠&lt;/p>
&lt;p>Estuve revisando la documentación del plugin, pero aparentemente no hay una opción que modifique su comportamiento y me regrese esas comillas.&lt;/p>
&lt;h2 id="minify-al-rescate">Minify al rescate
&lt;/h2>&lt;p>Afortunadamente, me encontré con &lt;a class="link" href="https://github.com/tdewolff/minify" target="_blank" rel="noopener"
>minify&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
un programa escrito en Go que es rapidísimo y que puedo usar desde la terminal.&lt;/p>
&lt;p>Tiene la opción de conservar las comillas 👍 se puede especificar todo un directorio recursivamente 👍👍 y tiene una velocidad más que decente 👍👍👍.&lt;/p>
&lt;p>El comando quedaría así:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">minify --html-keep-quotes -i -r output/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>La opción &lt;strong>-i&lt;/strong> es para que haga la optimización en esa misma carpeta sobreescribiendo los archivos.&lt;/p>
&lt;p>La opción &lt;strong>-r&lt;/strong> es para que busque recursivamente en todas las sub carpetas de la carpeta output.&lt;/p>
&lt;p>Después de subir el proyecto y hacer algunas pruebas, este fue el resultado.&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/05/imagen-1.jpg"
alt="Después de dejar las comillas en los metatags de Open Graph este fue el resultado.">&lt;figcaption>
&lt;p>Después de dejar las comillas en los metatags de Open Graph este fue el resultado.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h2 id="conclusiones">Conclusiones
&lt;/h2>&lt;p>La inspiración para la solución me llegó del lugar más escondido de Stack Overflow &lt;a class="link" href="https://stackoverflow.com/questions/25100917/showing-thumbnail-for-link-in-whatsapp-ogimage-meta-tag-doesnt-work" target="_blank" rel="noopener"
>Showing Thumbnail for link in WhatsApp || og:image meta-tag doesn&amp;rsquo;t work&lt;/a>
&lt;span style="white-space: nowrap;">&lt;svg width=".7em"
height=".7em" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z" fill="currentColor" />
&lt;path d="M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z"
fill="currentColor">
&lt;/svg>&lt;/span>
&lt;/p>
&lt;figure>&lt;img src="https://linuxmanr4.com/wp-content/uploads/2025/05/imagen-1.png">
&lt;/figure>
&lt;p>Le invertí varios días en solucionar un problema que era muy simple de arreglar.&lt;/p>
&lt;p>Si les llega a pasar algo similar, espero que este artículo les ahorre tiempo y quebraderos de cabeza.&lt;/p>
&lt;p>¡Hasta la próxima!&lt;/p></description></item></channel></rss>