<?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>Tutoriales &#8211; danisanchez.net</title>
	<atom:link href="https://danisanchez.net/category/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>https://danisanchez.net</link>
	<description></description>
	<lastBuildDate>Mon, 13 Apr 2026 21:00:56 +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>Tutoriales &#8211; danisanchez.net</title>
	<link>https://danisanchez.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Instalar LAMP (Apache, PHP, MariaDB y phpMyAdmin) en openSUSE Leap 16.0</title>
		<link>https://danisanchez.net/instalar-lamp-apache-php-mariadb-y-phpmyadmin-en-opensuse-leap-16-0/</link>
					<comments>https://danisanchez.net/instalar-lamp-apache-php-mariadb-y-phpmyadmin-en-opensuse-leap-16-0/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 21:00:56 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensuse]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=15555</guid>

					<description><![CDATA[Recientemente he migrado mi entorno de trabajo de Debian 13 Gnome a openSUSE Leap 16 KDE Plasma. Hacía tiempo que buscaba cambiar un poco de aires y salir de mi zona de confort basada en .deb para explorar más a fondo el mundo .rpm, y qué mejor que pasar de una distro super estable, aburrida [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Recientemente he migrado mi entorno de trabajo de Debian 13 Gnome a openSUSE Leap 16 KDE Plasma.</p>



<p class="wp-block-paragraph">Hacía tiempo que buscaba cambiar un poco de aires y salir de mi zona de confort basada en .deb para explorar más a fondo el mundo .rpm, y qué mejor que pasar de una distro super estable, aburrida y segura como Debian a otra distro super estable, segura y probablemente más aburrida como la rama Leap de openSUSE, la cual ha estrenado su versión 16 después de 8 años que se ha mantenido la 15 (y la cual aún cuenta con bastante tiempo de soporte).</p>



<p class="wp-block-paragraph">En esta entrada vamos a seguir los pasos para instalar el stack de servidor web para pruebas y desarrollos en local (no vamos a abrir el servidor al exterior, solamente funcionará en nuestro entorno <em>localhost</em>).</p>



<h2 class="wp-block-heading"><strong>Instalar Apache2 en openSUSE Leap 16.0</strong></h2>



<p class="wp-block-paragraph">Primero instalamos el servidor web:</p>



<pre class="wp-block-code"><code>sudo zypper in apache2</code></pre>



<p class="wp-block-paragraph">Una vez instalado, lo habilitamos con el comando:</p>



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



<p class="wp-block-paragraph">Y seguidamente lo iniciamos con:</p>



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



<p class="wp-block-paragraph">Otros comandos básicos de Apache son <em>stop</em> para detenerlo y <em>restart</em> para reiniciarlo, en caso de que hayamos hecho algún cambio en la configuración.</p>



<p class="wp-block-paragraph">El directorio de trabajo donde alojaremos los proyectos es <strong>/srv/www/htdocs</strong>/</p>



<p class="wp-block-paragraph"><strong>Configuración de Apache</strong></p>



<p class="wp-block-paragraph">Dentro del archivo de configuración de Apache, concretamente al principio, en el apartado «&lt;Directory «/srv/www/htdocs»&gt;», necesitamos añadir o descomentar estas líneas:</p>



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



<pre class="wp-block-code"><code>Options Indexed FollowSymLinks
AllowOverride All
Require all granted</code></pre>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="740" src="https://danisanchez.net/wp-content/uploads/2026/03/imagen-2-1024x740.webp" alt="" class="wp-image-15580" srcset="https://danisanchez.net/wp-content/uploads/2026/03/imagen-2-1024x740.webp 1024w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-2-300x217.webp 300w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-2-768x555.webp 768w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-2.webp 1123w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Comprobar que <strong>no haya</strong> una linea que diga <strong>AllowOverride None</strong> (en tal caso, quitarla o comentarla)</p>



<p class="wp-block-paragraph"><strong>Reiniciamos Apache:</strong></p>



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



<p class="wp-block-paragraph">Para comprobar que nuestro servidor está en funcionamiento, podemos crear un sencillo archivo index.html en la ruta anterior:</p>



<pre class="wp-block-code"><code>sudo nano /srv/www/htdocs/index.html</code></pre>



<pre class="wp-block-code"><code>&lt;html&gt;
    &lt;body&gt;&lt;h1&gt;Bienvenido a Localhost!&lt;/body&gt;
&lt;/html&gt;</code></pre>



<p class="wp-block-paragraph">Abrimos un navegador web y vamos a la dirección http://localhost/</p>



<p class="wp-block-paragraph">Deberemos ver nuestro mensaje de bienvenida:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="819" src="https://danisanchez.net/wp-content/uploads/2026/03/imagen-1024x819.webp" alt="" class="wp-image-15556" srcset="https://danisanchez.net/wp-content/uploads/2026/03/imagen-1024x819.webp 1024w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-300x240.webp 300w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-768x614.webp 768w, https://danisanchez.net/wp-content/uploads/2026/03/imagen.webp 1189w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><strong>Instalar MariaDB en openSUSE Leap 16.0</strong></h2>



<p class="wp-block-paragraph">A continuación vamos a instalar el gestor de bases de datos MariaDB:</p>



<pre class="wp-block-code"><code>sudo zypper in mariadb</code></pre>



<p class="wp-block-paragraph">Al igual que con Apache, debemos ejecutar los comandos para habilitar el servicio e iniciarlo:</p>



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



<p class="wp-block-paragraph">Y si necesitamos detener o reiniciar el servicio:</p>



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



<h3 class="wp-block-heading">Establecer contraseña de root para MariaDB</h3>



<p class="wp-block-paragraph">Por defecto, el servicio mysql (mariadb) viene sin contraseña de root. Para asignarla ejecutamos el comando:</p>



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



<p class="wp-block-paragraph">Al preguntarnos si queremos asignar una contraseña de roor, decimos que si (y):</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">Después nos hará una serie de preguntas, como si deseamos eliminar usuarios anónimos, borrar tablas de test, etc. En mi caso le doy que sí 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>



<h3 class="wp-block-heading">Crear usuario de MySQL</h3>



<p class="wp-block-paragraph">Lo normal es trabajar con un usuario personalizado en lugar de trabajar directamente con root. Para crear un usuario, entramos en la consola de MySQL:</p>



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



<p class="wp-block-paragraph">Y creamos el nuevo usuario:</p>



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



<h2 class="wp-block-heading"><strong>Instalar PHP en openSUSE Leap 16.0</strong></h2>



<p class="wp-block-paragraph">En el momento de escribir este artículo, la versión disponible para openSUSE Leap 16.0 es la 8.4.16. Una versión bastante reciente para una distro con enfoque conservador. Veremos cómo se va actualizando a lo largo de su ciclo de vida :</p>



<pre class="wp-block-code"><code>php --version
PHP 8.4.16 (cli) (built: Dec 19 2025 07:51:15) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.4.16, Copyright (c) Zend Technologies</code></pre>



<p class="wp-block-paragraph">Para instalar PHP en nuestro entorno LAMP, necesitamos el paquete php general, el paquete conector con Apache y el paquete conector con MySQL:</p>



<pre class="wp-block-code"><code>sudo zyyper in php8 php8-mysql apache2-mod_php8</code></pre>



<p class="wp-block-paragraph">Una vez instalado, descomentamos o añadimos esta línea en al archivo de configuración /etc/apache2/mod_mime-defaults.conf</p>



<p class="wp-block-paragraph">En mi caso la línea no venía comentada y la tuve que añadir.</p>



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



<pre class="wp-block-code"><code>AddType application/x-httpd-php .php</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="943" height="812" src="https://danisanchez.net/wp-content/uploads/2026/03/imagen-1.webp" alt="" class="wp-image-15579" srcset="https://danisanchez.net/wp-content/uploads/2026/03/imagen-1.webp 943w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-1-300x258.webp 300w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-1-768x661.webp 768w" sizes="(max-width: 943px) 100vw, 943px" /></figure>



<p class="wp-block-paragraph">Esto hará que Apache interprete los archivos .php como scripts de servidor, en lugar de archivos descargables o de texto plano.</p>



<p class="wp-block-paragraph"><strong>Habilitamos el módulo de php en Apache</strong></p>



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



<p class="wp-block-paragraph"><strong>Habilitamos el módulo rewrite, esencial para manejar URLs amigables en WordPress y otros CMS</strong></p>



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



<p class="wp-block-paragraph"><strong>Ampliamos parámetros en php.ini</strong></p>



<p class="wp-block-paragraph">Por defecto, php viene configurado con unos parámetros mínimos que pueden quedarse cortos a la hora de trabajar, como el caso de la subida de archivos al servidor (limitada a 2MB), o el limite de memoria (128M).</p>



<p class="wp-block-paragraph">El archivo a editar se encuentra en /etc/php8/apache2/php.ini</p>



<p class="wp-block-paragraph">Si vas a trabajar con WordPress u otros CMS, a mí me gusta ampliar estos parámetros:</p>



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



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



<p class="wp-block-paragraph">Ahora reiniciamos Apache para que surtan efecto todos los cambios anteriores:</p>



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



<h2 class="wp-block-heading"><strong>Instalar phpMyAdmin en openSUSE Leap 16.0</strong></h2>



<p class="wp-block-paragraph">phpMyAdmin viene de serie en los repositorios de openSUSE, por lo que la instalación es de lo más sencillo, sin necesidad de descargar de sitios externos ni de editar archivos de configuración.</p>



<pre class="wp-block-code"><code>sudo zypper in phpMyAdmin</code></pre>



<p class="wp-block-paragraph">Para abrirlo accedemos desde el navegador a la ruta: http://localhost/phpMyAdmin </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="958" height="701" src="https://danisanchez.net/wp-content/uploads/2026/03/imagen-4.webp" alt="" class="wp-image-15582" srcset="https://danisanchez.net/wp-content/uploads/2026/03/imagen-4.webp 958w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-4-300x220.webp 300w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-4-768x562.webp 768w" sizes="auto, (max-width: 958px) 100vw, 958px" /></figure>



<p class="wp-block-paragraph">(<strong>Muy importante respetar las mayúsculas y minúsculas</strong> de phpMyAdmin, de lo contrario os dirá que la ruta no existe:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="958" height="496" src="https://danisanchez.net/wp-content/uploads/2026/03/imagen-3.webp" alt="" class="wp-image-15581" srcset="https://danisanchez.net/wp-content/uploads/2026/03/imagen-3.webp 958w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-3-300x155.webp 300w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-3-768x398.webp 768w" sizes="auto, (max-width: 958px) 100vw, 958px" /></figure>



<h2 class="wp-block-heading"><strong>Relajar la seguridad de SELinux</strong></h2>



<p class="wp-block-paragraph">Por último, si trabajas con WordPress o similares y tienes problemas de conexión (por ejemplo, no descarga ni instala plugins), puedes cambiar el nivel de protección de SELinux de estricto a permisivo:</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>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="741" src="https://danisanchez.net/wp-content/uploads/2026/03/imagen-5-1024x741.webp" alt="" class="wp-image-15583" srcset="https://danisanchez.net/wp-content/uploads/2026/03/imagen-5-1024x741.webp 1024w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-5-300x217.webp 300w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-5-768x556.webp 768w, https://danisanchez.net/wp-content/uploads/2026/03/imagen-5.webp 1122w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Reiniciamos el equipo, y ya tendremos todo el stack LAMP listo para desarrollo en local <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-apache-php-mariadb-y-phpmyadmin-en-opensuse-leap-16-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Permitir iframes en Dynamic Fields de JetEngine</title>
		<link>https://danisanchez.net/permitir-iframes-en-dynamic-fields-de-jetengine/</link>
					<comments>https://danisanchez.net/permitir-iframes-en-dynamic-fields-de-jetengine/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Tue, 17 Feb 2026 20:12:06 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[jetengine]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=15363</guid>

					<description><![CDATA[Si necesitamos mostrar un iframe llamado desde un campo personalizado con un widget normal de HTML, necesitamos habilitar el uso de iframes en los dynamics fields de JetEngine:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si necesitamos mostrar un iframe llamado desde un campo personalizado con un widget normal de HTML, necesitamos habilitar el uso de iframes en los dynamics fields de JetEngine:</p>



<pre class="wp-block-code"><code>add_filter( 'wp_kses_allowed_html', function ( $tags, $context ){
    if ( 'post' === $context ) {
        $tags&#91;'iframe'] = array(
        'src' => true,
        'width' => true,
        'height' => true,
        'width' => true, 
        'frameborder' => true,
        'allowtransparency' => true,
        'allow' => true,
        );
    }
    return $tags;
},10,2);</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/permitir-iframes-en-dynamic-fields-de-jetengine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aplicar noindex, nofollow y noarchive a todo WordPress excepto a la página de inicio</title>
		<link>https://danisanchez.net/aplicar-noindex-nofollow-y-noarchive-a-todo-wordpress-excepto-a-la-pagina-de-inicio/</link>
					<comments>https://danisanchez.net/aplicar-noindex-nofollow-y-noarchive-a-todo-wordpress-excepto-a-la-pagina-de-inicio/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 24 Jul 2025 20:46:27 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=15053</guid>

					<description><![CDATA[En ocasiones puede que nos interese indexar únicamente la página principal del sitio y excluir el resto (páginas, posts, attachments&#8230;). Podemos usar algún plugin como Yoast SEO para marcar todo lo que no queramos indexar, aunque es mucho más rápido usar el siguiente snippet a nuestro functions.php o plugin personalizado:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En ocasiones puede que nos interese indexar únicamente la página principal del sitio y excluir el resto (páginas, posts, attachments&#8230;).</p>



<p class="wp-block-paragraph">Podemos usar algún plugin como Yoast SEO para marcar todo lo que no queramos indexar, aunque es mucho más rápido usar el siguiente snippet a nuestro functions.php o plugin personalizado:</p>



<pre class="wp-block-code"><code>// Aplicar noindex, nofollow y noarchive a todas las páginas excepto la home
function noindex_excepto_home() {
    if (!is_front_page()) {
        echo '&lt;meta name="robots" content="noindex, nofollow, noarchive" />' . "\n";
    }
}
add_action('wp_head', 'noindex_excepto_home');</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/aplicar-noindex-nofollow-y-noarchive-a-todo-wordpress-excepto-a-la-pagina-de-inicio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo aplicar un CSS personalizado en Elementor sin que afecte al modo edición</title>
		<link>https://danisanchez.net/como-aplicar-un-css-personalizado-en-elementor-sin-que-afecte-al-modo-edicion/</link>
					<comments>https://danisanchez.net/como-aplicar-un-css-personalizado-en-elementor-sin-que-afecte-al-modo-edicion/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Wed, 23 Jul 2025 21:01:28 +0000</pubDate>
				<category><![CDATA[Elementor]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[elementor]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=15051</guid>

					<description><![CDATA[En ocasiones necesitamos aplicar un estilo CSS cuyo efecto puede molestarnos a la hora de editar. Podemos declara nuestro css adicional de la siguiente forma: La condición evita que los estilos apliquen tanto al panel administrador como a Elementor cuando está en modo edición.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En ocasiones necesitamos aplicar un estilo CSS cuyo efecto puede molestarnos a la hora de editar.</p>



<p class="wp-block-paragraph">Podemos declara nuestro css adicional de la siguiente forma:</p>



<pre class="wp-block-code"><code>function estilos_solo_frontend() {
    if ( ! is_admin() &amp;&amp; ! Elementor\Plugin::$instance->preview->is_preview_mode() ) {
        wp_enqueue_style(
            'custom-elementor-frontend-css',
            get_stylesheet_directory_uri() . '/estilos-personalizados.css', // Ruta a tu archivo CSS
            array(),
            '1.0'
        );
    }
}
add_action( 'wp_enqueue_scripts', 'estilos_solo_frontend' );</code></pre>



<p class="wp-block-paragraph">La condición evita que los estilos apliquen tanto al panel administrador como a Elementor cuando está en modo edición.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/como-aplicar-un-css-personalizado-en-elementor-sin-que-afecte-al-modo-edicion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cambia el texto «Sin existencias» de WooCommerce cuando un producto está agotado</title>
		<link>https://danisanchez.net/cambia-el-texto-sin-existencias-de-woocommerce-cuando-un-producto-esta-agotado/</link>
					<comments>https://danisanchez.net/cambia-el-texto-sin-existencias-de-woocommerce-cuando-un-producto-esta-agotado/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 17:08:58 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<category><![CDATA[woocommerce]]></category>
		<guid isPermaLink="false">http://localhost:4284/?p=15008</guid>

					<description><![CDATA[Si queremos cambiar el texto «Sin existencias» por defecto de WooCommerce cuando un producto está agotado, por otra expresión como «Agotado», «Vendido», o «Próximamente», podemos hacer uso del siguiente snippet: Nos vemos en el siguiente post 😉]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si queremos cambiar el texto «Sin existencias» por defecto de WooCommerce cuando un producto está agotado, por otra expresión como «Agotado», «Vendido», o «Próximamente», podemos hacer uso del siguiente snippet:</p>



<pre class="wp-block-code"><code>function cambiar_texto_sin_existencias( $text, $product ) {
    if ( ! $product-&gt;is_in_stock() ) {
        $text = 'Próximamente'; //o el texto que prefieras
    }
    return $text;
}
add_filter( 'woocommerce_get_availability_text', 'cambiar_texto_sin_existencias', 10, 2 );</code></pre>



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



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/cambia-el-texto-sin-existencias-de-woocommerce-cuando-un-producto-esta-agotado/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recurso: Página de mantenimiento provisional en HTML</title>
		<link>https://danisanchez.net/recurso-pagina-de-mantenimiento-provisional-en-html/</link>
					<comments>https://danisanchez.net/recurso-pagina-de-mantenimiento-provisional-en-html/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 17:06:11 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<guid isPermaLink="false">http://localhost:4284/?p=15006</guid>

					<description><![CDATA[Una página de mantenimiento provisional en un único archivo HTML, que nos puede venir muy bien cuando estamos haciendo migraciones:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Una página de mantenimiento provisional en un único archivo HTML, que nos puede venir muy bien cuando estamos haciendo migraciones:</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;title>Sitio en Mantenimiento&lt;/title>
    &lt;style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f5f5f5;
            color: #333;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            text-align: center;
            line-height: 1.6;
        }
        
        .maintenance-container {
            background-color: white;
            border-radius: 10px;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
            padding: 40px;
            max-width: 600px;
            width: 90%;
        }
        
        h1 {
            color: #e74c3c;
            margin-bottom: 20px;
        }
        
        .icon {
            font-size: 60px;
            margin-bottom: 20px;
            color: #f39c12;
        }
        
        p {
            margin-bottom: 25px;
            font-size: 18px;
        }
        
        .contact {
            background-color: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            margin-top: 20px;
            font-style: italic;
        }
        
        .progress-container {
            width: 100%;
            background-color: #e0e0e0;
            border-radius: 5px;
            margin: 20px 0;
        }
        
        .progress-bar {
            width: 65%;
            height: 20px;
            background-color: #2ecc71;
            border-radius: 5px;
            animation: progress 2s ease-in-out infinite;
        }
        
        @keyframes progress {
            0% { width: 65%; }
            50% { width: 70%; }
            100% { width: 65%; }
        }
    &lt;/style>
&lt;/head>
&lt;body>
    &lt;div class="maintenance-container">
        &lt;div class="icon">&#x1f527;&lt;/div>
        &lt;h1>Sitio en Mantenimiento&lt;/h1>
        &lt;p>Estamos realizando tareas de mantenimiento para mejorar nuestro servicio.&lt;/p>
        &lt;p>Disculpa las molestias. Volveremos pronto con una experiencia mejorada.&lt;/p>
        
        &lt;div class="progress-container">
            &lt;div class="progress-bar">&lt;/div>
        &lt;/div>
        
        &lt;div class="contact">
            Si necesitas asistencia inmediata, contáctanos en:&lt;br>
            &lt;strong>soporte@ejemplo.com&lt;/strong>
        &lt;/div>
    &lt;/div>
&lt;/body>
&lt;/html></code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/recurso-pagina-de-mantenimiento-provisional-en-html/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Iniciar sesión en nuestros VPS mediante SSH Keys</title>
		<link>https://danisanchez.net/iniciar-sesion-en-nuestros-vps-mediante-ssh-keys/</link>
					<comments>https://danisanchez.net/iniciar-sesion-en-nuestros-vps-mediante-ssh-keys/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Sun, 04 May 2025 12:50:59 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[vps]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=14880</guid>

					<description><![CDATA[Hace tiempo que intento mejorar la seguridad de los accesos SSH a mis servidores virtuales, pues creo que la configuración por defecto basada en usuario (root) y contraseña, no es suficiente y el acceso queda expuesto a ataques por fuerza bruta o simples robos de contraseña. Hasta ahora venía usando un doble factor de autenticación [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hace tiempo que intento mejorar la seguridad de los accesos SSH a mis servidores virtuales, pues creo que la configuración por defecto basada en usuario (root) y contraseña, no es suficiente y el acceso queda expuesto a ataques por fuerza bruta o simples robos de contraseña.</p>



<p class="wp-block-paragraph">Hasta ahora venía usando un doble factor de autenticación basado en Google Authenticator. Aunque el sistema es efectivo, proceso que ya expliqué hace un tiempo en <a href="https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/">este artículo</a>, no me gusta la idea de depender de un servicio como Google Authenticator, o de que mi servidor mantenga el paquete google-authenticator en futuras versiones, así que me he pasado al método de acceso por <strong>SSH Keys</strong>. Un método muy seguro basado en el sistema llave pública &#8211; llave secreta, utilizado en infinidad de aplicaciones.</p>



<h2 class="wp-block-heading">Crear las SSH Keys</h2>



<p class="wp-block-paragraph">Crearemos las SSH Keys en nuestra máquina local (yo uso GNU/Linux y lo voy a explicar en base a estos sistemas, si usas otro tipo de sistema operativo, busca información adicional sobre cómo generar SSH Keys) abriendo un terminal y ejecutando el siguiente comando:</p>



<pre class="wp-block-code"><code>ssh-keygen</code></pre>



<p class="wp-block-paragraph">Nos preguntará si deseamos darle un nombre (es conveniente usar un nombre que nos de una pista sobre dónde la vamos a usar), por ejemplo «<strong>keyservidorclientes</strong>«.</p>



<p class="wp-block-paragraph">Si no indicamos ningún nombre, se asignará por defecto: id_rda.</p>



<p class="wp-block-paragraph">La segunda pregunta nos ofrece crear una frase de contraseña para nuestra llave secreta. Es opcional, pero si alguien accede a nuestra máquina local, podría acceder automáticamente a nuestros servidores sin mayor problema. La frase de llave secreta añade un factor de seguridad más para estos casos.</p>



<p class="wp-block-paragraph">Tras asignar el nombre y frase se crearán dos ficheros dentro de /home/user/.ssh/</p>



<ul class="wp-block-list">
<li>keyservidorclientes.pub</li>



<li>keyservidorclientes</li>
</ul>



<p class="wp-block-paragraph">o si no le hemos asignado un nombre al momento de crearlas:</p>



<ul class="wp-block-list">
<li>id_rda.pub</li>



<li>id_rda </li>
</ul>



<p class="wp-block-paragraph">El primer fichero con extensión .pub contiene nuestra llave pública y el fichero sin extensión, nuestra llave secreta.</p>



<h2 class="wp-block-heading">Organizar nuestras SSH Keys</h2>



<p class="wp-block-paragraph">Si vamos a generar muchos SSH Keys para diferentes servidores, una buena práctica es guardar cada par de llaves en directorios diferentes, por ejemplo:</p>



<pre class="wp-block-code"><code>.ssh/servidordesarrollo/keyservidordesarrollo.pub
.ssh/servidordesarrollo/keyservidordesarrollo

.ssh/servidorclientes/keyservidorclientes.pub
.ssh/servidorclientes/keyservidorclientes

.ssh/servidorbackups/keyservidorbackups.pub
.ssh/servidorbackups/keyservidorbackups</code></pre>



<p class="wp-block-paragraph">Después creamos (si no existe) un fichero de configuración donde asociamos cada acceso con la ubicación de sus SSH Keys. Este fichero se llama <strong>config</strong> y debemos ubicarlo en el directorio principal /home/user/.ssh/ </p>



<p class="wp-block-paragraph">Dentro referenciamos cada servidor con la ubicación de sus SSH Keys:</p>



<pre class="wp-block-code"><code>Host servidordesarrollo
	HostName IP o dominio del tu servidor
	User root
	IdentityFile ~/.ssh/servidordesarrollo/keyservidordesarrollo
	
Host servidorclientes
	HostName IP o dominio de tu servidor
	User root
	IdentityFile ~/.ssh/servidorclientes/keyservidorclientes
	
Host servidorbackpus
	HostName IP o dominio de tu servidor
	User root
	IdentityFile ~/.ssh/servidorbackups/keyservidorbackups

...</code></pre>



<p class="wp-block-paragraph">Ahora para conectar con nuestro servidor virtual de clientes solo tenemos que ejecutar:</p>



<pre class="wp-block-code"><code>ssh root@servidorclientes</code></pre>



<p class="wp-block-paragraph">Y para conectar con nuestro servidor de backups sería:</p>



<pre class="wp-block-code"><code>ssh root@servidorbackups</code></pre>



<h2 class="wp-block-heading">Copiar las llaves públicas en nuestros servidores virtuales</h2>



<p class="wp-block-paragraph">Una vez generadas las SSH Keys en nuestra máquina local, tenemos que añadir la llave pública al servidor virtual.</p>



<p class="wp-block-paragraph">Existen herramientas dentro de OpenSSH, que permiten copiar fácilmente nuestra llave pública a nuestro servidor virtual. Pero básicamente lo que hacen es leer nuestro fichero .pub  y copiar su contenido al fichero authorized_keys de nuestro servidor virtual. A mí me gusta hacer este proceso manualmente y asegurarme de que todo se ha llevado a cabo correctamente.</p>



<p class="wp-block-paragraph">Para ello abrimos nuestra llave pública (fichero.pub) con un editor de textos (o desde terminal con cat fichero.pub) y copiamos su contenido.</p>



<p class="wp-block-paragraph">Nos conectamos a nuestro servidor virtual por el método normal SSH por contraseña y editamos con nano (o tu editor preferido), el archivo <strong>/home/user/.ssh/authorized_keys</strong> añadiendo el contenido copiado de nuestra llave pública. (Si queremos añadir otra clave pública, podemos hacerlo a continuación, en una nueva línea. <strong>Cuidado con no soobreesribir otras claves que ha hubiera en el archivo</strong>).</p>



<p class="wp-block-paragraph">A partir de ahora podremos conectar vía SSH con nuestra SSH Key, utilizando la frase de nuestra clave privada en vez de la contraseña de root de nuestro servidor.</p>



<p class="wp-block-paragraph">Esto hace que solo podamos acceder vía SSH desde nuestra máquina local y si conocemos la frase de nuestra clave secreta.</p>



<h2 class="wp-block-heading">Deshabilitar el acceso normal por contraseña</h2>



<p class="wp-block-paragraph">Ahora hay que deshabilitar el acceso normal por contraseña, pues lo que queremos es mejorar la seguridad, de forma que solo se pueda acceder al servidor con la SSH Key.</p>



<p class="wp-block-paragraph">El archivo que tenemos que editar se encuentra en <strong>/etc/ssh/sshd_config</strong>, así que con nano o el editor de terminal que prefieras localizamos la línea:</p>



<pre class="wp-block-code"><code>#PasswordAuthentication yes</code></pre>



<p class="wp-block-paragraph">Descomentamos quitando # y cambiamos a PasswordAuthentication no</p>



<pre class="wp-block-code"><code>PasswordAuthentication no</code></pre>



<p class="wp-block-paragraph">Adicionalmente comprobamos que esta línea está descomentada y en yes:</p>



<pre class="wp-block-code"><code>PubkeyAuthentication yes</code></pre>



<p class="wp-block-paragraph">Y reiniciamos el servicio SSH, en servidores Debian/Ubuntu es:</p>



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



<p class="wp-block-paragraph">Antes de cerrar sesión, por precaución, abre un segundo terminal y asegúrate de que puedes iniciar sesión con tu SSH Key. En caso de que no puedas, revierte los cambios anteriores y vuelve a reiniciar el servicio SSH.</p>



<p class="wp-block-paragraph">Si todo ha ido bien, al intentar iniciar sesión mediante contraseña normal, aparecerá el error <strong>permiso denegado</strong>.</p>



<h2 class="wp-block-heading">Posibles problemas con proveedores VPS/Cloud tipo AWS, IONOS, DigitalOceans&#8230;</h2>



<p class="wp-block-paragraph">Si hemos seguido los pasos anteriores y aún así podemos acceder mediante contraseña normal, es posible que nuestro proveedor VPS añada configuraciones adicionales durante el arranque que prevalezcan sobre nuestros cambios.</p>



<p class="wp-block-paragraph">Por ejemplo, los servidores IONOS utilizan <strong>cloud-init</strong>, que añade configuraciones personalizadas durante el arranque que pueden anular nuestras propias modificaciones.</p>



<p class="wp-block-paragraph">Para solucionarlo, vamos hasta el directorio <strong>/etc/cloud/cloud.cfg.d/</strong>.</p>



<p class="wp-block-paragraph">Examinamos si existen archivos de configuración (con extensión .cfg) por si en alguno de ellos estuviese habilitada la opción <strong>PasswordAuthentication yes</strong>. De ser así, lo modificamos a <strong>PasswordAuthentication no</strong>.</p>



<p class="wp-block-paragraph">Reiniciamos el servicio sshd y probamos a conectar vía SSH por el método normal a ver si ahora obtenemos el permiso denegado.</p>



<p class="wp-block-paragraph">Una vez comprobamos cual es el archivo que bloquea nuestra configuración, podemos configurarlo como archivo inmutable, pues en el próximo reinicio del servidor, seguramente se vuelva regenerar con la configuración por defecto.</p>



<p class="wp-block-paragraph">Para ello aplicamos chattr +i sobre el archivo de configuración en cuestión:</p>



<pre class="wp-block-code"><code>sudo chattr +i /etc/ssh/sshd_config.d/archivo.conf </code></pre>



<p class="wp-block-paragraph">Esto hace al archivo inmutable incluso para root.</p>



<p class="wp-block-paragraph">Si tras reiniciar el servidor aún vuelve a habilitarse el acceso SSH por contraseña normal, podríamos como último recurso deshabilitar completamente el cloud-init.</p>



<pre class="wp-block-code"><code>sudo touch /etc/cloud/cloud-init.disabled</code></pre>



<p class="wp-block-paragraph">Y reniciar el servidor.</p>



<p class="wp-block-paragraph"><strong>Aviso: Procede con precaución con esta opción, pues deshabilitar cloud-init, podría romper configuraciones importantes de tu proveedor VPS que provoquen errores futuros en el servidor.</strong></p>



<p class="wp-block-paragraph">Y hasta aquí el tutorial. Espero que como a mí, te sirva de mucha utilidad y securices al máximo tus VPS. 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/iniciar-sesion-en-nuestros-vps-mediante-ssh-keys/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cerrar modales de Elementor con JavaScript (jQuery)</title>
		<link>https://danisanchez.net/cerrar-modales-de-elementor-con-javascript-jquery/</link>
					<comments>https://danisanchez.net/cerrar-modales-de-elementor-con-javascript-jquery/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Wed, 30 Apr 2025 11:21:36 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[elementor]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=14876</guid>

					<description><![CDATA[Si necesitamos cerrar un modal de Elementor con un elemento alternativo a la X por defecto, podemos añadir este fragmento de código JavaScript asociado a una clase o identificador CSS: Donde .cerrar-modal es la clase CSS asignada al elemento sobre el cual se aplicará evento click.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si necesitamos cerrar un modal de Elementor con un elemento alternativo a la <strong>X</strong> por defecto, podemos añadir este fragmento de código JavaScript asociado a una clase o identificador CSS:</p>



<pre class="wp-block-code"><code>&lt;script>
    jQuery(function($){
        $(document).on('click','.cerrar-modal', function(event){
        elementorProFrontend.modules.popup.closePopup( {}, event);
        });
    });
&lt;/script></code></pre>



<p class="wp-block-paragraph">Donde <strong>.cerrar-modal</strong> es la clase CSS asignada al elemento sobre el cual se aplicará evento click.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/cerrar-modales-de-elementor-con-javascript-jquery/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Redirección 301 para cambios de dominio</title>
		<link>https://danisanchez.net/redireccion-301-para-cambios-de-dominio/</link>
					<comments>https://danisanchez.net/redireccion-301-para-cambios-de-dominio/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Wed, 30 Apr 2025 07:35:16 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[.htaccess]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=14874</guid>

					<description><![CDATA[Acceder al archivo .htaccess del dominio antiguo y añadir al inicio: Es importante que el domino antiguo no se cancele ni se apunte a un servidor distinto.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Acceder al archivo .htaccess del dominio antiguo y añadir al inicio:</p>



<pre class="wp-block-code"><code>RewriteEngine on
RewriteCond %{HTTP_HOST} ^sitioanterior.com &#91;NC,OR]
RewriteCond %{HTTP_HOST} ^www.sitioanterior.com &#91;NC]
RewriteRule ^(.*)$ https://nuevositio.com/$1 &#91;L,R=301,NC]</code></pre>



<p class="wp-block-paragraph">Es importante que el domino antiguo no se cancele ni se apunte a un servidor distinto.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/redireccion-301-para-cambios-de-dominio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guía rápida de Flexbox</title>
		<link>https://danisanchez.net/guia-rapida-de-flexbox/</link>
					<comments>https://danisanchez.net/guia-rapida-de-flexbox/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Sun, 30 Mar 2025 09:35:15 +0000</pubDate>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[flexbox]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=13666</guid>

					<description><![CDATA[1. Contenedor básico de tipo flex con 5 elementos 2. Dirección Flex (row, column) 2.1 row (por defecto) 2.2 row-reverse 2.3 column 2.4 column-reverse 3. Filas (flex-wrap) 3.1 frex-wrap: nowrap (por defecto) Los elemenos adaptan su tamaño para caber en la fila. 3.2 flex-wrap: wrap Los elementos respetan su ancho (300px) y ocupan otra fila [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">1. Contenedor básico de tipo flex con 5 elementos</h2>



<pre class="wp-block-code"><code>&lt;div class="contenedor"&gt;
    &lt;div class="elemento"&gt;a&lt;/div&gt;
    &lt;div class="elemento"&gt;b&lt;/div&gt;
    &lt;div class="elemento"&gt;c&lt;/div&gt;
    &lt;div class="elemento"&gt;d&lt;/div&gt;
    &lt;div class="elemento"&gt;e&lt;/div&gt;
&lt;/div&gt;</code></pre>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
}

.elemento{
    width: 300px;
    padding: 30px;
    font-size: 30px;
    font-weight: bold;
    text-align: center;
    color: #666;
}

/*para elementos impares*/
.elemento:nth-child(odd){
    background-color: #000;
}

/*para elementos ppares*/
.elemento:nth-child(even){
    background-color: #fff;
}</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="886" height="542" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-01.webp" alt="" class="wp-image-13667" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-01.webp 886w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-01-300x184.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-01-768x470.webp 768w" sizes="auto, (max-width: 886px) 100vw, 886px" /></figure>



<h2 class="wp-block-heading">2. Dirección Flex (row, column)</h2>



<h3 class="wp-block-heading">2.1 <strong>row (por defecto)</strong></h3>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: row;
}</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="886" height="542" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-02.webp" alt="" class="wp-image-13673" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-02.webp 886w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-02-300x184.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-02-768x470.webp 768w" sizes="auto, (max-width: 886px) 100vw, 886px" /></figure>



<h3 class="wp-block-heading">2.2 row-reverse</h3>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: row-reverse;
}</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="964" height="546" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-04.webp" alt="" class="wp-image-13677" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-04.webp 964w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-04-300x170.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-04-768x435.webp 768w" sizes="auto, (max-width: 964px) 100vw, 964px" /></figure>



<h3 class="wp-block-heading">2.3 column</h3>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: column;
}</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="886" height="665" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-03.webp" alt="" class="wp-image-13675" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-03.webp 886w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-03-300x225.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-03-768x576.webp 768w" sizes="auto, (max-width: 886px) 100vw, 886px" /></figure>



<h3 class="wp-block-heading">2.4 column-reverse</h3>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: column-reverse;
}</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="964" height="664" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-05.webp" alt="" class="wp-image-13678" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-05.webp 964w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-05-300x207.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-05-768x529.webp 768w" sizes="auto, (max-width: 964px) 100vw, 964px" /></figure>



<h2 class="wp-block-heading">3. Filas (flex-wrap)</h2>



<pre class="wp-block-code"><code>&lt;div class="contenedor"&gt;
    &lt;div class="elemento"&gt;a&lt;/div&gt;
    &lt;div class="elemento"&gt;b&lt;/div&gt;
    &lt;div class="elemento"&gt;c&lt;/div&gt;
    &lt;div class="elemento"&gt;d&lt;/div&gt;
    &lt;div class="elemento"&gt;e&lt;/div&gt;
    &lt;div class="elemento"&gt;f&lt;/div&gt;
    &lt;div class="elemento"&gt;g&lt;/div&gt;
    &lt;div class="elemento"&gt;h&lt;/div&gt;
    &lt;div class="elemento"&gt;i&lt;/div&gt;
    &lt;div class="elemento"&gt;j&lt;/div&gt;
&lt;/div&gt;</code></pre>



<h3 class="wp-block-heading">3.1 frex-wrap: nowrap (por defecto)</h3>



<p class="wp-block-paragraph">Los elemenos adaptan su tamaño para caber en la fila.</p>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
}</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="964" height="513" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-06.webp" alt="" class="wp-image-13682" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-06.webp 964w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-06-300x160.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-06-768x409.webp 768w" sizes="auto, (max-width: 964px) 100vw, 964px" /></figure>



<h3 class="wp-block-heading">3.2 flex-wrap: wrap</h3>



<p class="wp-block-paragraph">Los elementos respetan su ancho (300px) y ocupan otra fila cuando no caben.</p>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="333" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-1024x333.webp" alt="" class="wp-image-13683" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-1024x333.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-300x98.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-768x250.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-1536x499.webp 1536w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07.webp 1578w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">3.3 flex-wrap: wrap-reverse</h3>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-direction: row;
    flex-wrap: wrap-reverse;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="333" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-1024x333.webp" alt="" class="wp-image-13686" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-1024x333.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-300x98.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-768x250.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-1536x499.webp 1536w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08.webp 1578w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">3.4 flex-flow</h3>



<p class="wp-block-paragraph">Agrupa flex-direction y flex-flow en una única propiedad.</p>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="333" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-1024x333.webp" alt="" class="wp-image-13683" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-1024x333.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-300x98.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-768x250.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07-1536x499.webp 1536w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-07.webp 1578w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap-reverse;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="333" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-1024x333.webp" alt="" class="wp-image-13686" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-1024x333.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-300x98.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-768x250.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08-1536x499.webp 1536w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-08.webp 1578w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: column wrap;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="915" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-09-1024x915.webp" alt="" class="wp-image-13690" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-09-1024x915.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-09-300x268.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-09-768x687.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-09.webp 1169w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: column wrap-reverse;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="915" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-10-1024x915.webp" alt="" class="wp-image-13691" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-10-1024x915.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-10-300x268.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-10-768x687.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-10.webp 1169w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">4. Alineación</h2>



<h3 class="wp-block-heading">4.1 justify-content</h3>



<h4 class="wp-block-heading">4.1.1 justify-content: start</h4>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
    background-color:#666666;
    height: 500px;
    justify-content: start;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="636" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-13-1024x636.webp" alt="" class="wp-image-13733" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-13-1024x636.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-13-300x186.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-13-768x477.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-13.webp 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">4.1.2 justify-content: center</h4>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
    background-color:#666666;
    height: 500px;
    justify-content: center;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="636" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-11-1024x636.webp" alt="" class="wp-image-13729" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-11-1024x636.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-11-300x186.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-11-768x477.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-11.webp 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">4.1.3 justify-content: end</h4>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
    background-color:#666666;
    height: 500px;
    justify-content: end;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="636" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-12-1024x636.webp" alt="" class="wp-image-13731" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-12-1024x636.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-12-300x186.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-12-768x477.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-12.webp 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">4.1.4 justify-content: space-around</h4>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
    background-color:#666666;
    height: 500px;
    justify-content: space-around;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="636" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-14-1024x636.webp" alt="" class="wp-image-13736" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-14-1024x636.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-14-300x186.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-14-768x477.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-14.webp 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">4.1.5 justify-content: space-between</h4>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
    background-color:#666666;
    height: 500px;
    justify-content: space-between;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="636" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-15-1024x636.webp" alt="" class="wp-image-13738" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-15-1024x636.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-15-300x186.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-15-768x477.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-15.webp 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">4.1.6 justify-content: space-evenly</h4>



<pre class="wp-block-code"><code>.contenedor{
    display: flex;
    flex-flow: row wrap;
    background-color:#666666;
    height: 500px;
    justify-content: space-evenly;
}</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="636" src="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-17-1024x636.webp" alt="" class="wp-image-13740" srcset="https://danisanchez.net/wp-content/uploads/2023/01/flexbox-17-1024x636.webp 1024w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-17-300x186.webp 300w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-17-768x477.webp 768w, https://danisanchez.net/wp-content/uploads/2023/01/flexbox-17.webp 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Continuará&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/guia-rapida-de-flexbox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
