<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Publicaciones &#8211; danisanchez.net</title>
	<atom:link href="https://danisanchez.net/category/publicaciones/feed/" rel="self" type="application/rss+xml" />
	<link>https://danisanchez.net</link>
	<description></description>
	<lastBuildDate>Mon, 06 Jan 2025 17:57:46 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://danisanchez.net/wp-content/uploads/2026/07/cropped-favicon-32x32.png</url>
	<title>Publicaciones &#8211; danisanchez.net</title>
	<link>https://danisanchez.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Portátiles reacondicionados, ¿mejor que uno nuevo?</title>
		<link>https://danisanchez.net/portatiles-reacondicionados-mejor-que-uno-nuevo/</link>
					<comments>https://danisanchez.net/portatiles-reacondicionados-mejor-que-uno-nuevo/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 06 Jan 2025 17:57:46 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[thinkpad]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=14678</guid>

					<description><![CDATA[Para responder a esta pregunta, solo tenemos que tantear un poco el mercado. Por supuesto me quiero referir a portátiles de mismo precio. Supongamos que tenemos unos 300€ de presupuesto, ¿compro un portátil nuevo o uno usado reacondicionado? A día de hoy, con unos 300€ puedes comprar un ASUS Vivobook Go E510KA-EJ680 con procesador Intel [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Para responder a esta pregunta, solo tenemos que tantear un poco el mercado. Por supuesto me quiero referir a portátiles de mismo precio. Supongamos que tenemos unos 300€ de presupuesto, ¿compro un portátil nuevo o uno usado reacondicionado?</p>



<p class="wp-block-paragraph">A día de hoy, con unos 300€ puedes comprar un <a href="https://www.pccomponentes.com/asus-vivobook-go-e510ka-ej680-intel-celeron-n4500-8gb-256gb-ssd-156" target="_blank" rel="noreferrer noopener nofollow">ASUS Vivobook Go E510KA-EJ680</a> con procesador Intel Celeron N4500, 8GB RAM (no ampliables) y 256GB SSD.</p>



<p class="wp-block-paragraph">O puedes comprar reacondicionado un <a href="https://www.info-computer.com/lenovo-thinkpad-x13-g1-core-i5-10210u-16-ghz-8-gb-256-nvme-win-11-pro.html">Thinkpad X13 </a><a href="https://www.info-computer.com/lenovo-thinkpad-x13-g1-core-i5-10210u-16-ghz-8-gb-256-nvme-win-11-pro.html" target="_blank" rel="noreferrer noopener nofollow">G1</a> con procesador Core i5 10210U, 8GB RAM (ampliable a 64GB) y 256GB NVME.</p>



<p class="wp-block-paragraph">Ambos equipos cuentan con 3 años de garantía. </p>



<p class="wp-block-paragraph">El ASUS, a pesar de ser nuevo, no deja de ser un equipo de gama baja, donde prima el ahorro máximo de costes en su proceso de fabricación. Cuenta con un procesador mediocre y bastante lento, no apto para ejercer de equipo principal de trabajo en la mayoría de casos. Además, al llevar casi todos los componentes soldados a la placa base, lo hacen un equipo de difícil reparación y prácticamente nula ampliación. Lo que se dice un equipo de usar y tirar. </p>



<p class="wp-block-paragraph"> En cambio el ThinkPad, aún siendo usado, es un equipo de gama profesional, con materiales y calidad de construcción de primer nivel, equipado con un procesador de rendimiento muy superior a un equipo nuevo de igual precio y a pesar de ser 5 años más antiguo, solo compara&#8230;</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="842" height="641" src="https://danisanchez.net/wp-content/uploads/2025/01/imagen-2.png" alt="" class="wp-image-14683" srcset="https://danisanchez.net/wp-content/uploads/2025/01/imagen-2.png 842w, https://danisanchez.net/wp-content/uploads/2025/01/imagen-2-300x228.png 300w, https://danisanchez.net/wp-content/uploads/2025/01/imagen-2-768x585.png 768w" sizes="(max-width: 842px) 100vw, 842px" /></figure>



<h3 class="wp-block-heading">Entonces la respuesta es clara&#8230; ¿es mejor un equipo reacondicionado?</h3>



<p class="wp-block-paragraph">A igualdad de precio, SI, rotundamente.</p>



<h3 class="wp-block-heading">Mi experiencia con los Lenovo ThinkPad</h3>



<p class="wp-block-paragraph">En 2010 compré mi último portátil nuevo, un ASUS K50IJ, con procesador Intel Dual Core T4400, 4GB RAM y 320GB HDD, por unos 500€.</p>



<p class="wp-block-paragraph">El equipo ha estado funcionando hasta 2019, aunque como equipo secundario desde 2012 junto a un sobremesa que hacía de equipo principal. Ya en su día, era un portátil de gama media-baja.</p>



<p class="wp-block-paragraph">Y no es que haya dejado de funcionar en 2019, de hecho aún enciende y con una distro GNU/Linux liviana es incluso usable. El problema es que ya no rendía para mi trabajo del día a día, salvo tareas ofimáticas muy básicas (consultar correo, navegar con paciencia&#8230;).</p>



<p class="wp-block-paragraph">Por eso en 2019 empecé a buscar nuevo portátil, con un presupuesto similar (500€), buscaba algo que en potencia se acercase al equipo de sobremesa, que contaba por entonces con un Intel i5 2500K, un procesador que ya tenía sus 7 años, pero que rendía muy bien para mi trabajo diario.</p>



<p class="wp-block-paragraph">Fue cuando se me cruzaron los portátiles reacondicionados, en concreto los Lenovo ThinkPad. ThinkPad es la gama empresarial de Lenovo, por lo que la calidad de componentes, construcción y durabilidad está garantizada. Solo hay que elegir el hardware adecuado para tu actividad y que así te dure a buen rendimiento el mayor tiempo.</p>



<p class="wp-block-paragraph">Me decidí por un T540p con procesador i5 4300M y 8 GB de RAM y pantalla de 15&#8243; Full HD, por 330€ con 3 años de garantía. Un equipo que ya contaba con unos 5 años, pero totalmente revisado y limpio, parecía estar estrenándolo.</p>



<p class="wp-block-paragraph">Una configuración un pelín inferior a mi sobremesa, pero mucho más potente que mi anterior portátil, aquí podemos ver una tabla de los 3 procesadores.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="839" height="686" src="https://danisanchez.net/wp-content/uploads/2025/01/imagen.png" alt="" class="wp-image-14680" srcset="https://danisanchez.net/wp-content/uploads/2025/01/imagen.png 839w, https://danisanchez.net/wp-content/uploads/2025/01/imagen-300x245.png 300w, https://danisanchez.net/wp-content/uploads/2025/01/imagen-768x628.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></figure>



<p class="wp-block-paragraph">Aunque el T540p rendía muy bien, su punto débil era su procesador de 2 núcleos frente a los 4 del equipo de sobremesa. El equipo sufría un poco de lag en algunas tareas, se demoraba algo más en renderizar sitios webs, sobre todo trabajando con builders, como Divi, Elementor&#8230; Tardaba bastante en renderizar vídeos para mi canal de Youtube&#8230;</p>



<p class="wp-block-paragraph">Un par de años después, decidí ampliarlo y para ello busqué uno de los procesadores más potentes que pudiera ponerle (por compatibilidad), y dí con un i7-4700mq, un procesador con 4 núcleos y 8 hilos. Lo compré por 65€ en una conocida web de compra-venta y adquirí además un segundo módulo RAM de 8GB para completar su capacidad máxima (16GB).</p>



<p class="wp-block-paragraph">Una vez recibí el nuevo procesador, yo mismo llevé a cabo la sustitución, no sin algún que otro inconveniente, he de decir que acceder a la CPU de un T540p es bastante complejo, obligándote a desmontar el teclado y gran parte de la carcasa para extraer la placa base. Nada que ver con su hermano, el T440p del que hablaremos después.</p>



<p class="wp-block-paragraph">Pero tras sufrir un poco lo conseguí. Y ahora tenía un equipo portátil más potente que el propio sobremesa y con un menor consumo.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="842" height="641" src="https://danisanchez.net/wp-content/uploads/2025/01/imagen-1.png" alt="" class="wp-image-14681" srcset="https://danisanchez.net/wp-content/uploads/2025/01/imagen-1.png 842w, https://danisanchez.net/wp-content/uploads/2025/01/imagen-1-300x228.png 300w, https://danisanchez.net/wp-content/uploads/2025/01/imagen-1-768x585.png 768w" sizes="(max-width: 842px) 100vw, 842px" /></figure>



<p class="wp-block-paragraph">Fué así que empecé a usar el T540p como equipo principal de trabajo <strong>y a día de hoy, 6 de Enero de 2025, continúa siéndolo.</strong></p>



<p class="wp-block-paragraph">Tras esta ampliación, estaba tan satisfecho con el rendimiento del T540p que decidí comprar otro ThinkPad, esta vez el T440p (desde el que escribo), que prácticamente es el mismo portátil pero con pantalla de 14&#8243; y sin teclado numérico). Un poco más pequeño aunque igual de gordote.</p>



<p class="wp-block-paragraph">Lo compré esta vez por eBay por 190€ a una tienda alemana (de hecho tiene el teclado en alemán), con un i7-4600M, con la idea de ampliarlo también a un i7-4700mq. Cosa que hice a los pocos meses, y mucho más fácil. </p>



<p class="wp-block-paragraph">El T440p es una maravilla para acceder a su interior. Es quitar 2 tornillos, retirar la tapa trasera y ya tienes acceso a toda la placa base (disco duro, memorias, CPU, antena wifi, bluetooth&#8230;).</p>



<p class="wp-block-paragraph">Así que desde entonces tengo el T540p como equipo principal en mi escritorio, el cual tengo anclado a su DockStation que adquirí para ampliar su conectividad, sobre todo los USB, salidas de audio y pantallas. Mientras que el T440p es el que llevo a todos lados.</p>



<p class="wp-block-paragraph">Por otro lado, debido a mi trabajo, no me puedo permitir estar sin equipo. Por lo que si un día tengo una avería en el equipo principal, solo tengo que sacar el SSD, ponerlo en el T440p y a seguir funcionando.</p>



<h3 class="wp-block-heading">Equipos válidos pero que Windows ya no quiere&#8230;</h3>



<p class="wp-block-paragraph">Tanto el T540p como el T440p venían con Windows 10 instalado (con licencia OEM), aunque con fecha de caducidad&#8230;</p>



<p class="wp-block-paragraph">Y es que Microsoft te dice que estos equipos, perfectamente válidos, ya no son aptos para su Windows 11, con la excusa del TPM 2.0. Los procesadores de 4ª generación que tienen estos ThinkPad solo llegan hasta TPM 1.2. Así que Microsoft te invita amablemente a que desheches tu equipo y adquieras uno nuevo.</p>



<p class="wp-block-paragraph">Por suerte yo soy usuario 100% Linux desde 2018 y los ThinkPads son perfectos para estos sistemas, tanto en rendimiento como en compatibilidad.</p>



<p class="wp-block-paragraph">Ambos llevan en su interior Debian 12 y estoy seguro de que en este año que comienza, me seguirán acompañando en todos los nuevos proyectos que inicie.</p>



<h3 class="wp-block-heading">En el futuro, seguiré apostando por reacondicionados&#8230;</h3>



<p class="wp-block-paragraph">No se cuánto podré alargar la vida de mis ThinkPads, todo depende de cómo avance la tecnología, de la optimización del software futuro y de las nuevas tareas que me toque acometer.</p>



<p class="wp-block-paragraph">Pero cuando llegue el momento del cambio, seguiré apostando por el reacondicionado. Seguramente invertiré en 2 nuevos equipos (principal y secundario) pero de generación más actual. Que pueda reemplazarlos rápidamente en caso de (improbable pero no imposible) avería. Para mí es sin duda, una gran tranquilidad.</p>



<h3 class="wp-block-heading">Referidos</h3>



<p class="wp-block-paragraph">Si te interesa el mundillo de los reacondicionados, te dejo por aquí el enlace al mayor grupo de Telegram en español dedicado al ThinkPad: <a href="https://t.me/Thinkpad_es">https://t.me/Thinkpad_es</a></p>



<p class="wp-block-paragraph">Un capítulo muy interesante de Podcast Linux sobre los ThinkPad en general, para que entiendas sus modelos, nomenclaturas, curiosidades: <a href="https://www.ivoox.com/129-hardware-thinkpad-audios-mp3_rf_69575979_1.html">https://www.ivoox.com/129-hardware-thinkpad-audios-mp3_rf_69575979_1.html</a></p>



<p class="wp-block-paragraph">Un nuevo portal con información, comparativas, artículos&#8230;: <a href="https://todothinkpad.org/">https://todothinkpad.org/</a></p>



<p class="wp-block-paragraph">Y sin más, me despido hasta el próximo post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/portatiles-reacondicionados-mejor-que-uno-nuevo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ocultar el botón «Volver al editor de WordPress» cuando maquetas con Elementor</title>
		<link>https://danisanchez.net/ocultar-el-boton-volver-al-editor-de-wordpress-cuando-maquetas-con-elementor/</link>
					<comments>https://danisanchez.net/ocultar-el-boton-volver-al-editor-de-wordpress-cuando-maquetas-con-elementor/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Sun, 10 Dec 2023 13:28:32 +0000</pubDate>
				<category><![CDATA[Elementor]]></category>
		<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[elementor]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=14063</guid>

					<description><![CDATA[Cuando editamos una página desde el panel de WordPress y esta ha sido editada desde Elementor, aparece un botón en la parte superior con la opción «Volver al editor de WordPress». Esto es algo muy peligroso, ya que al de volver al editor de WordPress romperíamos toda la edición realizada con Elementor. He buscado hooks [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Cuando editamos una página desde el panel de WordPress y esta ha sido editada desde Elementor, aparece un botón en la parte superior con la opción «Volver al editor de WordPress».</p>



<p class="wp-block-paragraph">Esto es algo muy peligroso, ya que al de volver al editor de WordPress romperíamos toda la edición realizada con Elementor. </p>



<p class="wp-block-paragraph">He buscado hooks o filters para ver si hay una opción que deshabilite el mencionado botón, pero  finalmente he optado por ocultarlo mediante CSS.</p>



<p class="wp-block-paragraph">Así que en todos mis child-themes para Elementor añado un fichero estilos-admin.css para la parte de administrador:</p>



<p class="wp-block-paragraph"><strong>functions.php</strong></p>



<pre class="wp-block-code"><code>function estilos_admin(){
    wp_enqueue_style('estilos-admin', get_stylesheet_directory_uri().'/css/estilos-admin.css', array(), '1.0');
}
add_action('admin_enqueue_scripts', 'estilos_admin');</code></pre>



<p class="wp-block-paragraph"><strong>estilos-admin.css</strong></p>



<pre class="wp-block-code"><code>.elementor-editor-active #elementor-switch-mode{
    display: none !important;
}</code></pre>



<p class="wp-block-paragraph">Con este pequeño código CSS hacemos que en páginas donde esté Elementor activo, no se muestre el botón de volver al editor de WordPress y además, permitimos que se muestre el botón de «Editar con Elementor» en páginas normales.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="321" src="https://danisanchez.net/wp-content/uploads/2023/12/02-ocultar-imagen-volver-al-editor-de-wordpress-1024x321.jpg" alt="" class="wp-image-14150" srcset="https://danisanchez.net/wp-content/uploads/2023/12/02-ocultar-imagen-volver-al-editor-de-wordpress-1024x321.jpg 1024w, https://danisanchez.net/wp-content/uploads/2023/12/02-ocultar-imagen-volver-al-editor-de-wordpress-300x94.jpg 300w, https://danisanchez.net/wp-content/uploads/2023/12/02-ocultar-imagen-volver-al-editor-de-wordpress-768x241.jpg 768w, https://danisanchez.net/wp-content/uploads/2023/12/02-ocultar-imagen-volver-al-editor-de-wordpress.jpg 1460w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/ocultar-el-boton-volver-al-editor-de-wordpress-cuando-maquetas-con-elementor/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>PRO Elements, o como tener Elementor Pro libre y gratuito</title>
		<link>https://danisanchez.net/pro-elements-o-como-tener-elementor-pro-libre-y-gratuito/</link>
					<comments>https://danisanchez.net/pro-elements-o-como-tener-elementor-pro-libre-y-gratuito/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Tue, 03 Jan 2023 08:23:14 +0000</pubDate>
				<category><![CDATA[Elementor]]></category>
		<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[elementor]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=13595</guid>

					<description><![CDATA[PRO Elements es un proyecto que lleva varios años adaptando Elementor Pro de forma que se pueda distribuir libre y gratuitamente. ¿Cómo es posible? Como sabéis (o deberíais saber), WordPress es un proyecto de software libre bajo licencia GPL, esta licencia permite la modificación y distribución del software siempre que las modificaciones (y distribuciones) adopten [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>PRO Elements</strong> es un proyecto que lleva varios años adaptando <em>Elementor Pro </em>de forma que se pueda distribuir libre y gratuitamente.</p>



<figure class="wp-block-image size-large"><a href="https://danisanchez.net/wp-content/uploads/2023/01/01-pro-elements.webp" target="_blank" rel="noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="370" src="https://danisanchez.net/wp-content/uploads/2023/01/01-pro-elements-1024x370.webp" alt="" class="wp-image-13600" srcset="https://danisanchez.net/wp-content/uploads/2023/01/01-pro-elements-1024x370.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/01-pro-elements-300x108.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/01-pro-elements-768x277.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/01-pro-elements.webp 1404w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Click para ampliar</figcaption></figure>



<p class="wp-block-paragraph"><strong>¿Cómo es posible?</strong></p>



<p class="wp-block-paragraph">Como sabéis (o deberíais saber), WordPress es un proyecto de software libre bajo licencia GPL, esta licencia permite la modificación y distribución del software siempre que las modificaciones (y distribuciones) adopten la misma licencia GPL a su vez. ¿Qué significa? Que cualquier software que se desarrolle en base a WordPress (una plantilla o plugin) automáticamente adopta la licencia GPL, de forma que puede ser modificado y redistribuido.</p>



<p class="wp-block-paragraph">Lógicamente los desarrolladores no van a ponerlo tan fácil, y normalmente las versiones PRO de sus plugins solo puedes descargarlas desde sus sitios web (previa compra), así como las futuras actualizaciones y soporte técnico, pero una vez que descargas el software, legalmente podrías hacer lo que quisieras con él. Desde usarlo indefinida y en cuantas instalaciones quieras, hasta modificarlo para tus propios propósitos e incluso revenderlo, siempre y cuando lo distribuyas bajo la misma licencia con la que lo adquiriste (GPL).</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Artículo disponible en vídeo:</p>
</blockquote>



<iframe loading="lazy" src="https://www.youtube-nocookie.com/embed/NG_OtZd6bas" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" width="100%" height="400" frameborder="0"></iframe>



<h2 class="wp-block-heading">¿En qué consiste PRO Elements?</h2>



<p class="wp-block-paragraph">Básicamente toman el código de <em>Elementor Pro</em>, deshabilitan el bloqueo que te impide usarlo sin licencia activa y eliminan toda la parte privada o bajo copyright dejando únicamente el código libre que los desarrolladores están obligados a distribuir.</p>



<p class="wp-block-paragraph">De esta forma tendrás todos los módulos de <em>Elementor Pro</em>, todo su maquetador de plantillas, ventanas emergentes, configurador de fuentes, etc.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="453" src="https://danisanchez.net/wp-content/uploads/2023/01/02-pro-elements-1024x453.webp" alt="" class="wp-image-13601" srcset="https://danisanchez.net/wp-content/uploads/2023/01/02-pro-elements-1024x453.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/02-pro-elements-300x133.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/02-pro-elements-768x340.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/02-pro-elements.webp 1416w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">¿Que no tendrás con PRO Elements?</h2>



<p class="wp-block-paragraph">Lógicamente no tendrás acceso a las actualizaciones de <em>Elementor Pro</em>, tendrás que esperar a que el equipo de <strong>PRO Elements</strong> adapte y libere esas actualizaciones.</p>



<p class="wp-block-paragraph">Tampoco tendrás acceso a los kits y plantillas PRO para importar en tus proyectos ni tendrás soporte técnico ni ninguna garantía de funcionamiento.</p>



<h2 class="wp-block-heading">Resumiendo, ¿es aconsejable usar PRO Elements?</h2>



<p class="wp-block-paragraph">Depende de para qué, por ejemplo yo no lo usaría en mis clientes de mantenimiento, donde es vital tener las últimas actualizaciones directamente del desarrollador y contar con soporte técnico en caso de problemas.</p>



<p class="wp-block-paragraph">Pero si que lo usaría para pruebas en local o para la enseñanza, ya que no hará falta comprar una licencia (que no es barata precisamente) para aprender a usar el maquetador o para usarlo particularmente en algún proyecto.</p>



<p class="wp-block-paragraph">Puedes descargar <strong>PRO Elements</strong> desde Github:</p>



<p class="wp-block-paragraph"><a href="https://github.com/proelements/proelements">https://github.com/proelements/proelements</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/pro-elements-o-como-tener-elementor-pro-libre-y-gratuito/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Optimizar el archivo de configuración de WordPress (wp-config.php)</title>
		<link>https://danisanchez.net/optimizar-el-archivo-de-configuracion-de-wordpress-wp-config-php/</link>
					<comments>https://danisanchez.net/optimizar-el-archivo-de-configuracion-de-wordpress-wp-config-php/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 21 Mar 2022 12:57:18 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-config.php]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=12193</guid>

					<description><![CDATA[Podemos hacer mucho dedicando unos minutos al archivo de configuración de WordPress (wp-config.php), algo a lo que muchos instaladores no prestan demasiada atención. Tenemos a nuestra disposición una extensa guía desde la documentación oficial de WordPress en https://wordpress.org/support/article/editing-wp-config-php/, aunque vamos a intentar resumir las más interesantes. Forzar al protocolo HTTPS Con estas constantes podemos forzar [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Podemos hacer mucho dedicando unos minutos al archivo de configuración de WordPress (<strong>wp-config.php</strong>), algo a lo que muchos instaladores no prestan demasiada atención.</p>



<p class="wp-block-paragraph">Tenemos a nuestra disposición una extensa guía desde la documentación oficial de WordPress en <a href="https://wordpress.org/support/article/editing-wp-config-php/" target="_blank" rel="noreferrer noopener">https://wordpress.org/support/article/editing-wp-config-php/</a>, aunque vamos a intentar resumir las más interesantes. </p>



<h2 class="wp-block-heading">Forzar al protocolo HTTPS</h2>



<p class="wp-block-paragraph">Con estas constantes podemos forzar tanto el login como el panel de administración de WordPress (/wp-admin) a usarlo exclusivamente bajo el protocolo HTTPS, por lo que es necesario que el servidor cuente con un certificado de seguridad SSL. </p>



<pre class="wp-block-code"><code>define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);</code></pre>



<p class="wp-block-paragraph"><strong>NOTA</strong>: No lo actives si estás trabajando en modo local o en un servidor provisional sin certificado SSL.</p>



<h2 class="wp-block-heading">Conexión con la base de datos</h2>



<pre class="wp-block-code"><code>// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );
/** MySQL database username */
define( 'DB_USER', 'username_here' );
/** MySQL database password */
define( 'DB_PASSWORD', 'password_here' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );</code></pre>



<p class="wp-block-paragraph">Cuando instalamos WordPress, lo primero que el instalador nos pregunta son los datos de la base de datos con la que vamos a trabajar. Pero si necesitamos modificar estos datos a posteriori, podemos localizarlos en el archivo <strong>wp-config.php</strong> en el apartado <em>MySQL settings</em>.</p>



<p class="wp-block-paragraph"><strong>define( &#8216;DB_NAME&#8217;, &#8216;database_name&#8217; );</strong> Nombre de la base de datos en nuestro servidor.<br><strong>define( &#8216;DB_USER&#8217;, &#8216;username&#8217; );</strong> Nombre de usuario de la base de datos.<br><strong>define( &#8216;DB_PASSWORD&#8217;, &#8216;password&#8217; );</strong> Contraseña de la base de datos.<br><strong>define( &#8216;DB_HOST&#8217;, &#8216;localhost&#8217; );</strong> Dirección del servidor de la base de datos. En muchos hosts suele ser «localhost», aunque en otros hostings como IONOS o Arsys, puede ser una dirección concreta.</p>



<h3 class="wp-block-heading">Otras opciones en la base de datos</h3>



<pre class="wp-block-code"><code>define ('DB_HOST', 'localhost: 3306' );</code></pre>



<p class="wp-block-paragraph">Especifica el puerto utilizado por el gestor de bases de datos. Por defecto se establece en 3306, pero si necesitas modificarlo, defínelo en esta constate.</p>



<pre class="wp-block-code"><code>$table_prefix = 'mistablas_'; // Only numbers, letters, and underscores please!</code></pre>



<p class="wp-block-paragraph">Establece el prefijo de las tablas de la base de datos de WordPress. Por defecto se utiliza wp_, pero para reforzar la seguridad, te aconsejo que lo cambies durante la instalación de tu WordPress. </p>



<p class="wp-block-paragraph">No lo modifiques una vez instalado, o tendrás errores en WordPress al no conectar correctamente con las tablas. Cámbialo solo en los casos en que migres de base de datos y el prefijo de la nueva base de datos sea distinto.</p>



<pre class="wp-block-code"><code>define( 'DB_CHARSET', 'utf8' );</code></pre>



<p class="wp-block-paragraph">Establece el conjunto de caracteres de la base de datos. Por defecto, WordPress utilizará UTF-8.</p>



<pre class="wp-block-code"><code>define( 'DB_COLLATE', '' );</code></pre>



<p class="wp-block-paragraph">Establece el orden de clasificación del juego de caracteres. Por defecto se establece en blanco para que MySQL asigne automáticamente la colación en función del conjunto de caracteres definido con DB_CHARSET.</p>



<p class="wp-block-paragraph">La colación general para UTF-8 suele ser &#8216;utf8_general_ci&#8217;:</p>



<pre class="wp-block-code"><code>define( 'DB_COLLATE', 'utf8_general_ci' );</code></pre>



<p class="wp-block-paragraph">Si necesitas definir una colación distinta para un país concreto, por ejemplo Turquía, establece:</p>



<pre class="wp-block-code"><code>define( 'DB_COLLATE', 'utf8_turkish_ci' );</code></pre>



<h2 class="wp-block-heading">Claves de seguridad</h2>



<pre class="wp-block-code"><code>define( 'AUTH_KEY', 't`DK%X:&gt;xy|eZ(BXb/f(Ur`8#~UzUQG-^_Cs_GHs5U-&amp;Wb?pgn^p8(2@}IcnCa|' );
define( 'SECURE_AUTH_KEY', 'D&amp;ovlU#|CvJ##uNq}bel+^MFtT&amp;.b9{UvR]g%ixsXhGlRJ7q!h}XWdEC&#91;BOKXssj' );
define( 'LOGGED_IN_KEY', 'MGKi8Br(&amp;{H*~&amp;0s;{k0&lt;S(O:+f#WM+q|npJ-+P;RDKT:~jrmgj#/-,&#91;hOBk!ry^' ) ;
define( 'NONCE_KEY', 'FIsAsXJKL5ZlQo)iD-pt??eUbdc{_Cn&lt;4!d~yqz))&amp;B D?AwK%)+)F2aNwI|siOe' );
define( 'AUTH_SALT', '7T-!^i!0,w)L#JK@pc2{8XE&#91;DenYI^BVf{L:jvF,hf}zBf883td6D;Vcy8,S)-&amp;G' );
define( 'SECURE_AUTH_SALT', 'I6`V|mDZq21-J|ihb u^q0F }F_NUcy`l,=obGtq*p#Ybe4a31R,r=|n#=]@]c #' );
define( 'LOGGED_IN_SALT', 'w&lt;$4c$Hmd%/*]`Oom&gt;(hdXW|0M=X={we6;Mpvtg+Vo&lt;$|#_}qG(GaVDEsn,~*4i' );
define( 'NONCE_SALT', 'a|#h{c5|P &amp;xWs4IZ20c2&amp;%4!c(/uG}W:mAvy&lt;I44`jAbup]t=]V&lt;`}.py(wTP%%' );</code></pre>



<p class="wp-block-paragraph">Se definen automáticamente durante la instalación. No es necesario que las copies ni mucho menos que las memorices, pero puedes cambiarlas si lo deseas. Solo asegúrate que sean largas y complicadas. </p>



<p class="wp-block-paragraph">Normalmente son usadas para las cookies de sesión, de forma que si las modificas, los usuarios con sesión en tu web tendrán que volver a loguearse.</p>



<h2 class="wp-block-heading">Establecer la URL del sitio</h2>



<pre class="wp-block-code"><code>define( 'WP_SITEURL', 'https://misitioweb.com' );</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1015" height="169" src="https://danisanchez.net/wp-content/uploads/2022/03/imagen.png" alt="" class="wp-image-12208" srcset="https://danisanchez.net/wp-content/uploads/2022/03/imagen.png 1015w, https://danisanchez.net/wp-content/uploads/2022/03/imagen-300x50.png 300w, https://danisanchez.net/wp-content/uploads/2022/03/imagen-768x128.png 768w" sizes="auto, (max-width: 1015px) 100vw, 1015px" /></figure>



<p class="wp-block-paragraph">Establece la URL WordPress. (No finalizes la URL con barra invertida «/», por ejemplo misitio.com/).</p>



<p class="wp-block-paragraph">Por defecto, la URL del sitio se guarda en la tabla de opciones de la base de datos, pero si defines esta constante reducirás la cantidad de llamadas a la base de datos al cargar la web.</p>



<h2 class="wp-block-heading">Establecer la URL del blog</h2>



<pre class="wp-block-code"><code>define( 'WP_HOME', 'https://misitioweb.com/misitio' );</code></pre>



<p class="wp-block-paragraph">Define la dirección de WordPress en caso de que no se encuentre en el directorio principal de tu dominio. En la mayoría de casos será la misma dirección que la URL del sitio.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="158" src="https://danisanchez.net/wp-content/uploads/2022/03/imagen-1.png" alt="" class="wp-image-12209" srcset="https://danisanchez.net/wp-content/uploads/2022/03/imagen-1.png 1024w, https://danisanchez.net/wp-content/uploads/2022/03/imagen-1-300x46.png 300w, https://danisanchez.net/wp-content/uploads/2022/03/imagen-1-768x119.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Mover los directorios por defecto</h2>



<p class="wp-block-paragraph">Otra opción que podemos definir en wp-config.php es la ubicación de los directorios como, WP-CONTENT, PLUGINS, THEMES, UPLOADS&#8230;</p>



<h3 class="wp-block-heading">Moviendo el directorio WP-CONTENT</h3>



<p class="wp-block-paragraph">Definiendo el PATH LOCAL:</p>



<pre class="wp-block-code"><code>define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/blog/wp-content' );</code></pre>



<p class="wp-block-paragraph">Definiendo la URL:</p>



<pre class="wp-block-code"><code>define( 'WP_CONTENT_URL', 'http://example/blog/wp-content' );</code></pre>



<h3 class="wp-block-heading">Moviendo el directorio PLUGINS</h3>



<p class="wp-block-paragraph">Definiendo el PATH LOCAL:</p>



<pre class="wp-block-code"><code>define( 'WP_PLUGIN_DIR', dirname(__FILE__) . '/blog/wp-content/plugins' );</code></pre>



<p class="wp-block-paragraph">Definiendo la URL:</p>



<pre class="wp-block-code"><code>define( 'WP_PLUGIN_URL', 'http://example/blog/wp-content/plugins' );</code></pre>



<h3 class="wp-block-heading">Moviendo el directorio THEMES</h3>



<pre class="wp-block-code"><code>$theme_root = WP_CONTENT_DIR . '/themes'; </code></pre>



<h3 class="wp-block-heading">Moviendo el directorio UPLOADS</h3>



<pre class="wp-block-code"><code>define( 'UPLOADS', 'blog/wp-content/uploads' );</code></pre>



<h2 class="wp-block-heading">Caché de objetos y compresión</h2>



<pre class="wp-block-code"><code>define( 'WP_CACHE', true );
define( 'WP_CACHE_KEY_SALT', 'bli6w8w9zrqufbfz79:' );
define( 'COMPRESS_CSS', true );
define( 'COMPRESS_SCRIPTS', true );
define( 'ENFORCE_GZIP', true );</code></pre>



<p class="wp-block-paragraph"><strong>WP_CACHE</strong> habilita la caché de objetos. Normalmente la utilizan  los plugins de gestión de caché.<br><strong>WP_CACHE_KEY_SALT</strong>, define la clave de caché. Puedes poner una aleatoria.<br><strong>COMPRESS_CSS Y COMPRESS_SCRIPT</strong>, comprimen los objetos de estilos y javascript.<br><strong>ENFORCE_GZIP,</strong> fuerza la entrega de la caché comprimida. Esta función tiene que estar habilitada en el servidor.</p>



<h2 class="wp-block-heading">Limitar las revisiones de posts</h2>



<pre class="wp-block-code"><code>define( 'WP_POST_REVISIONS', 5 );</code></pre>



<p class="wp-block-paragraph">Si editas mucho tu contenido, debes saber que cada vez que actualizas una entrada, página, producto&#8230; se guarda una revisión de esta, para que puedas volver a ella en cualquier momento. Esto hace que nuestra base de datos pueda crecer enormemente. Personalmente me he encontrado con páginas que tenían más de 500 revisiones guardadas.</p>



<p class="wp-block-paragraph">Creo que limitar a 5 es más que suficiente, incluso se puede desactivar por completo, indicando el parámetro false:</p>



<pre class="wp-block-code"><code>define( 'WP_POST_REVISIONS', false );</code></pre>



<h2 class="wp-block-heading">Guardado automático</h2>



<pre class="wp-block-code"><code>define( 'AUTOSAVE_INTERVAL', 30 );</code></pre>



<p class="wp-block-paragraph">Por defecto, WordPress realiza autoguardados de tus publicaciones cada 60 segundos. Puedes cambiar este valor con esta definición.</p>



<h2 class="wp-block-heading">Permanencia en la papelera</h2>



<pre class="wp-block-code"><code>define( 'EMPTY_TRASH_DAYS', 7 );</code></pre>



<p class="wp-block-paragraph">Cuando enviamos contenido a la papelera, esta permanece ahí durante 30 días por defecto. Podemos cambiar este valor por otro número de días.</p>



<h2 class="wp-block-heading">Habilitar WordPress Multisitio</h2>



<pre class="wp-block-code"><code>define( 'WP_ALLOW_MULTISITE', true );</code></pre>



<p class="wp-block-paragraph">Si deseas habilitar varias instalaciones de WordPress en un mismo sitio (WordPress multisitio), establece en TRUE esta consante.</p>



<h2 class="wp-block-heading">Redirección Blogs inexistentes</h2>



<pre class="wp-block-code"><code>define( 'NOBLOGREDIRECT', 'https://misitio.com' );</code></pre>



<p class="wp-block-paragraph">Redirige a tu sitio principal en caso de que alguiente intente acceder a un subdominio o subdirectorio inexistente.</p>



<h2 class="wp-block-heading">WP_DISABLE_FATAL_ERROR_HANDLER</h2>



<p class="wp-block-paragraph">Antes de la versión 5.2 de WordPress, si un theme o complemento causaba un error fatal, el usuario solo veía una pantalla en blanco. A partir de WordPress 5.2, se muestra un mensaje error del estilo:</p>



<p class="wp-block-paragraph"><em> «El sitio está experimentando dificultades técnicas. Consulte la bandeja de entrada de correo electrónico del administrador de su sitio para obtener instrucciones».</em></p>



<p class="wp-block-paragraph">Pero en un entorno de desarrollo, seguramente necesitamos visualizar esos errores de PHP y para ello debemos ocultar este mensaje por defecto, además de habilitar el WP_DEBUG y WP_DEBUG_DISPLAY</p>



<pre class="wp-block-code"><code>define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true );   // 5.2 and later 
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true ); </code></pre>



<p class="wp-block-paragraph">WP_DEBUG informa de errores y advertencias en temas y plugins, además de errores en la base de datos.</p>



<h2 class="wp-block-heading">Aumentar la memoria asignada a PHP</h2>



<p class="wp-block-paragraph">Por defecto, la memoria PHP asignada en WordPress es de solo 40MB. Es conveniente aumentar esta cantidad sobre todo si utilizamos un número considerable de plugins o editamos la web con builders como Elementor, Divi, Fusion, etc.</p>



<p class="wp-block-paragraph">Existen dos límites de memoria, el que tiene que ver con el frontend o web visible y el que tiene que ver con el panel de administración de WordPress.</p>



<p class="wp-block-paragraph"><strong>Aumentar el límite de memoria en el frontend</strong>:</p>



<pre class="wp-block-code"><code>define( 'WP_MEMORY_LIMIT', '128M' );</code></pre>



<p class="wp-block-paragraph"><strong>Aumentar el límite de memoria en el panel administrador:</strong></p>



<pre class="wp-block-code"><code>define( 'WP_MAX_MEMORY_LIMIT', '256M' );</code></pre>



<h2 class="wp-block-heading">Evitar que WordPress pida los datos FTP al instalar o actualizar complementos</h2>



<p class="wp-block-paragraph">Esta configuración suele estar habilitada por defecto en la mayoría de hostings, pero si WordPress te pide los datos de autenticación FTP cada vez que intentas actualizar o instalar un complemento define la siguiente constante:</p>



<pre class="wp-block-code"><code>define( 'FS_METHOD', 'direct' );</code></pre>



<h2 class="wp-block-heading">Habilitar un cron alternativo</h2>



<p class="wp-block-paragraph">Si por cualquier razón el cron por defecto de WordPress no realiza correctamente las tareas asignadas y quieres establecer un Cron alternativo, debes especificarlo con la siguiente constante:</p>



<pre class="wp-block-code"><code>define( 'ALTERNATE_WP_CRON', true );</code></pre>



<h2 class="wp-block-heading">Deshabilitar cron</h2>



<p class="wp-block-paragraph">También es posible que quieras deshabilitar el cron si no vas a hacer uso de él (programar publicaciones, programar backups, etc.):</p>



<pre class="wp-block-code"><code>define( 'DISABLE_WP_CRON', true );</code></pre>



<h2 class="wp-block-heading">Limitar los intervalos de cron</h2>



<p class="wp-block-paragraph">Establece el tiempo (en segundos) que deben transcurrir entre la ejecución de un cron y otro.</p>



<pre class="wp-block-code"><code>define( 'WP_CRON_LOCK_TIMEOUT', 60 );</code></pre>



<h2 class="wp-block-heading">Reparar automáticamente la base de datos</h2>



<p class="wp-block-paragraph">Si tienes problemas con tu base de datos y no puedes iniciar sesión, puedes definir esta constante para forzar una reparación automática.</p>



<pre class="wp-block-code"><code>define( 'WP_ALLOW_REPAIR', true );</code></pre>



<p class="wp-block-paragraph">Después accede a ruta: https://misitio.com<strong>/wp-admin/maint/repair.php</strong></p>



<p class="wp-block-paragraph">No es necesario iniciar sesión para ejecutar el proceso. Una vez resuelto el problema, borra esta consante o cámbiala a false.</p>



<h2 class="wp-block-heading">Desactivar el editor interno de themes y plugins</h2>



<p class="wp-block-paragraph">Una medida sencilla de mejorar la seguridad en nuestro WordPress es desactivando el editor interno de plugins y temas. De esta forma, si alguien se hace con nuestro usuario administrador, no podrá editar plantillas y plugin insertando código malicioso. (Para ello tendrá que tener también acceso al FTP y modificar los archivos insitu).</p>



<pre class="wp-block-code"><code>define( 'DISALLOW_FILE_EDIT', true );</code></pre>



<h2 class="wp-block-heading">Desactivar las actualizaciones automáticas de WordPress</h2>



<p class="wp-block-paragraph">Es conveniente no actualizar a la ligera un WordPress, sobre todo si es una versión media o mayor. Debemos asegurar antes de que tanto el theme como los complementos (plugins) tienen 100% compatibilidad con la nueva versión.</p>



<p class="wp-block-paragraph">Para impedir que WordPress se actualice automáticamente usa la constante:</p>



<pre class="wp-block-code"><code>define( 'WP_AUTO_UPDATE_CORE', false );</code></pre>



<p class="wp-block-paragraph">Pero sí es buena idea actualizar únicamente las versiones de seguridad y mantenimiento, para ello usamos la constante:</p>



<pre class="wp-block-code"><code>define( 'AUTOMATIC_UPDATER_DISABLED', false );
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
define( 'CORE_UPGRADE_SKIP_NEW_BUNDLED', true );</code></pre>



<p class="wp-block-paragraph">La última constante &#8216;CORE_UPGRADE_SKIP_NEW_BUNDLED&#8217;, evitará que las actualizaciones de WordPress editen el directorio wp-content, evitando que se instalen los nuevos temas por defecto que incroporen las nuevas versiones.</p>



<h2 class="wp-block-heading">Desactiva toda actualización automática y manual</h2>



<p class="wp-block-paragraph">Si quieres llevar un control o mantenimiento exhaustivo de un proyecto, puedes impedir que se instalen o actualicen complementos con la constante:</p>



<pre class="wp-block-code"><code>define( 'DISALLOW_FILE_MODS', true );</code></pre>



<p class="wp-block-paragraph">Ni siquiera un usuario administrador podrá instalar o actualizar nada.</p>



<h2 class="wp-block-heading">Concluyendo&#8230;</h2>



<p class="wp-block-paragraph">Existen más constantes que puedes definir para configurar otros aspectos más avanzados de tu WordPress, puedes consultarlos en la documentación oficial: https://wordpress.org/support/article/editing-wp-config-php, aunque los comentados en este post suelen ser los más interesantes a tener en cuenta.</p>



<p class="wp-block-paragraph">Espero que te haya servido de utilidad y nos vemos en el siguiente post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/optimizar-el-archivo-de-configuracion-de-wordpress-wp-config-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Instalar LAMP (Linux, Apache, MySQL y PHP) en Fedora</title>
		<link>https://danisanchez.net/instalar-lamp-linux-apache-mysql-y-php-en-fedora/</link>
					<comments>https://danisanchez.net/instalar-lamp-linux-apache-mysql-y-php-en-fedora/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 28 Oct 2021 15:22:54 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=11928</guid>

					<description><![CDATA[Probado hasta Fedora 39!! Actualmente estoy probando Fedora como distro principal y tenía la necesidad de configurar mi entorno LAMP tal y como lo tenía en Ubuntu. En Fedora la paquetería difiere un poco, así como algunas configuraciones. En este artículo vamos a ver cómo: Instalar el servidor web Apache Nos dirigimos a un terminal [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="has-white-color has-text-color has-background wp-block-paragraph" style="background-color:#17a2b8"><strong>Probado hasta Fedora 39!!</strong></p>



<p class="wp-block-paragraph">Actualmente estoy probando Fedora como distro principal y tenía la necesidad de configurar mi entorno LAMP tal y como lo tenía en Ubuntu.</p>



<p class="wp-block-paragraph">En Fedora la paquetería difiere un poco, así como algunas configuraciones.</p>



<p class="wp-block-paragraph">En este artículo vamos a ver cómo:</p>



<ul class="wp-block-list">
<li>Instalar el <strong>servidor web</strong> (<strong>Apache</strong>).</li>



<li>Instalar el <strong>gestor de bases de datos MariaDB</strong>.</li>



<li>Instalar <strong>PHP</strong>.</li>



<li>Configurar <strong>php.ini</strong> con los valores óptimos para WordPress.</li>



<li>Instalar <strong>phpMyAdmin</strong> para gestionar las bases de datos visualmente.</li>



<li>Activar el módulo <strong>MOD REWRITE</strong> para que funcionen las URLs «amigables» en WordPress.</li>
</ul>



<h2 class="wp-block-heading">Instalar el servidor web Apache</h2>



<p class="wp-block-paragraph">Nos dirigimos a un terminal y escribimos:</p>



<pre class="wp-block-code"><code>sudo dnf -y install httpd</code></pre>



<p class="wp-block-paragraph">Los comandos básicos para gestionar el servidor son:</p>



<p class="wp-block-paragraph">Iniciar:</p>



<pre class="wp-block-code"><code>sudo systemctl start httpd</code></pre>



<p class="wp-block-paragraph">Parar:</p>



<pre class="wp-block-code"><code>sudo systemctl stop httpd</code></pre>



<p class="wp-block-paragraph">Habilitar:</p>



<pre class="wp-block-code"><code>sudo systemctl enable httpd</code></pre>



<p class="wp-block-paragraph">Reiniciar:</p>



<pre class="wp-block-code"><code>sudo systemctl restart httpd</code></pre>



<p class="wp-block-paragraph">Recargar:</p>



<pre class="wp-block-code"><code>sudo systemctl reload httpd</code></pre>



<p class="wp-block-paragraph">Una vez instalado, ejecutamos los comandos de <strong>habilitar</strong> e <strong>iniciar:</strong></p>



<pre class="wp-block-code"><code>sudo systemctl enable httpd
sudo systemctl start httpd</code></pre>



<p class="wp-block-paragraph">Nos dirigimos a un navegador web y entramos en http://localhost</p>



<p class="wp-block-paragraph">Deberíamos ver una pantalla como esta:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="546" src="https://danisanchez.net/wp-content/uploads/2021/10/01-lamp-fedora.jpg" alt="" class="wp-image-11929" srcset="https://danisanchez.net/wp-content/uploads/2021/10/01-lamp-fedora.jpg 1000w, https://danisanchez.net/wp-content/uploads/2021/10/01-lamp-fedora-300x164.jpg 300w, https://danisanchez.net/wp-content/uploads/2021/10/01-lamp-fedora-768x419.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p class="wp-block-paragraph">En mi caso, una vez que se habilita e inicia el servidor por primera vez, ya no es necesario hacerlo en cada sesión.</p>



<h2 class="wp-block-heading">Instalar MySQL (MariaDB)</h2>



<p class="wp-block-paragraph">De vuelta al terminal ejecutamos:</p>



<pre class="wp-block-code"><code>sudo dnf install mariadb-server</code></pre>



<p class="wp-block-paragraph">Los comandos para gestionar el servicio son muy similares a Apache.</p>



<p class="wp-block-paragraph">Habilitar:</p>



<pre class="wp-block-code"><code>sudo systemctl enable mariadb</code></pre>



<p class="wp-block-paragraph">Iniciar:</p>



<pre class="wp-block-code"><code>sudo systemctl start mariadb</code></pre>



<p class="wp-block-paragraph">Parar:</p>



<pre class="wp-block-code"><code>sudo systemctl stop mariadb</code></pre>



<p class="wp-block-paragraph">Reiniciar:</p>



<pre class="wp-block-code"><code>sudo systemctl restart mariadb</code></pre>



<p class="wp-block-paragraph">Al igual que con Apache, en mi caso no es necesario habilitar e iniciar el servicio en cada sesión.</p>



<h3 class="wp-block-heading">Securizar MySQL</h3>



<p class="wp-block-paragraph">Por defecto, el gestor de bases de datos viene con el usuario root sin contraseña. Vamos a asignar una contraseña ejecutando:</p>



<pre class="wp-block-code"><code>sudo mysql_secure_installation</code></pre>



<p class="wp-block-paragraph">Nos preguntará si queremos asignar una contraseña al usuario root, contestamos que si:</p>



<pre class="wp-block-code"><code>Set root password? &#91;Y/n] y
New password: *******
Re-enter new password: ****** 
Password updated successfully!</code></pre>



<p class="wp-block-paragraph">Nos hará una serie de preguntas sobre si queremos eliminar usuarios anónimos, borrar las tablas de test, etc. Podemos contestar afimartívamente a todo:</p>



<pre class="wp-block-code"><code>Remove anonymous users? &#91;Y/n] y
 ... Success!
 
 Disallow root login remotely? &#91;Y/n] y
 ... Success!
 
 Remove test database and access to it? &#91;Y/n] y
 - Dropping test database...
 ... Success!
 
 - Removing privileges on test database...
 ... Success!
 
 Reload privilege tables now? &#91;Y/n] y
 ... Success!</code></pre>



<p class="wp-block-paragraph">Ahora entraremos en mysql:</p>



<pre class="wp-block-code"><code>sudo mysql -u root</code></pre>



<p class="wp-block-paragraph">Vamos a crear un usuario distinto de root que será el que asignemos a las bases de datos que creemos después:</p>



<pre class="wp-block-code"><code>CREATE USER mi_usuario IDENTIFIED BY 'password';</code></pre>



<p class="wp-block-paragraph">Creamos una nueva base de datos:</p>



<pre class="wp-block-code"><code>CREATE DATABASE mibase;</code></pre>



<p class="wp-block-paragraph">Y asignamos nuestro usuario anterior a la nueva base de datos con todos los privilegios:</p>



<pre class="wp-block-code"><code>GRANT ALL PRIVILEGES ON mibase.* TO mi_usuario;</code></pre>



<p class="wp-block-paragraph">Para nuevas bases de datos el proceso sería el mismo: Crear la base de datos y asignar nuestro usuario con todos los privilegios.</p>



<p class="wp-block-paragraph">Tras la asignación de nuestro usuario a la nueva base de datos no está de más hacer una limpieza de la caché almacenada con:</p>



<pre class="wp-block-code"><code>FLUSH PRIVILEGES;</code></pre>



<h2 class="wp-block-heading">Instalar PHP</h2>



<p class="wp-block-paragraph">Vamos a instalar los siguientes paquetes para PHP:</p>



<pre class="wp-block-code"><code>sudo dnf -y install php php-cli php-php-gettext php-mbstring php-mcrypt php-mysqlnd php-pear php-curl php-gd php-xml php-bcmath php-zip</code></pre>



<p class="wp-block-paragraph">Tras la instalación vamos a comprobar la versión de PHP con el comando:</p>



<pre class="wp-block-code"><code>php -v</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="738" height="214" src="https://danisanchez.net/wp-content/uploads/2021/10/02-lamp-fedora-php-versioin.jpg" alt="" class="wp-image-11936" srcset="https://danisanchez.net/wp-content/uploads/2021/10/02-lamp-fedora-php-versioin.jpg 738w, https://danisanchez.net/wp-content/uploads/2021/10/02-lamp-fedora-php-versioin-300x87.jpg 300w" sizes="auto, (max-width: 738px) 100vw, 738px" /></figure>



<p class="wp-block-paragraph">En el momento de hacer este artículo, la versión que se instala con Fedora 34 es la 7.4.24.</p>



<p class="wp-block-paragraph">Crearemos un archivo test.php para comprobar que PHP se ejecuta correctamente bajo Apache.</p>



<p class="wp-block-paragraph">A mí me gusta usar <em>nano</em> para configurar archivos sencillos mediante la terminal, nos dirigimos a:</p>



<pre class="wp-block-code"><code>sudo nano /var/www/html/test.php</code></pre>



<p class="wp-block-paragraph">Y dentro pegamos la siguiente línea:</p>



<pre class="wp-block-code"><code>&lt;?php phpinfo(); ?&gt;</code></pre>



<p class="wp-block-paragraph">Guardamos los cambios con <em>Ctrl+O</em> y salimos con <em>Ctrl+X</em>.</p>



<p class="wp-block-paragraph">Volvemos al navegador web a la dirección http://localhost/test.php</p>



<p class="wp-block-paragraph">Debería ejecutarse el script de información de PHP:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://danisanchez.net/wp-content/uploads/2021/10/03-lamp-fedora-php-test-1024x559.jpg" alt="" class="wp-image-11937" srcset="https://danisanchez.net/wp-content/uploads/2021/10/03-lamp-fedora-php-test-1024x559.jpg 1024w, https://danisanchez.net/wp-content/uploads/2021/10/03-lamp-fedora-php-test-300x164.jpg 300w, https://danisanchez.net/wp-content/uploads/2021/10/03-lamp-fedora-php-test-768x419.jpg 768w, https://danisanchez.net/wp-content/uploads/2021/10/03-lamp-fedora-php-test-1536x838.jpg 1536w, https://danisanchez.net/wp-content/uploads/2021/10/03-lamp-fedora-php-test.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Vamos a cambiar algunos parámetros de PHP editando su archivo de configuración (php.ini) para optimizarlo para WordPress.</p>



<p class="wp-block-paragraph">La ubicación está en /etc/php.ini, por lo que de nuevo con <em>nano</em>, nos dirigimos a:</p>



<pre class="wp-block-code"><code>sudo nano /etc/php.ini</code></pre>



<p class="wp-block-paragraph">Y editamos los siguiente parámetros:</p>



<pre class="wp-block-code"><code>memory_limit = 128M
post_max_size = 64M
max_execution_time = 180
upload_max_filesize = 64M
max_input_time = 180
max_input_vars = 3000</code></pre>



<p class="wp-block-paragraph">Tras la edición debemos reiniciar Apache para que los cambios surjan efecto. <strong>En mi caso tuve que reiniciar el PC por completo para que se aplicaran</strong>. </p>



<h2 class="wp-block-heading">Instalar phpMyAdmin</h2>



<p class="wp-block-paragraph">Volvemos al terminal y ejecutamos:</p>



<pre class="wp-block-code"><code>sudo dnf install phpmyadmin</code></pre>



<p class="wp-block-paragraph">Tras la instalación veremos que si accedemos a http://localhost/phpmyadmin nos saldrá un mensaje de error indicando que la ubicación no existe. </p>



<p class="wp-block-paragraph">Tenemos que editar el archivo de configuración de phpMyAdmin de nuevo con <em>nano</em>:</p>



<pre class="wp-block-code"><code>sudo nano /etc/httpd/conf.d/phpMyAdmin.conf</code></pre>



<p class="wp-block-paragraph">Hacia la parte final del archivo, añadimos las siguientes líneas:</p>



<pre class="wp-block-code"><code>&lt;Directory /usr/share/phpMyAdmin&gt;
    AddDefaultCharset UTF-8
    Require all granted
&lt;/Directory&gt;</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="810" height="592" src="https://danisanchez.net/wp-content/uploads/2021/10/04-lamp-fedora-configurar-phpmyadmin.jpg" alt="" class="wp-image-11938" srcset="https://danisanchez.net/wp-content/uploads/2021/10/04-lamp-fedora-configurar-phpmyadmin.jpg 810w, https://danisanchez.net/wp-content/uploads/2021/10/04-lamp-fedora-configurar-phpmyadmin-300x219.jpg 300w, https://danisanchez.net/wp-content/uploads/2021/10/04-lamp-fedora-configurar-phpmyadmin-768x561.jpg 768w" sizes="auto, (max-width: 810px) 100vw, 810px" /></figure>
</div>


<p class="wp-block-paragraph">Guardamos con <em>Ctrl+O</em> y salimos con <em>Ctrl+X</em>.</p>



<p class="wp-block-paragraph">Reiniciamos el servidor con:</p>



<pre class="wp-block-code"><code>sudo systemctl restart httpd</code></pre>



<p class="wp-block-paragraph">O reiniciamos el equipo si no surje efecto. Ahora podemos acceder a http://localhost/phpmyadmin</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-iniciar-phpmyadmin-1024x559.jpg" alt="" class="wp-image-11940" srcset="https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-iniciar-phpmyadmin-1024x559.jpg 1024w, https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-iniciar-phpmyadmin-300x164.jpg 300w, https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-iniciar-phpmyadmin-768x419.jpg 768w, https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-iniciar-phpmyadmin-1536x838.jpg 1536w, https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-iniciar-phpmyadmin.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Por último vamos a activar el módulo de Apache <strong>MOD REWRITE</strong> para habilitar las URLs amigables de WordPress que configuramos en los ajustes de <em>Enlaces Permanentes</em>.</p>



<p class="wp-block-paragraph">Para ello nos dirigimos con nano a:</p>



<pre class="wp-block-code"><code>sudo nano /etc/httpd/conf/httpd.conf</code></pre>



<p class="wp-block-paragraph">Localizamos la línea:</p>



<pre class="wp-block-code"><code>&lt;Directory "/var/www/html"&gt;</code></pre>



<p class="wp-block-paragraph">Y sustituimos AllowOverride None por <strong>AllowOverride All</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="811" height="648" src="https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-configurar-modrewrite.jpg" alt="" class="wp-image-11941" srcset="https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-configurar-modrewrite.jpg 811w, https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-configurar-modrewrite-300x240.jpg 300w, https://danisanchez.net/wp-content/uploads/2021/10/05-lamp-fedora-configurar-modrewrite-768x614.jpg 768w" sizes="auto, (max-width: 811px) 100vw, 811px" /></figure>



<p class="wp-block-paragraph">De nuevo, reinicia Apache o directamente el PC.</p>



<h2 class="wp-block-heading">Nota final</h2>



<p class="wp-block-paragraph">Si al descargar algún tema/plugin o actualización tienes un error de:</p>



<pre class="wp-block-code"><code>Descarga fallida: cURL error 7</code></pre>



<p class="wp-block-paragraph">Necesitamos configurar SElinux en modo permisivo. Para ello editamos el siguiente archivo:</p>



<pre class="wp-block-code"><code>sudo nano /etc/selinux/config</code></pre>



<p class="wp-block-paragraph">Y cambiamos el parámetro SELINUX=permissive</p>



<pre class="wp-block-code"><code># This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
<strong>SELINUX=permissive</strong>
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted</code></pre>



<p class="wp-block-paragraph"> Reiniciamos el equipo y eso es todo <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/instalar-lamp-linux-apache-mysql-y-php-en-fedora/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Añade doble factor de autenticación en conexiones SSH (Ubuntu y derivados)</title>
		<link>https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/</link>
					<comments>https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 11 Oct 2021 09:50:26 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[google authenticator]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=11906</guid>

					<description><![CDATA[Probado hasta Ubuntu 24.04 LTS Suelo activar el doble factor de autenticación en todas mis cuentas, ya sean redes sociales, servicios, login de wordpress, etc. Lo tengo activado tanto en la cuenta de cliente de mi proveedor de hosting, como en el acceso al Plesk de mi VPS. Sin embargo, me quedaba una puerta por [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="has-white-color has-text-color has-background wp-block-paragraph" style="background-color:#6d9bda"><strong>Probado hasta Ubuntu 24.04 LTS</strong></p>



<p class="wp-block-paragraph">Suelo activar el doble factor de autenticación en todas mis cuentas, ya sean redes sociales, servicios, login de wordpress, etc.</p>



<p class="wp-block-paragraph">Lo tengo activado tanto en la cuenta de cliente de mi proveedor de hosting, como en el acceso al Plesk de mi VPS.</p>



<p class="wp-block-paragraph">Sin embargo, me quedaba una puerta por securizar, <strong>las conexiones SSH</strong>. </p>



<p class="wp-block-paragraph">Para mí es muy cómodo acceder vía SSH a mi servidor, ya sea para actualizar paquetes, reiniciar el servidor si hay algún problema y acceder a configuraciones concretas.</p>



<p class="wp-block-paragraph">Mi servidor está basado en Ubuntu 22.04 LTS, y existe un paquete para poder configurar el doble factor de autenticación de Google Authenticator en las conexiones SSH. Así que vamos a ello.</p>



<h2 class="wp-block-heading">Instalar y configurar los paquetes requeridos.</h2>



<p class="wp-block-paragraph">El paquete en se llama: <strong>libpam-google-authenticator</strong>.</p>



<pre class="wp-block-code"><code>sudo apt install libpam-google-authenticator</code></pre>



<p class="wp-block-paragraph">Una vez instalado, lo primero que haremos es reiniciar el servicio <strong>sshd</strong>:</p>



<pre class="wp-block-code"><code>sudo systemctl restart sshd.service</code></pre>



<p class="wp-block-paragraph">Ahora editamos con nano el archivo <strong>/etc/pam.d/sshd</strong></p>



<pre class="wp-block-code"><code>sudo nano /etc/pam.d/sshd</code></pre>



<p class="wp-block-paragraph">Y añadimos al final del archivo: </p>



<pre class="wp-block-code"><code>auth required pam_google_authenticator.so</code></pre>



<p class="wp-block-paragraph">Guardamos con Ctrl+O y salimos de nano con Ctrl+X.</p>



<p class="wp-block-paragraph">El siguiente paso es editar el archivo de configuración <strong>/etc/ssh/sshd_config</strong></p>



<pre class="wp-block-code"><code>sudo nano /etc/ssh/sshd_config</code></pre>



<p class="wp-block-paragraph">Lo único que tenemos que hacer es cambiar el parámetro <strong>KbdInteractiveAuthentication</strong> de no a <strong>yes</strong>.</p>



<pre class="wp-block-code"><code># Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
KbdInteractiveAuthentication yes # CAMBIAR ESTO A YES</code></pre>



<p class="wp-block-paragraph">Guardamos con Ctrl+O y salimos de nano con Ctrl+X.</p>



<h2 class="wp-block-heading">Configurar la autenticación</h2>



<p class="wp-block-paragraph">Para ello lanzamos la configuración de google-authenticator:</p>



<pre class="wp-block-code"><code>sudo google-authenticator </code></pre>



<p class="wp-block-paragraph">Nos aparecerá un código QR gigante en la terminal, que es el que debemos escanear con nuestra aplicación de móvil, y además tendremos la lista de códigos de emergencia en caso de que perdamos nuestro dispositivo.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/10/imagen.png" alt="" class="wp-image-11908"/></figure>
</div>


<p class="wp-block-paragraph">Además, nos hará una serie de preguntas. Resumiento, la configuración recomendada sería:</p>



<ul class="wp-block-list">
<li>Make tokens “time-base”: <strong>yes</strong></li>



<li>Update the .google_authenticator file: <strong>yes</strong></li>



<li>Disallow multiple uses: <strong>yes</strong></li>



<li>Increase the original generation time limit: <strong>no</strong></li>



<li>Enable rate-limiting: <strong>yes</strong></li>
</ul>



<h3 class="wp-block-heading has-text-color has-background" style="color:#ffffff;background-color:#dc3545"><strong>Importante</strong></h3>



<p class="wp-block-paragraph">Una vez repondido a todo, <strong>asegúrate de volver a reiniciar el servicio sshd</strong></p>



<pre class="wp-block-code"><code>sudo systemctl restart sshd.service</code></pre>



<p class="wp-block-paragraph">De lo contrario, la próxima vez que intentes iniciar sesión vía SSH es posible que te de un error de login y tendrás que reiniciarlo desde Plesk, CPanel o pedirlo a tu proveedor de hosting.</p>



<p class="wp-block-paragraph">Tras configurar correctamente, la próxima vez que inicies sesión, además de tu contraseña, te pedirá el código de Google Authenticator.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Publicar en WordPress desde un formulario externo con Advanced Custom Fields</title>
		<link>https://danisanchez.net/publicar-en-wordpress-desde-un-formulario-externo-con-advanced-custom-fields/</link>
					<comments>https://danisanchez.net/publicar-en-wordpress-desde-un-formulario-externo-con-advanced-custom-fields/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Tue, 27 Jul 2021 15:39:11 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[advanced custom field]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=11318</guid>

					<description><![CDATA[En WordPress es posible publicar contenidos sin necesidad de entrar en el panel admin, por ejemplo, desde una página donde haya un formulario desde el que redactar el contenido. Para ellos nos vamos a valer del plugin «Advanced Custom Fields«, con el que no solo podremos guardar el contenido básico (título, contenido&#8230;), si no que [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En WordPress es posible publicar contenidos sin necesidad de entrar en el panel admin, por ejemplo, desde una página donde haya un formulario desde el que redactar el contenido.</p>



<p class="wp-block-paragraph">Para ellos nos vamos a valer del plugin «<strong>Advanced Custom Fields</strong>«, con el que no solo podremos guardar el contenido básico (título, contenido&#8230;), si no que podremos añadir otros campos personalizados que también serán guardados por el formulario.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Artículo disponible en vídeo</p></blockquote>



<iframe loading="lazy" width="100%" height="400" src="https://www.youtube-nocookie.com/embed/Jgca5yvJkao" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Con Advanced Custom Fields instalado vamos a <strong>crear un template o página</strong> que será la que muestre el formulario. </p>



<p class="wp-block-paragraph">Para ello recomiendo hacerlo sobre un <em>child-theme</em>, para no perder ningún cambio en caso de que el theme principal se actualice.</p>



<p class="wp-block-paragraph">Una vez creado el child-theme creamos un nuevo archivo<em> page-nuevo-post.php</em> con el siguiente código:</p>



<pre class="wp-block-code"><code>&lt;?php
    acf_form_head();
    get_header();
?&gt;

&lt;main id="site-content" role="main"&gt;
&lt;div id="content"&gt;

    &lt;?php
        acf_form(array(
            'post_id' =&gt; 'new_post',
            'post_title' =&gt; true,
            'post_content' =&gt; true,
        ));
    ?&gt;

&lt;/div&gt;
&lt;/main&gt;

&lt;?php get_footer(); ?&gt;</code></pre>



<p class="wp-block-paragraph">La primera functión <strong>acf_form_head()</strong>, llama a los scripts necesarios de Advanced Custom Fields que deben cargarse en la cabecera de la página. Esta función no admite ningún parámetro, solo es necesario declararla.</p>



<p class="wp-block-paragraph">La siguiente función <strong>acf_form()</strong>, si admite varios parámetros. Ahora mismo ha sido declarada de la forma más básica, con los parámetros mínimos, donde en post_id indicamos que será un new_post y vamos a guardar tanto el post_title como el post_content.</p>



<p class="wp-block-paragraph">Al entrar en la página Nuevo Post veremos algo así: (dependiendo de vuestro theme):</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-1024x709.png" alt="" class="wp-image-11320" width="1024" height="709" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-1024x709.png 1024w, https://danisanchez.net/wp-content/uploads/2021/07/image-300x208.png 300w, https://danisanchez.net/wp-content/uploads/2021/07/image-768x531.png 768w, https://danisanchez.net/wp-content/uploads/2021/07/image.png 1211w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Donde lo único que podemos hacer es indicar un título y redactar el contenido del post.</p>



<p class="wp-block-paragraph">Al pulsar «Actualizar», el post será <strong>guardado de forma predeterminada como borrador</strong>.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-1-1024x243.png" alt="" class="wp-image-11321" width="1024" height="243" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-1-1024x243.png 1024w, https://danisanchez.net/wp-content/uploads/2021/07/image-1-300x71.png 300w, https://danisanchez.net/wp-content/uploads/2021/07/image-1-768x182.png 768w, https://danisanchez.net/wp-content/uploads/2021/07/image-1.png 1043w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Configurar el tipo de post y su estado</h2>



<p class="wp-block-paragraph">Con el siguiente parámetro podemos indicar el <strong>tipo de post</strong> que estamos guardando y su <strong>estado</strong>:</p>



<pre class="wp-block-code"><code>'new_post' =&gt; array(
                'post_type' =&gt; 'post',
                'post_status' =&gt; 'publish'
            ),</code></pre>



<p class="wp-block-paragraph">La función completa quedaría: </p>



<pre class="wp-block-code"><code>&lt;?php
        acf_form(array(
            'post_id' =&gt; 'new_post',
            'post_title' =&gt; true,
            'post_content' =&gt; true,
            'new_post' =&gt; array(
                'post_type' =&gt; 'post',
                'post_status' =&gt; 'publish'
            ),
        ));
?&gt;</code></pre>



<p class="wp-block-paragraph">Donde en<strong> post_type</strong> podemos indicar el tipo de post o CPT (custom post type): post, page, product, project&#8230; Y en <strong>post status</strong>, el estado en que se guardará:</p>



<ul class="wp-block-list"><li><strong>publish</strong>: Publicado.</li><li><strong>pending</strong>: Pendiente de revisión.</li><li><strong>draft</strong>: Borrador.</li></ul>



<h2 class="wp-block-heading">Personalizar el texto del botón de guardado</h2>



<p class="wp-block-paragraph">Con otro parámetro podemos personalizar el botón de publicar, ya que «Actualizar» no es lo más apropiado si lo que estamos es guardando un nuevo post:</p>



<pre class="wp-block-code"><code>'submit_value' =&gt; 'Publicar'</code></pre>



<h2 class="wp-block-heading">Mensaje de confirmación de guardado</h2>



<p class="wp-block-paragraph"><meta http-equiv="content-type" content="text/html; charset=utf-8">Por defecto, al guardar el post se recargará la página con el formulario vacío, algo que puede despistar a nuestros usuarios pensando que hayan podido hacer algo mal. Podemos insertar un mensaje de confirmación con el parámetro:</p>



<pre class="wp-block-code"><code>'updated_message' =&gt; __("¡Tu post se ha publicado!", 'acf')</code></pre>



<p class="wp-block-paragraph">De este modo, tras guardar una publicación y recargar la página aparecerá el mensaje:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="738" height="524" src="https://danisanchez.net/wp-content/uploads/2021/07/image-3.png" alt="" class="wp-image-11325" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-3.png 738w, https://danisanchez.net/wp-content/uploads/2021/07/image-3-300x213.png 300w" sizes="auto, (max-width: 738px) 100vw, 738px" /></figure>



<h2 class="wp-block-heading">Redirigir a una página tras guardar el post</h2>



<p class="wp-block-paragraph">Si lo preferimos, podemos redirigirle una página de agradecimiento, similar a la página de «gracias» de un formulario de contacto.</p>



<pre class="wp-block-code"><code>'return' =&gt; home_url('gracias-por-tu-articulo')</code></pre>



<p class="wp-block-paragraph">Donde <strong>home_url()</strong> es una función que devuelve nuestro dominio actual. Solo tenemos que especificar en su interior el <em>slug</em> de la página destino.</p>



<h2 class="wp-block-heading">Insertar custom fields en el formulario</h2>



<p class="wp-block-paragraph">Si queremos añadir información adicional a las publicaciones a través de campos personalizados (custom fields), estos también pueden ser llamados en el formulario.</p>



<p class="wp-block-paragraph">Para ello, en primer lugar <strong>crearemos un nuevo grupo de campos</strong> con Advanced Custom Fields al que llamaremos «<strong>Info Post</strong>«.</p>



<p class="wp-block-paragraph">Dentro crearemos 3 campos:</p>



<ul class="wp-block-list"><li>Campo de texto: <strong>Información extra</strong>.</li><li>Campo numérico: <strong>Año</strong>.</li><li>Campo de imagen: <strong>Imagen destacada</strong>.</li></ul>



<p class="wp-block-paragraph">En las reglas de ubicación vamos a indicar que estos campos aparezcan solamente en los posts de tipo entrada. Aunque esto solo afectará al «backend» de WordPress, veremos un poco más adelante cómo mostrarlos en el formulario de ACF.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-10.png" alt="" class="wp-image-11334" width="945" height="680" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-10.png 945w, https://danisanchez.net/wp-content/uploads/2021/07/image-10-300x216.png 300w, https://danisanchez.net/wp-content/uploads/2021/07/image-10-768x553.png 768w" sizes="auto, (max-width: 945px) 100vw, 945px" /></figure>



<p class="wp-block-paragraph">Para el campo de imagen vamos a especificar que nos devuelva solamente el ID de la imagen:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="686" height="593" src="https://danisanchez.net/wp-content/uploads/2021/07/image-5.png" alt="" class="wp-image-11328" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-5.png 686w, https://danisanchez.net/wp-content/uploads/2021/07/image-5-300x259.png 300w" sizes="auto, (max-width: 686px) 100vw, 686px" /></figure>



<p class="wp-block-paragraph">Para que los <strong>campos personalizados se muestren en el formulario (frontend)</strong>, solo tenemos que añadir el siguiente parámetro:</p>



<pre class="wp-block-code"><code>'field_groups' =&gt; &#91;'clave_grupo']</code></pre>



<p class="wp-block-paragraph">Donde la clave del grupo podemos encontrarla en nuestra lista de grupos de campos:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-6.png" alt="" class="wp-image-11329" width="1012" height="361" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-6.png 1012w, https://danisanchez.net/wp-content/uploads/2021/07/image-6-300x107.png 300w, https://danisanchez.net/wp-content/uploads/2021/07/image-6-768x274.png 768w" sizes="auto, (max-width: 1012px) 100vw, 1012px" /></figure>



<p class="wp-block-paragraph">De forma que nuestra función general quedaría:</p>



<pre class="wp-block-code"><code>&lt;?php
        acf_form(array(
            'post_id' =&gt; 'new_post',
            'post_title' =&gt; true,
            'post_content' =&gt; true,
            'new_post' =&gt; array(
                'post_type' =&gt; 'post',
                'post_status' =&gt; 'publish'
            ),
            'submit_value' =&gt; 'Publicar',
            'updated_message' =&gt; __("¡Tu post se ha publicado!", 'acf'),
            'field_groups' =&gt; &#91;'group_60ffb5cfa3984']
        ));
?&gt;</code></pre>



<p class="wp-block-paragraph">Ahora al acceder a la página «Nuevo Post», veremos nuestros nuevos campos:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-7.png" alt="" class="wp-image-11330" width="760" height="478" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-7.png 760w, https://danisanchez.net/wp-content/uploads/2021/07/image-7-300x189.png 300w" sizes="auto, (max-width: 760px) 100vw, 760px" /></figure>



<h2 class="wp-block-heading">Usar un campo personalizado para establecer la imagen destacada del post</h2>



<p class="wp-block-paragraph"><strong>acf_form()</strong> no dispone de parámetros para establecer la imagen destacada del post, algo que no se comprende muy bien, pues bastaría con asociar cualquier ID de imagen de nuestra biblioteca de medios con el <em>_thumbnail_id</em> del post.</p>



<p class="wp-block-paragraph">Para ello tenemos que valernos de un pequeño truco, el cual consistirá en usar un campo personalizado para establecer la imagen destacada del post. Para ello ello hemos creado el campo personalizado «Imagen destacada».</p>



<p class="wp-block-paragraph">Pues bien, solo tenemos que pegar este snippet en el archivo de funciones (functions.php) de nuestro child-theme:</p>



<pre class="wp-block-code"><code>function acf_set_featured_image( $value, $post_id, $field  ){
    
    if($value != ''){
	    //Add the value which is the image ID to the _thumbnail_id meta data for the current post
	    add_post_meta($post_id, '_thumbnail_id', $value);
    }
 
    return $value;
}

// acf/update_value/name={$field_name} - filter for a specific field based on it's name
add_filter('acf/update_value/name=campo_de_imagen', 'acf_set_featured_image', 10, 3);</code></pre>



<p class="wp-block-paragraph">Este snippet lo he extraído del foro de Advanced Custom Fields gracias al usuario <strong><a href="https://support.advancedcustomfields.com/forums/topic/set-image-as-featured-image/#post-2275" target="_blank" rel="noreferrer noopener nofollow">Jonathan</a></strong>.</p>



<p class="wp-block-paragraph">Básicamente lo que hace es tomar nuestro campo personalizado de imagen, el cual tenemos que especificar su value en el hook, y establecerlo como imagen destacada del post.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-8.png" alt="" class="wp-image-11331" width="629" height="413" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-8.png 629w, https://danisanchez.net/wp-content/uploads/2021/07/image-8-300x197.png 300w" sizes="auto, (max-width: 629px) 100vw, 629px" /></figure>



<pre class="wp-block-code"><code>add_filter('acf/update_value/name=imagen_destacada', 'acf_set_featured_image', 10, 3);</code></pre>



<p class="wp-block-paragraph">Y al guardar o actualizar el post se establecerá como imagen destacada de este.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/07/image-9-1024x604.png" alt="" class="wp-image-11332" width="1024" height="604" srcset="https://danisanchez.net/wp-content/uploads/2021/07/image-9-1024x604.png 1024w, https://danisanchez.net/wp-content/uploads/2021/07/image-9-300x177.png 300w, https://danisanchez.net/wp-content/uploads/2021/07/image-9-768x453.png 768w, https://danisanchez.net/wp-content/uploads/2021/07/image-9.png 1277w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Y hasta aquí el post de hoy, podéis seguir practicando y aprendiendo nuevos parámetros y ajustes de <strong>acf_form()</strong> en:</p>



<p class="wp-block-paragraph"><a href="https://www.advancedcustomfields.com/resources/acf_form/" target="_blank" rel="noreferrer noopener nofollow"><strong>DOCUMENTACIÓN ADVANCED CUSTOM FIELDS: acf_form()</strong></a></p>



<p class="wp-block-paragraph">Ahh, y todo esto lo hemos hecho usando la versión FREE de ACV. Nos vemos en el siguiente post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/publicar-en-wordpress-desde-un-formulario-externo-con-advanced-custom-fields/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>Excluir los productos virtuales del importe mínimo para activar el envío gratis en WooCommerce</title>
		<link>https://danisanchez.net/excluir-los-productos-virtuales-del-importe-minimo-para-activar-el-envio-gratis-en-woocommerce/</link>
					<comments>https://danisanchez.net/excluir-los-productos-virtuales-del-importe-minimo-para-activar-el-envio-gratis-en-woocommerce/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 20 May 2021 07:59:28 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<category><![CDATA[woocommerce]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=10659</guid>

					<description><![CDATA[En WooCommerce podemos fijar un importe mínimo de pedido para activar el Envío Gratuito, y que además, oculte el resto de métodos de envío cuando el gratuito está disponible, lo vimos en este post: WooCommerce – Activar el envío gratuito automático según el importe del carrito. La cuestión es que los productos denominados virtuales, que [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En WooCommerce podemos fijar un importe mínimo de pedido para activar el <em>Envío Gratuito</em>, y que además, oculte el resto de métodos de envío cuando el gratuito está disponible, lo vimos en este post: <a href="https://danisanchez.net/woocommerce-activar-el-envio-gratuito-automatico-segun-el-importe-del-carrito/">WooCommerce – Activar el envío gratuito automático según el importe del carrito</a>.</p>



<p class="wp-block-paragraph">La cuestión es que los productos denominados virtuales, que no requieren de envío, sí cuentan para el importe mínimo que hace activar el <em>Envío Gratuito</em>. Esto ocasiona que si hemos establecido el importe mínimo en 50€, un cliente que compra un producto virtual valorado en 45€ y un producto físico valorado en 5€, ese producto físico sería enviado de forma gratuita según la configuración de WooCommerce.</p>



<p class="wp-block-paragraph">Estuve buscando información al respecto y di con este post de 2017 en Stack Overflow: <a href="https://stackoverflow.com/questions/47781984/exclude-woocommerce-virtual-product-from-counting-towards-free-delivery">Exclude WooCommerce virtual product from counting towards free delivery</a></p>



<p class="wp-block-paragraph">Un usuario compartió este filtro:</p>



<pre class="wp-block-code"><code>add_filter('woocommerce_package_rates', 'custom_free_shipping_option', 15, 2 );
function custom_free_shipping_option($rates, $package){

    // HERE set the "minimum order amount" for free shipping
    $limit = 50;

    $free_total = 0;

    // Get the cart content total excluding virtual products
    foreach( WC()-&gt;cart-&gt;get_cart() as $cart_item )
        if( ! $cart_item&#91;'data']-&gt;is_virtual( ) )
            $free_total += $cart_item&#91;'line_total'];

    // Set the cost to 0 based on specific cart content total
    if( $free_total &gt; $limit )
        foreach ( $rates as $rate_key =&gt; $rate )
            if( 'pakkelabels_shipping_gls' === $rate-&gt;method_id )
                $rates&#91;$rate-&gt;id]-&gt;cost = 0;

    return $rates;
}</code></pre>



<p class="wp-block-paragraph">Según el código, tenemos que especificar manualmente el límite de importe para que se active el <em>Envío Gratuito</em>, en la variable $limit. Seguramente habrá alguna forma de tomar dinámicamente el valor que hemos configurado en el método <em>Envío Gratuito.</em></p>



<p class="wp-block-paragraph">Probé este código en una instalación de pruebas y mi decepción es que parece no funcionar. Según el código, el producto Álbum no debería contar para el importe mínimo del <em>Envío Gratuito</em>, pero vemos que si cuenta.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="655" height="776" src="https://danisanchez.net/wp-content/uploads/2021/05/imagen.png" alt="" class="wp-image-10660" srcset="https://danisanchez.net/wp-content/uploads/2021/05/imagen.png 655w, https://danisanchez.net/wp-content/uploads/2021/05/imagen-253x300.png 253w" sizes="auto, (max-width: 655px) 100vw, 655px" /></figure>



<p class="wp-block-paragraph">Además tenemos el otro inconveniente que muestra tanto el envío gratuito como el envío de pago, cuando solo debería mostrar el <em>Envío Gratuito</em> si este está disponible.</p>



<p class="wp-block-paragraph"><strong>Pero el código me dió una idea y lo adapte de la siguiente forma:</strong></p>



<p class="wp-block-paragraph">Primero, con el bucle Foreach, recorremos el carrito sumando el importe de los artículos, pero excluyendo aquellos que sean virtuales. El importe resultante se guarda en la variable $free_total. Hasta aquí, el ejemplo funciona perfecto.</p>



<pre class="wp-block-code"><code>// Get the cart content total excluding virtual products
    foreach( WC()-&gt;cart-&gt;get_cart() as $cart_item )
        if( ! $cart_item&#91;'data']-&gt;is_virtual( ) )
            $free_total += $cart_item&#91;'line_total'];</code></pre>



<p class="wp-block-paragraph">Ahora comprobamos si este importe es superior al importe mínimo establecido en la variable $limit, si se cumple, buscamos los métodos de envío hasta que coincida con el <em>Envío Gratuito</em>, cuando coincida paramos el bucle con break y este será el único a mostrar:</p>



<pre class="wp-block-code"><code>//If the total reaches the minimum order, only the free shipping is shown
    if( $free_total &gt; $limit ){
        $free = array();
        foreach ( $rates as $rate_id =&gt; $rate ) {
            if ( 'free_shipping' === $rate-&gt;method_id ) {
                $free&#91; $rate_id ] = $rate;
                break;
            }
        }
        return ! empty( $free ) ? $free : $rates;</code></pre>



<p class="wp-block-paragraph">Y si no se cumple, es decir, si no llega al importe mínimo de pedido, recorremos los métodos de envío QUE NO SEAN el envío gratuito, para no mostrarlos como opción de envío:</p>



<pre class="wp-block-code"><code>}
    else{
        //If it does not reach the minimum order, the shipments that are NOT free are shown
        $free = array();
        foreach ( $rates as $rate_id =&gt; $rate ) {
            if ( 'free_shipping' != $rate-&gt;method_id ) {
                $free&#91; $rate_id ] = $rate;
            }
        }
        return ! empty( $free ) ? $free : $rates;   
    }</code></pre>



<p class="wp-block-paragraph">Aquí el codigo del snippet completo:</p>



<pre class="wp-block-code"><code>function custom_free_shipping_option($rates, $package){
    // HERE set the "minimum order amount" for free shipping
    $limit = 50;
    $free_total = 0;

    // Get the cart content total excluding virtual products
    foreach( WC()-&gt;cart-&gt;get_cart() as $cart_item )
        if( ! $cart_item&#91;'data']-&gt;is_virtual( ) )
            $free_total += $cart_item&#91;'line_total'];

    //If the total reaches the minimum order, only the free shipping is shown
    if( $free_total &gt; $limit ){
        $free = array();
        foreach ( $rates as $rate_id =&gt; $rate ) {
            if ( 'free_shipping' === $rate-&gt;method_id ) {
                $free&#91; $rate_id ] = $rate;
                break;
            }
        }
        return ! empty( $free ) ? $free : $rates;   
    }
    else{
        //If it does not reach the minimum order, the shipments that are NOT free are shown
        $free = array();
        foreach ( $rates as $rate_id =&gt; $rate ) {
            if ( 'free_shipping' != $rate-&gt;method_id ) {
                $free&#91; $rate_id ] = $rate;
            }
        }
        return ! empty( $free ) ? $free : $rates;   
    }
}
add_filter('woocommerce_package_rates', 'custom_free_shipping_option', 15, 2 );</code></pre>



<p class="wp-block-paragraph">Ahora volvemos al ejemplo y comprobamos que funciona:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="807" height="745" src="https://danisanchez.net/wp-content/uploads/2021/05/imagen-1.png" alt="" class="wp-image-10661" srcset="https://danisanchez.net/wp-content/uploads/2021/05/imagen-1.png 807w, https://danisanchez.net/wp-content/uploads/2021/05/imagen-1-300x277.png 300w, https://danisanchez.net/wp-content/uploads/2021/05/imagen-1-768x709.png 768w" sizes="auto, (max-width: 807px) 100vw, 807px" /></figure>



<p class="wp-block-paragraph">En este caso, el importe de los productos físicos no llega al mínimo de 50€ que haría saltar el Envío Gratuito, por lo que se cobran gastos de envío aunque el importe total sí supere los 50€.</p>



<p class="wp-block-paragraph">Si añadimos más unidades del producto físico hasta superar la barrera de los 50€, ahora si salta el <em>Envío Gratuito</em>, y además se ocultan el resto de métodos de envío de pago:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="814" height="762" src="https://danisanchez.net/wp-content/uploads/2021/05/imagen-2.png" alt="" class="wp-image-10662" srcset="https://danisanchez.net/wp-content/uploads/2021/05/imagen-2.png 814w, https://danisanchez.net/wp-content/uploads/2021/05/imagen-2-300x281.png 300w, https://danisanchez.net/wp-content/uploads/2021/05/imagen-2-768x719.png 768w" sizes="auto, (max-width: 814px) 100vw, 814px" /></figure>



<p class="wp-block-paragraph">En mi ejemplo solo tengo configurados 2 métodos de envío, el importe fijo de 5€ y el envío gratuito. No lo he probado con otros métodos de envío (combinando clases, etc). Pero en teoría debería funcionar correctamente. </p>



<p class="wp-block-paragraph">Si tienes algún problema, déjamelo en la caja de comentarios.</p>



<p class="wp-block-paragraph">Nos vemos en el siguiente post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/excluir-los-productos-virtuales-del-importe-minimo-para-activar-el-envio-gratis-en-woocommerce/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Crear zonas de widgets en Genesis Framework</title>
		<link>https://danisanchez.net/crear-zonas-de-widgets-en-genesis-framework/</link>
					<comments>https://danisanchez.net/crear-zonas-de-widgets-en-genesis-framework/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Wed, 14 Apr 2021 08:15:12 +0000</pubDate>
				<category><![CDATA[Genesis]]></category>
		<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[genesis]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=10513</guid>

					<description><![CDATA[En Genesis Framework es muy sencillo crear nuevas zonas de Widgets para acondicionar los contenidos de nuestra web. De hecho los childs theme de Genesis no dejan de ser plantillas con unas zonas de widgets predefinidas pensadas para dar forma a un módelo concreto de web (junto con su style.css correspondiente). Usando Genesis Framework con [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En <a href="https://shareasale.com/r.cfm?b=1320631&amp;u=1426295&amp;m=41388&amp;urllink=&amp;afftrack=" target="_blank" rel="noreferrer noopener">Genesis Framework</a> es muy sencillo crear nuevas zonas de Widgets para acondicionar los contenidos de nuestra web. De hecho los childs theme de Genesis no dejan de ser plantillas con unas zonas de widgets predefinidas pensadas para dar forma a un módelo concreto de web (junto con su style.css correspondiente).</p>



<p class="wp-block-paragraph">Usando Genesis Framework con su Sample Theme podemos dar forma a prácticamente cualquier tipo de web y las zonas de widgets nos pueden venir muy bien para estructurarla o dejarlas preparadas para que las usen nuestros clientes.</p>



<h2 class="wp-block-heading">Registrar la zona de widget para la home</h2>



<p class="wp-block-paragraph">Primero debemos registrar una zona de widget, esto podemos hacerlo en el archivo de funciones (functions.php) del child-theme (nunca en el functions.php de Genesis).</p>



<pre class="wp-block-code"><code>//Registrar Widget Cabecera Home
genesis_register_sidebar(array(
	'id' =&gt; 'cabecera-home-widget-area',
	'name' =&gt; __('Cabecera Home', 'genesis'),
	'description' =&gt; __('Widget para la cabecera de la página principal', 'childtheme')
));</code></pre>



<p class="wp-block-paragraph">Como se trata de un widget que solamente queremos hacer visible en la página principal de la web, podemos crear un archivo <strong>front-page.php con este contenido</strong>:</p>



<pre class="wp-block-code"><code>&lt;?php
//Mostrar Cabecera Home Widget Area
function cabecera_home_widget_area(){
    genesis_widget_area('cabecera-home-widget-area', array(
        'before' =&gt; '&lt;section class="cabecera-home"&gt;',
        'after' =&gt; '&lt;/section&gt;'
    ));
}
add_action('genesis_after_header', 'cabecera_home_widget_area');

genesis();
?&gt;</code></pre>



<p class="wp-block-paragraph">Es muy importante especificar el mismo ID de sidebar que usamos al registrarlo &#8216;cabecera-home-widget-area&#8217;.</p>



<p class="wp-block-paragraph">Nuestro widget irá dentro de una sección (&lt;section&gt;) con la clase CSS &#8216;cabecera-home&#8217;, de forma que podremos aplicarle estilos posteriormente.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="650" height="616" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-4.png" alt="" class="wp-image-10514" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-4.png 650w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-4-300x284.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure></div>



<p class="wp-block-paragraph">En esta zona podemos agregar cualquier widget, ya dea de WordPress, de Genesis o un simple HTML personalizado para darle el formato que deseemos a nuestra cabecera. Por ejemplo,  vamos a insertar un calendario:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="569" height="671" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-5.png" alt="" class="wp-image-10515" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-5.png 569w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-5-254x300.png 254w" sizes="auto, (max-width: 569px) 100vw, 569px" /></figure></div>



<p class="wp-block-paragraph">Y este es el resultado en nuestra página principal:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="747" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-6-1024x747.png" alt="" class="wp-image-10516" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-6-1024x747.png 1024w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-6-300x219.png 300w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-6-768x560.png 768w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-6.png 1266w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Como puedes ver, lo primero que carga la página es nuestra zona de widget, ya que en la página front-page.php es lo primero que encuentra, además la hemos anclado en el hook &#8216;genesis_after_header&#8217;, justo después de la cabecera de genesis.</p>



<p class="wp-block-paragraph">Después hemos llamado a genesis(); que se encarga de mostrar el content de la página (contenido que creamos con el editor y que se guarda en la base de datos).</p>



<h2 class="wp-block-heading">Registrar una zona de widget para todas las  páginas</h2>



<p class="wp-block-paragraph">Ahora vamos a crear una zona de widget que se mostrará al final de todas las páginas de nuestra web, algo que podemos aprovechar para insertar un banner o un formulario de newsletter.</p>



<p class="wp-block-paragraph">Volvemos a nuestro archivo functions.php del child  theme para registrar la nueva zona de widget:</p>



<pre class="wp-block-code"><code>//Registrar Widget Banner Footer
genesis_register_sidebar(array(
	'id' =&gt; 'banner-footer-widget-area',
	'name' =&gt; __('Banner Footer', 'genesis'),
	'description' =&gt; __('Widget para banner final en todas las páginas', 'childtheme')
));</code></pre>



<p class="wp-block-paragraph">La forma de mostrar este banner en todas las páginas (y entradas) de la web es ponerlo dentro del propio archivo de funciones, por lo que lo añadimos así:</p>



<pre id="block-5ed0795d-c25f-445c-b7ff-a54af70fad58" class="wp-block-code"><code>//Mostrar Banner Footer en todo el site
function banner_footer_widget_area(){
    genesis_widget_area('banner-footer-widget-area', array(
        'before' =&gt; '&lt;section class="banner-footer"&gt;',
        'after' =&gt; '&lt;/section&gt;'
    ));
}
add_action('genesis_before_footer', 'banner_footer_widget_area');</code></pre>



<p class="wp-block-paragraph">En este caso usamos el hook &#8216;genesis_before_footer&#8217; que posiciona nuestro banner justo antes del footer de la web.</p>



<p class="wp-block-paragraph">Si quieres ver una guía de los hooks de Genesis puedes visitar mi artículo (en construcción): <a rel="noreferrer noopener" href="https://danisanchez.net/hooks-de-genesis-framework-init-header-y-framework-parte-1/" target="_blank"><strong>Hooks de Genesis Framework (init, header y framework)</strong></a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="543" height="607" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-7.png" alt="" class="wp-image-10519" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-7.png 543w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-7-268x300.png 268w" sizes="auto, (max-width: 543px) 100vw, 543px" /></figure></div>



<p class="wp-block-paragraph">Y el resultado:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="742" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-8-1024x742.png" alt="" class="wp-image-10520" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-8-1024x742.png 1024w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-8-300x217.png 300w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-8-768x557.png 768w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-8.png 1264w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Utilizando la clase CSS de la sección &#8216;banner-footer&#8217;, podremos centrarlo darle el tamaño que necesitemos, etc.</p>



<p class="wp-block-paragraph">Recuerda que este widget será visible en cualquier página o entrada de la web, vemos cómo queda en una entrada:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="719" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-9-1024x719.png" alt="" class="wp-image-10521" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-9-1024x719.png 1024w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-9-300x211.png 300w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-9-768x539.png 768w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-9.png 1262w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Podemos condicionar dónde queremos que aparezca</strong> usando condicionales if y comprobando el tipo de contenido, por ejemplo:</p>



<pre class="wp-block-code"><code>&lt;?php
//Aplica a todas las páginas
if(is_page()){
    //Código para mostrar el widget
}
?&gt;</code></pre>



<pre id="block-46361a1b-e6e3-4050-8997-2dfc3d8c9992" class="wp-block-code"><code>&lt;?php
//Aplica a todo el contenido que sea de tipo entrada (de cualquier tipo)
if(is_single()){
    //Código para mostrar el widget
}
?&gt;</code></pre>



<pre id="block-f2857ec7-5e90-426a-8d9d-aa4223272bf4" class="wp-block-code"><code>&lt;?php
//Aplica a un custom post determinado
if(is_singular('custom_post')){
    //Código para mostrar el widget
}
?&gt;</code></pre>



<pre id="block-fd1334ae-9ef7-4e85-9e37-cb730d09e9fc" class="wp-block-code"><code>&lt;?php
//Aplica a la página de blog
if(is_home()){
    //Código para mostrar el widget
}
?&gt;</code></pre>



<pre id="block-25c1fab3-62d4-48b5-addc-57de5053309d" class="wp-block-code"><code>&lt;?php
//Aplica a la página de resultados de búsqueda
if(is_results()){
    //Código para mostrar el widget
}
?&gt;</code></pre>



<p class="wp-block-paragraph">Espero que te sea de utilidad este artículo y nos vemos en el siguiente post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/crear-zonas-de-widgets-en-genesis-framework/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Agrupar marcadores en clusters en OpenStreetMap</title>
		<link>https://danisanchez.net/agrupar-marcadores-en-clusters-en-openstreetmap/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Tue, 13 Apr 2021 08:16:09 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[markercluster]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=10500</guid>

					<description><![CDATA[Cuando en determinadas zonas de nuestro mapa se aglutinan varios marcadores, un buen recurso suele ser agruparlos en clusters, de forma que el número de elementos en el mapa disminuya mejorando así la usabilidad y visibilidad. Esta funcionalidad no viene integrada directamente en la API de OpenStreetMap (LeafletJS) y tenemos que implementarla mediante un sencillo [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Cuando en determinadas zonas de nuestro mapa se aglutinan varios marcadores, un buen recurso suele ser agruparlos en clusters, de forma que el número de elementos en el mapa disminuya mejorando así la usabilidad y visibilidad.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="466" height="402" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen.png" alt="" class="wp-image-10501" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen.png 466w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-300x259.png 300w" sizes="auto, (max-width: 466px) 100vw, 466px" /></figure></div>



<p class="wp-block-paragraph">Esta funcionalidad no viene integrada directamente en la API de OpenStreetMap (<a rel="noreferrer noopener" href="https://leafletjs.com/" target="_blank">LeafletJS</a>) y tenemos que implementarla mediante un sencillo plugin, <a rel="noreferrer noopener" href="https://github.com/Leaflet/Leaflet.markercluster" target="_blank">Leaflet MarkerCluster</a>.</p>



<p class="wp-block-paragraph">Para el ejemplo vamos a crear un mapa en OpenStreetMap como lo haríamos normalmente y como vimos en artículos anteriores:  <em><a href="https://danisanchez.net/integra-openstreetmap-en-tus-aplicaciones-web-con-leaflet-y-mapbox/">Integra OpenStreetMap en tus aplicaciones web con LeafLet y MapBox</a></em>.</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html>
&lt;html lang="es">
&lt;head>
    &lt;meta charset="UTF-8">
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge">
    &lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
   integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
   crossorigin=""/>
    &lt;script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
    integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
    crossorigin="">&lt;/script>
    &lt;title>Mapa con OpenStreetMap&lt;/title>
    
    &lt;style>
    	#mimapa {height: 600px;}
    &lt;/style>
&lt;/head>

&lt;body>
    &lt;div id="mimapa">&lt;/div>
    
    &lt;script>
    	var mymap = L.map('mimapa').setView(&#91;37.1698, -3.965], 18);
    	
    	L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
    		maxZoom: 25,
    		attribution: 'Datos del mapa de &amp;copy; &lt;a href="https://www.openstreetmap.org/">OpenStreetMap&lt;/a>, ' + '&lt;a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA&lt;/a>, ' + 'Imágenes © &lt;a href="https://www.mapbox.com/">Mapbox&lt;/a>', 
    		id: 'mapbox/streets-v11'
		}).addTo(mymap);
	&lt;/script>
&lt;/body>
&lt;/html></code></pre>



<p class="wp-block-paragraph">Ejecutando este código ya deberíamos poder visualizar un mapa vacío. Si no carga, revisa el código. Puedes modificar las coordenadas por las de tu zona, si lo prefieres.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="980" height="659" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-1.png" alt="" class="wp-image-10502" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-1.png 980w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-1-300x202.png 300w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-1-768x516.png 768w" sizes="auto, (max-width: 980px) 100vw, 980px" /></figure>



<p class="wp-block-paragraph">Ahora vamos a añadir unos cuantos marcadores en un espacio reducido:</p>



<pre class="wp-block-code"><code>/*MARCADORES*/
var marker1 = L.marker(&#91;37.1698, -3.965]).addTo(mymap);
var marker2 = L.marker(&#91;37.1698, -3.966]).addTo(mymap);
var marker3 = L.marker(&#91;37.1700, -3.966]).addTo(mymap);
var marker4 = L.marker(&#91;37.1700, -3.967]).addTo(mymap);
var marker5 = L.marker(&#91;37.1696, -3.964]).addTo(mymap);
var marker6 = L.marker(&#91;37.1694, -3.964]).addTo(mymap);</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="607" height="423" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-2.png" alt="" class="wp-image-10504" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-2.png 607w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-2-300x209.png 300w" sizes="auto, (max-width: 607px) 100vw, 607px" /></figure></div>



<p class="wp-block-paragraph">Hasta aquí bien, tenemos 6 marcadores agrupados en una zona reducida, lo que a simple vista dificulta un poco la visibilidad. Para poder agrupar estor marcadores en clusters vamos a añadir los scripts del plugin MarkerCluster en el &lt;head> de nuestra página a continuación de los scripts de Leaflet:</p>



<pre class="wp-block-code"><code>&lt;link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.1.0/dist/MarkerCluster.css" />
&lt;link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.1.0/dist/MarkerCluster.Default.css" />
&lt;script src="https://unpkg.com/leaflet.markercluster@1.1.0/dist/leaflet.markercluster.js">&lt;/script></code></pre>



<p class="wp-block-paragraph">Bien, lo primero que vamos a hacer es volver al código de marcadores y quitarles el método addTo(mymap), ya que no vamos a añadirlos de forma indepeniente y dejar este método puede crear repeticiones y comportamientos extraños.</p>



<pre class="wp-block-code"><code>/*MARCADORES*/
var marker1 = L.marker(&#91;37.1698, -3.965]);
var marker2 = L.marker(&#91;37.1698, -3.966]);
var marker3 = L.marker(&#91;37.1700, -3.966]);
var marker4 = L.marker(&#91;37.1700, -3.967]);
var marker5 = L.marker(&#91;37.1696, -3.964]);
var marker6 = L.marker(&#91;37.1694, -3.964]);</code></pre>



<p class="wp-block-paragraph">A continuación de los marcadores, vamos a declarar un grupo de clusters:</p>



<pre class="wp-block-code"><code>var grupos = L.markerClusterGroup(); </code></pre>



<p class="wp-block-paragraph">Y lo único que tenemos que hacer es añadir cada marcador a este grupo:</p>



<pre class="wp-block-code"><code>grupos.addLayer(marker1);
grupos.addLayer(marker2);
grupos.addLayer(marker3);
grupos.addLayer(marker4);
grupos.addLayer(marker5);
grupos.addLayer(marker6);</code></pre>



<p class="wp-block-paragraph">Huelga decir que si tienes cientos de marcadores no es necesario escribir todo manualmente, usa un bucle que para eso están!</p>



<pre class="wp-block-code"><code>/*POR EJEMPLO:*/
for(var i=1; i &lt;= 6; i++){
    grupos.addLayer(marker+i);
}</code></pre>



<p class="wp-block-paragraph">Por último agregamos el grupo al mapa:</p>



<pre class="wp-block-code"><code>mymap.addLayer(grupos);</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="978" height="656" src="https://danisanchez.net/wp-content/uploads/2021/04/imagen-3.png" alt="" class="wp-image-10506" srcset="https://danisanchez.net/wp-content/uploads/2021/04/imagen-3.png 978w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-3-300x201.png 300w, https://danisanchez.net/wp-content/uploads/2021/04/imagen-3-768x515.png 768w" sizes="auto, (max-width: 978px) 100vw, 978px" /></figure></div>



<p class="wp-block-paragraph">Los marcadores se irán agrupando dinámicamente según el zoom que apliquemos al mapa.</p>



<p class="wp-block-paragraph">Os dejo el código del archivo html final comentado:</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html>
&lt;html lang="es">
&lt;head>
    &lt;meta charset="UTF-8">
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge">
    
    &lt;!-- API LEAFLET -->
    &lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
   integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
   crossorigin=""/>
    &lt;script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
    integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
    crossorigin="">&lt;/script>
    	
    &lt;!--PLUGIN MARKERCLUSTER -->	
   	&lt;link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.1.0/dist/MarkerCluster.css" />
	&lt;link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.1.0/dist/MarkerCluster.Default.css" />
	&lt;script src="https://unpkg.com/leaflet.markercluster@1.1.0/dist/leaflet.markercluster.js">&lt;/script> 
    &lt;title>Mapa con Open Street Map&lt;/title>
    
    &lt;style>
    	#mimapa {height: 600px;}
    &lt;/style>
&lt;/head>

&lt;body>
    &lt;div id="mimapa">&lt;/div>
    
    &lt;script>
    	/*DECLARAR EL MAPA*/
    	var mymap = L.map('mimapa').setView(&#91;37.1698, -3.965], 16);
    	
    	/*DIBUJAR EL MAPA*/
    	L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
    maxZoom: 25,
    attribution: 'Datos del mapa de &amp;copy; &lt;a href="https://www.openstreetmap.org/">OpenStreetMap&lt;/a>, ' + '&lt;a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA&lt;/a>, ' + 'Imágenes © &lt;a href="https://www.mapbox.com/">Mapbox&lt;/a>', 
    id: 'mapbox/streets-v11'
}).addTo(mymap);
		
/*DEFINIR MARCADORES*/
var marker1 = L.marker(&#91;37.1698, -3.965]);
var marker2 = L.marker(&#91;37.1698, -3.966]);
var marker3 = L.marker(&#91;37.1700, -3.966]);
var marker4 = L.marker(&#91;37.1700, -3.967]);
var marker5 = L.marker(&#91;37.1696, -3.964]);
var marker6 = L.marker(&#91;37.1694, -3.964]);
		
/*CREAR GRUPO DE CLUSTERS*/
var grupos = L.markerClusterGroup(); 
		
/*AÑADIR CADA MARCADOR AL CLUSTER*/
grupos.addLayer(marker1);
grupos.addLayer(marker2);
grupos.addLayer(marker3);
grupos.addLayer(marker4);
grupos.addLayer(marker5);
grupos.addLayer(marker6);
		
//AÑADIR CLUSTER AL MAPA
mymap.addLayer(grupos);
&lt;/script>
&lt;/body>
&lt;/html></code></pre>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
