<?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/tag/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>https://danisanchez.net</link>
	<description></description>
	<lastBuildDate>Fri, 29 Aug 2025 18:44:45 +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>Cómo optimizo imágenes sin usar editores de imágenes</title>
		<link>https://danisanchez.net/como-optimizo-imagenes-sin-usar-editores-de-imagenes/</link>
					<comments>https://danisanchez.net/como-optimizo-imagenes-sin-usar-editores-de-imagenes/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Fri, 29 Aug 2025 18:44:45 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutoriales]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=15093</guid>

					<description><![CDATA[Lo primero que hago cuando voy a empezar un nuevo montaje o maquetación web es preparar las imágenes. Las descargo de Figma, Adobe XD&#8230; o cualquiera que sea la fuente que me proporcionan. Una vez descargadas las organizo en carpetas con el nombre de la página, post o producto al que pertenezcan. Al principio las [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Lo primero que hago cuando voy a empezar un nuevo montaje o maquetación web es preparar las imágenes. Las descargo de Figma, Adobe XD&#8230; o cualquiera que sea la fuente que me proporcionan.</p>



<p class="wp-block-paragraph">Una vez descargadas las organizo en carpetas con el nombre de la página, post o producto al que pertenezcan.</p>



<p class="wp-block-paragraph">Al principio las optimizaba una a una con <a href="https://www.gimp.org/" target="_blank" rel="noreferrer noopener">GIMP</a>. Escalar y exportar a webp con compresión del 85% . También aprovechaba en la exportacion para limpiar el nombre del archivo (quitar tildes, «eñes», caracteres especiales&#8230;</p>



<p class="wp-block-paragraph">En proyectos con varias decenas de imágenes es una tarea que lleva más del tiempo del necesario. </p>



<p class="wp-block-paragraph">Desde hace tiempo ya no uso GIMP para optimizar las imagenes, sino <a href="https://imagemagick.org/" target="_blank" rel="noreferrer noopener">ImageMagick</a>, un conjunto de comandos que permite convertir formatos, reescalar, comprimir (y más cosas) en lotes desde el terminal de Linux.</p>



<p class="wp-block-paragraph">Lo primero que hago es situarme en el directorio y convertir a webp:</p>



<pre class="wp-block-code"><code>mogrify -format webp *.jpg
mogrify -format webp *.png</code></pre>



<p class="wp-block-paragraph">Elimino los archivos JPG o PNG:</p>



<pre class="wp-block-code"><code>rm *.jpg
rm *.png</code></pre>



<p class="wp-block-paragraph">Si algunas imágenes son demasiado grandes para web, las separo y las reescalo a un ancho máximo (en WordPress 2560px):</p>



<pre class="wp-block-code"><code>mogrify -resize 2560 *.webp</code></pre>



<p class="wp-block-paragraph">Por último aplico la compresión:</p>



<pre class="wp-block-code"><code>mogrify -quality 85 *.webp</code></pre>



<p class="wp-block-paragraph">Y nada más, en menos de un minuto he convertido, reescalado y comprimido todas las imágenes de un directorio.</p>



<p class="wp-block-paragraph">Ahora solo faltaba limpiar el nombre, esto aún lo seguía haciendo a mano, hasta hoy&#8230;</p>



<p class="wp-block-paragraph">Ya que uso Linux me pregunto, ¿y si creo un script en BASH que limpie los nombres de archivo de un directorio completo?</p>



<p class="wp-block-paragraph">Aquí me ayudó DeepSeek, empezó generando un pequeño script en BASH para quitar las tildes de los nombres de archivo.</p>



<p class="wp-block-paragraph">Pero seguí añadiendo cosas y al final tengo un script que limpia los nombres con todo lo que necesito:</p>



<ul class="wp-block-list">
<li>Elimina tildes.</li>



<li>Cambia <em>eñes</em> por <em>enes</em>.</li>



<li>Elimina cualquier caracter especial.</li>



<li>Sustituye los espacios por guiones bajos.</li>
</ul>



<p class="wp-block-paragraph">Y este es el script completo:</p>



<pre class="wp-block-code"><code>limpiar-nombres() {
    local DIRECTORIO="${1:-.}"
    
    if &#91; ! -d "$DIRECTORIO" ]; then
        echo "&#x274c; Error: El directorio '$DIRECTORIO' no existe."
        return 1
    fi
    
    echo "&#x1f504; Limpiando nombres de archivos en: $DIRECTORIO"
    echo "&#x1f4dd; Caracteres que se eliminarán/reemplazarán:"
    echo "   - Tildes (á, é, í, ó, ú, ñ)"
    echo "   - Caracteres especiales (@, #, $, %, &amp;, *, !, ¿, ?, ¡)"
    echo "   - Espacios (reemplazados por _)"
    echo "   - Paréntesis, corchetes, llaves"
    echo "   - Comillas y apóstrofes"
    local contador=0
    
    # Usar find para manejar mejor archivos con espacios
    find "$DIRECTORIO" -maxdepth 1 -type f -print0 | while IFS= read -r -d '' archivo; do
        local nombre_original=$(basename "$archivo")
        local directorio=$(dirname "$archivo")
        
        local nuevo_nombre=$(echo "$nombre_original" | sed -e '
            # Reemplazar tildes y ñ
            y/áàäâÁÀÄÂ/aaaaAAAA/
            y/éèëêÉÈËÊ/eeeeEEEE/
            y/íìïîÍÌÏÎ/iiiiIIII/
            y/óòöôÓÒÖÔ/ooooOOOO/
            y/úùüûÚÙÜÛ/uuuuUUUU/
            y/ñÑ/nN/
            
            # Eliminar caracteres especiales
            s/&#91;@#%&amp;*¿?¡!$]//g
            
            # Eliminar paréntesis, corchetes, llaves
            s/&#91;()\&#91;\]{}]//g
            
            # Eliminar comillas y apóstrofes
            s/&#91;'\''"`]//g
            
            # Reemplazar espacios por guiones bajos
            s/ /_/g
            
            # Reemplazar múltiples guiones bajos por uno solo
            s/__+/_/g
            
            # Eliminar guiones bajos al inicio y final
            s/^_//
            s/_$//
        ')
        
        if &#91; "$nombre_original" != "$nuevo_nombre" ]; then
            echo "&#x1f4c1; Renombrando: \"$nombre_original\" -> \"$nuevo_nombre\""
            mv -- "$archivo" "$directorio/$nuevo_nombre"
            ((contador++))
        fi
    done
    
    echo "&#x2705; Proceso completado. Se renombraron $contador archivos."
    
    if &#91; $contador -eq 0 ]; then
        echo "&#x1f4a1; No se encontraron archivos que necesiten renombrarse."
    fi
}

# Alias para uso rápido
alias lnombres='limpiar-nombres'
alias limpiar-archivos='limpiar-nombres'</code></pre>



<p class="wp-block-paragraph">Añadiendo el script al archivo ~/.bashrc o ~/.zshrc (en mi caso uso ZSH) podremos usarlo en cualquier directorio sin necesidad de tener el script.sh dentro.</p>



<pre class="wp-block-code"><code>/home/user/Descargas/Fotos/limpiar-nombres</code></pre>



<p class="wp-block-paragraph">Ahora que se habla tanto de productividad, tanto Linux como la terminal, cada día mejoran la mía.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/como-optimizo-imagenes-sin-usar-editores-de-imagenes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tutorial básico Kdenlive, el editor de vídeo libre de la comunidad KDE</title>
		<link>https://danisanchez.net/tutorial-basico-kdenlive-el-editor-de-video-libre-de-la-comunidad-kde/</link>
					<comments>https://danisanchez.net/tutorial-basico-kdenlive-el-editor-de-video-libre-de-la-comunidad-kde/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Tue, 11 Aug 2020 12:25:08 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[kdenlive]]></category>
		<category><![CDATA[publicaciones]]></category>
		<category><![CDATA[tutoriales]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=6892</guid>

					<description><![CDATA[Una de las joyas de la corona de la comunidad KDE es su editor de vídeo no linear Kdenlive, que con cada nueva actualización crece y mejora hasta situarse a la altura de otras soluciones comerciales. Kdenlive es la aplicación con la que edito todos mis vídeos de Youtube desde que en Febrero de 2018 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Una de las joyas de la corona de la comunidad KDE es su editor de vídeo no linear <strong>Kdenlive</strong>, que con cada nueva actualización crece y mejora hasta situarse a la altura de otras soluciones comerciales.</p>



<p class="wp-block-paragraph">Kdenlive es la aplicación con la que edito todos mis vídeos de Youtube desde que en Febrero de 2018 me pasé completamente a GNU/Linux. </p>



<iframe src="https://www.youtube-nocookie.com/embed/awmpcr7ZaCY" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" width="100%" height="315" frameborder="0"></iframe>



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



<p class="wp-block-paragraph">No soy ningún experto en edición de vídeo, ni siquiera aficionado, pero creo que con lo aprendido hasta ahora puedo facilitarle el camino a alguien que necesite, como yo, <strong>editar vídeos sencillos</strong>, añadir audios, crear transiciones, cortar silencios, pegar pistas, exportar en un formato adecuado, etc.</p>



<p class="wp-block-paragraph">Es el tutorial que yo hubiese querido tener cuando empecé a «cacharrear» con el editor y que me llevó a consultar en numerosos blogs y videotutoriales para cada herramienta o efecto que necesitaba aplicar.</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 width="100%" height="315" src="https://www.youtube-nocookie.com/embed/6RahOEyvz70" 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>



<h2 class="wp-block-heading">Cómo conseguir Kdenlive</h2>



<p class="wp-block-paragraph">Kdenlive es multiplataforma, tienes instaladores tanto para GNU/Linux, Windows o Mac OS. Aunque en este artículo nos centraremos en las versiones para GNU/Linux.</p>



<p class="wp-block-paragraph">La mejor forma de tener Kdenlive es usar una distribucion GNU/Linux con <strong>entorno de escritorio KDE Plasma</strong>, pues este integra todas las librerías necesarias para hacer funcionar las versiones más recientes del editor. </p>



<p class="wp-block-paragraph">También es conveniente que la distribución no sea muy conservadora (como Debian), ya que Kdenlive tuvo una importante actualización a partir de la versión 19 (en el momento de escribir este artículo está en su versión 20.04), mejorando considerablemente la experiencia con la línea de tiempo y la estabilidad general de la aplicación. <strong>Algunas distros como Debian 10 KDE o Kubuntu 18.04 aún conservan en sus repositorios la versión anterior</strong>.</p>



<p class="wp-block-paragraph">Si no usas Plasma, la mejor recomendación es que instales Kdenlive desde;</p>



<ul class="wp-block-list"><li><strong>Snap</strong> para Ubuntu y derivadas.</li><li><strong>Flatpak</strong> o <strong>AppImage</strong> para cualquier otra distro.</li></ul>



<h3 class="wp-block-heading">Descargar Kdenlive desde su web oficial como APPImage</h3>



<figure class="wp-block-image size-large"><a href="https://kdenlive.org/es/descargar/" target="_blank" rel="noopener noreferrer"><img decoding="async" src="https://danisanchez.net/wp-content/uploads/2020/08/01-kdenlive-descargas-1024x279.jpg" alt="Opciones de descarga Kdenlive" class="wp-image-6893" title="Opciones de descarga Kdenlive"/></a></figure>



<h3 class="wp-block-heading">Descargar Kdenlive desde FlatHub como Flatpak</h3>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="https://flathub.org/apps/details/org.kde.kdenlive" target="_blank" rel="noopener noreferrer"><img decoding="async" src="https://danisanchez.net/wp-content/uploads/2020/08/02.kdenlive-flatpak.jpg" alt="" class="wp-image-6894"/></a></figure></div>



<h2 class="wp-block-heading">Interfaz de Kdenlive</h2>



<p class="wp-block-paragraph">Podemos dividir la interfaz de Kdenlive en 5 grupos principales:</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://danisanchez.net/wp-content/uploads/2020/08/03.kdenlive-interfaz-1024x553.jpg" alt="Interfaz de Kdenlive" class="wp-image-6896" title="Interfaz de Kdenlive"/></figure>



<ul class="wp-block-list"><li><strong>Recursos del proyecto</strong>: Vídeos, audios e imágenes que compondrán el montaje.</li><li><strong>Efectos activos:</strong> Efectos aplicados a las pistas. Desde aquí se pueden configurar sus parámetros.</li><li><strong>Librería de efectos: </strong>Efectos disponibles tanto de imagen como de audio.</li><li><strong>Previsualización:</strong> Podemos ver en tiempo real los cambios aplicados antes de renderizar el vídeo final.</li><li><strong>Línea de tiempo:</strong> Donde añadimos las pistas de vídeo y audio, aplicamos los efectos, cortamos, pegamos, etc.</li></ul>



<h2 class="wp-block-heading">Lo primero al empezar un nuevo proyecto</h2>



<p class="wp-block-paragraph">La ventana de diálogo al crear un nuevo proyecto nos preguntará la <strong>resolución</strong> y <strong>tasa de FPS</strong> (fotogramas por segundo) que vamos a necesitar. También nos permite definir el número de pistas de video y de audio con los que se iniciará el proyecto.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="733" height="613" src="https://danisanchez.net/wp-content/uploads/2020/08/04-kdenlive-opciones-nuevo-proyecto.jpg" alt="Kdenlive, opciones nuevo proyecto" class="wp-image-8980" srcset="https://danisanchez.net/wp-content/uploads/2020/08/04-kdenlive-opciones-nuevo-proyecto.jpg 733w, https://danisanchez.net/wp-content/uploads/2020/08/04-kdenlive-opciones-nuevo-proyecto-300x251.jpg 300w" sizes="(max-width: 733px) 100vw, 733px" /></figure>



<p class="wp-block-paragraph">Lo ideal es escoger la misma resolución y tasa de fotogramas que la fuente de vídeo original. Si la fuente original tiene una resolución de 1280&#215;720 y hacemos el proyecto a 1920&#215;1080, seguramente la imagen acabe pixelada o borrosa. Del mismo modo, si la fuente original está grabada a 24 FPS y configuramos el proyecto a 60 FPS, el resultado final se seguirá viendo a 24 FPS.</p>



<h2 class="wp-block-heading">Añadir recursos al proyecto</h2>



<p class="wp-block-paragraph">Ahora que ya hemos definido la configuración inicial vamos a añadir los fragmentos de vídeo, audio e imágenes que formarán el montaje final.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="460" height="530" src="https://danisanchez.net/wp-content/uploads/2020/08/05-kdenlive-anadir-recursos.jpg" alt="Kdenlive - Añadir recursos al proyecto" class="wp-image-8982" srcset="https://danisanchez.net/wp-content/uploads/2020/08/05-kdenlive-anadir-recursos.jpg 460w, https://danisanchez.net/wp-content/uploads/2020/08/05-kdenlive-anadir-recursos-260x300.jpg 260w" sizes="auto, (max-width: 460px) 100vw, 460px" /></figure></div>



<p class="wp-block-paragraph">Para este proyecto he añadido <strong>dos clips de vídeo</strong> y <strong>dos clips de audio</strong>, que son los audios originales de los clips de vídeo pero procesados por separado con <a rel="noreferrer noopener" href="https://www.audacityteam.org/" target="_blank">Audacity</a> para mejorar la ecualización y ganancia.</p>



<p class="wp-block-paragraph">Entonces el objetivo es, silenciar el audio incrustado en el vídeo y sustituirlo por el audio procesado.</p>



<p class="wp-block-paragraph">Para ello arrastramos el primer clip de vídeo hacia una de las pistas de vídeo:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="914" height="870" src="https://danisanchez.net/wp-content/uploads/2020/08/06-kdenlive-insertar-pista.jpg" alt="" class="wp-image-8984" srcset="https://danisanchez.net/wp-content/uploads/2020/08/06-kdenlive-insertar-pista.jpg 914w, https://danisanchez.net/wp-content/uploads/2020/08/06-kdenlive-insertar-pista-300x286.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/08/06-kdenlive-insertar-pista-768x731.jpg 768w" sizes="auto, (max-width: 914px) 100vw, 914px" /></figure>



<p class="wp-block-paragraph">Automáticamente se rellena una de las pistas de audio, debido al audio que ya hay incrustado en el clip de vídeo. Así que prodecemos a silenciarlo.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="714" height="289" src="https://danisanchez.net/wp-content/uploads/2020/08/07-kdenlive-silenciar-pista.jpg" alt="Kdenlive, silenciar pista" class="wp-image-8985" srcset="https://danisanchez.net/wp-content/uploads/2020/08/07-kdenlive-silenciar-pista.jpg 714w, https://danisanchez.net/wp-content/uploads/2020/08/07-kdenlive-silenciar-pista-300x121.jpg 300w" sizes="auto, (max-width: 714px) 100vw, 714px" /></figure>



<p class="wp-block-paragraph">Ahora arrastramos el clip de audio procesado a la siguiente pista de audio:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="881" height="875" src="https://danisanchez.net/wp-content/uploads/2020/08/08-kdenlive-insertar-pista-audio.jpg" alt="Kdenlive, añadir clip de audio" class="wp-image-8986" srcset="https://danisanchez.net/wp-content/uploads/2020/08/08-kdenlive-insertar-pista-audio.jpg 881w, https://danisanchez.net/wp-content/uploads/2020/08/08-kdenlive-insertar-pista-audio-300x298.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/08/08-kdenlive-insertar-pista-audio-150x150.jpg 150w, https://danisanchez.net/wp-content/uploads/2020/08/08-kdenlive-insertar-pista-audio-768x763.jpg 768w" sizes="auto, (max-width: 881px) 100vw, 881px" /></figure>



<h2 class="wp-block-heading">Edición de pistas</h2>



<p class="wp-block-paragraph">Una de las tareas más comunes a la hora de editar un vídeo es la de eliminar silencios o fragmentos que han quedado mal. Para ello vamos a estar haciendo un uso frecuente de la herramienta de Corte así que mejor nos vamos quedando con su atajo de teclado (X):</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="148" height="40" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-1.png" alt="" class="wp-image-8989"/></figure></div>



<p class="wp-block-paragraph">Vamos a localizar fragmentos de silencio, son fácil de detectar si nos fijamos en la onda de la pista de audio. Para ayudarnos podemos hacer zoom en la línea de tiempo con el deslizador o pulsando Ctrl + rueda del ratón.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="444" src="https://danisanchez.net/wp-content/uploads/2020/08/09-kdenlive-aplicar-zoom-pista-1024x444.jpg" alt="Kdenlive, aplicar zoom a la línea de tiempo" class="wp-image-8990" srcset="https://danisanchez.net/wp-content/uploads/2020/08/09-kdenlive-aplicar-zoom-pista-1024x444.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/08/09-kdenlive-aplicar-zoom-pista-300x130.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/08/09-kdenlive-aplicar-zoom-pista-768x333.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/08/09-kdenlive-aplicar-zoom-pista.jpg 1070w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">A la hora de hacer un corte en una pista, debemos tener en cuenta que <strong>estamos trabajando con 2 pistas independientes</strong> (vídeo y audio) y si aplicamos el recorte solamente a la pista de video, el audio se desincronizará.</p>



<p class="wp-block-paragraph">En estos casos lo ideal es agrupar ambas pistas para que el corte se aplique a las dos a la vez en el mismo fotograma y tiempo. Para ello vamos a hacer uso de la <strong>herramienta de Selección (S)</strong>, pinchamos en la pista de vídeo, mantenemos pulsada la tecla SHIFT y pinchamos en la pista de audio para seleccionar ambas:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="931" height="329" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-2.png" alt="" class="wp-image-8991" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-2.png 931w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-2-300x106.png 300w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-2-768x271.png 768w" sizes="auto, (max-width: 931px) 100vw, 931px" /></figure>



<p class="wp-block-paragraph">Con las pistas seleccionadas, hacemos <strong>Clic Derecho &#8211; Agrupar Clips</strong> o el atajo de teclado <strong>Ctrl + G</strong>. Ahora el corte que apliquemos en el clip de vídeo, cortará también en el clip de audio.</p>



<p class="wp-block-paragraph">Vamos a posicionarnos en el silencio y hacemos un corte al principio y otro corte al final.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="515" height="325" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-3.png" alt="Kdenlive, cortar pista" class="wp-image-8992" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-3.png 515w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-3-300x189.png 300w" sizes="auto, (max-width: 515px) 100vw, 515px" /></figure></div>



<p class="wp-block-paragraph">Ahora podemos eliminar el trozo seleccionado con <strong>Clic Derecho &#8211; Borrar elemento seleccionado</strong>, o simplemente pulsando la tecla <strong>Supr</strong> (<em>¿a que los atajos de teclado son más rápidos y cómodos?</em>)</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="488" height="300" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-4.png" alt="Kdenlive, eliminar fragmento de pista" class="wp-image-8993" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-4.png 488w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-4-300x184.png 300w" sizes="auto, (max-width: 488px) 100vw, 488px" /></figure></div>



<p class="wp-block-paragraph">Ahora podemos arrastrar la pista derecha y unirla con la izquierda para que no se note el corte.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="434" height="278" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-5.png" alt="Kdenlive, arrastrar pistas" class="wp-image-8994" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-5.png 434w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-5-300x192.png 300w" sizes="auto, (max-width: 434px) 100vw, 434px" /></figure></div>



<h2 class="wp-block-heading">Transiciones entre pistas</h2>



<p class="wp-block-paragraph">Cuando tenemos varios clips de vídeo para el montaje final, una práctica habitual es la de hacer transiciones entre clips.</p>



<p class="wp-block-paragraph">Primero añadimos el segundo clip a la pista de video a continuación del que ya hemos editado:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="848" height="871" src="https://danisanchez.net/wp-content/uploads/2020/08/10-kdenlive-anadir-pistas-consecutivas.jpg" alt="Kdenlive, añadir pistas a la línea de tiempo" class="wp-image-8995" srcset="https://danisanchez.net/wp-content/uploads/2020/08/10-kdenlive-anadir-pistas-consecutivas.jpg 848w, https://danisanchez.net/wp-content/uploads/2020/08/10-kdenlive-anadir-pistas-consecutivas-292x300.jpg 292w, https://danisanchez.net/wp-content/uploads/2020/08/10-kdenlive-anadir-pistas-consecutivas-768x789.jpg 768w" sizes="auto, (max-width: 848px) 100vw, 848px" /></figure>



<p class="wp-block-paragraph">Y lo arrastramos para unirlo:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="601" height="285" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-6.png" alt="" class="wp-image-8996" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-6.png 601w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-6-300x142.png 300w" sizes="auto, (max-width: 601px) 100vw, 601px" /></figure>



<p class="wp-block-paragraph">Para realizar la transición, vamos a aplicar un efecto de fundido tanto al final del clip anterior, como al principio del nuevo clip.</p>



<p class="wp-block-paragraph">Buscamos en la zona de efectos: <strong>Fundido saliente</strong>:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="637" height="516" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-7.png" alt="" class="wp-image-8997" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-7.png 637w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-7-300x243.png 300w" sizes="auto, (max-width: 637px) 100vw, 637px" /></figure>



<p class="wp-block-paragraph">Y lo arrastramos en el final del clip anterior:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="933" height="868" src="https://danisanchez.net/wp-content/uploads/2020/08/arrastrar-efecto-fundido-saliente.gif" alt="Kdenlive - Arrastrar efecto hacia clip" class="wp-image-8998"/></figure>



<p class="wp-block-paragraph">Si seleccionamos la pista en la que hemos aplicado el efecto, veremos sus propiedades en la <strong>zona de efectos activos</strong> (recordar que en esta zona aparecen todos los efectos aplicados al clip seleccionado):</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="467" height="187" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-8.png" alt="" class="wp-image-9000" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-8.png 467w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-8-300x120.png 300w" sizes="auto, (max-width: 467px) 100vw, 467px" /></figure></div>



<p class="wp-block-paragraph">Por defecto, el fundido saliente tiene una duración de 3 segundos, vamos a reducirlo a 1 segundo para que la transición sea más rápida.</p>



<p class="wp-block-paragraph">Ahora vamos a localizar el efecto <strong>Fundido entrante</strong> y lo arrastramos al inicio del nuevo clip:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="845" src="https://danisanchez.net/wp-content/uploads/2020/08/arrastrar-efecto-fundido-entrante-1024x845.gif" alt="" class="wp-image-9001" srcset="https://danisanchez.net/wp-content/uploads/2020/08/arrastrar-efecto-fundido-entrante-1024x845.gif 1024w, https://danisanchez.net/wp-content/uploads/2020/08/arrastrar-efecto-fundido-entrante-300x248.gif 300w, https://danisanchez.net/wp-content/uploads/2020/08/arrastrar-efecto-fundido-entrante-768x634.gif 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></div>



<p class="wp-block-paragraph">Al igual que con el fundido saliente, vamos a reducir su duración a 1 segundo:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="467" height="194" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-9.png" alt="" class="wp-image-9003" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-9.png 467w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-9-300x125.png 300w" sizes="auto, (max-width: 467px) 100vw, 467px" /></figure></div>



<p class="wp-block-paragraph">Y ya tenemos terminada la transición:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="809" height="814" src="https://danisanchez.net/wp-content/uploads/2020/08/efecto-transicion.gif" alt="Kdenlive - Efecto transición" class="wp-image-9007"/></figure>



<h2 class="wp-block-heading">Añadir música de fondo</h2>



<p class="wp-block-paragraph">Si queremos añadir una música de fondo para amenizar el vídeo, podemos añadir una nueva pista de audio. Para ello vamos al <strong>Menú &#8211; Línea de Tiempo &#8211; Pistas &#8211; Insertar Pista</strong>.</p>



<p class="wp-block-paragraph">O también podemos posicionarnos sobre una pista existente y <strong>Clic Derecho &#8211; Insertar Pista</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="591" height="206" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-10.png" alt="Kdenlive - Insertar pista" class="wp-image-9009" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-10.png 591w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-10-300x105.png 300w" sizes="auto, (max-width: 591px) 100vw, 591px" /></figure>



<p class="wp-block-paragraph">Seleccionamos pista de audio y la posicionamos a continuación.</p>



<p class="wp-block-paragraph">Agregamos el audio musical a los recursos del proyecto y lo arrastramos a su nueva pista:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="792" height="925" src="https://danisanchez.net/wp-content/uploads/2020/08/11-kdenlive-arrastrar-clip-pista.jpg" alt="Kdenlive - Arrastrar clip a línea de tiempo" class="wp-image-9010" srcset="https://danisanchez.net/wp-content/uploads/2020/08/11-kdenlive-arrastrar-clip-pista.jpg 792w, https://danisanchez.net/wp-content/uploads/2020/08/11-kdenlive-arrastrar-clip-pista-257x300.jpg 257w, https://danisanchez.net/wp-content/uploads/2020/08/11-kdenlive-arrastrar-clip-pista-768x897.jpg 768w" sizes="auto, (max-width: 792px) 100vw, 792px" /></figure>



<p class="wp-block-paragraph">Cuando tenemos varias pistas de audio, seguramente necesitemos ajustar los volúmenes para que la pista de música no destaque sobre la pista de voz. Para ello podemos lanzar el <strong>panel mezclador</strong>.</p>



<h3 class="wp-block-heading">Ajustar volúmenes de pistas</h3>



<p class="wp-block-paragraph">Para lanzar el panel mezclador, nos dirigimos al <strong>Menú &#8211; Ver &#8211; Mezclador de Audio</strong>:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="381" height="541" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-11.png" alt="" class="wp-image-9011" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-11.png 381w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-11-211x300.png 211w" sizes="auto, (max-width: 381px) 100vw, 381px" /></figure></div>



<p class="wp-block-paragraph">En él veremos las 4 pistas principales de audio:</p>



<ul class="wp-block-list"><li>La primera que está silenciada (audio del vídeo original).</li><li>La segunda con el audio procesado.</li><li>La tercera con la música de fondo.</li><li>La cuarta que es la pista maestra y afecta a todas.</li></ul>



<p class="wp-block-paragraph">Podemos jugar con los deslizadores, bajando o subiendo el volumen de cada pista hasta dejarlo como deseamos (sin pasarse con los volúmenes altos para evitar distorsiones).</p>



<h2 class="wp-block-heading">Exportar el resultado final</h2>



<p class="wp-block-paragraph">Una vez que hemos terminado de editar las pistas, llega el momento de exportar el trabajo final. Para ello vamos a darle al botón rojo <strong>Procesar</strong>, donde nos va a pedir:</p>



<ul class="wp-block-list"><li>Ruta de la exportación.</li><li>Formato de vídeo final.</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="846" height="773" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-12.png" alt="" class="wp-image-9013" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-12.png 846w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-12-300x274.png 300w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-12-768x702.png 768w" sizes="auto, (max-width: 846px) 100vw, 846px" /></figure>



<p class="wp-block-paragraph">A mí me gusta el formato <strong>WebM</strong>, es un formato de vídeo líbre y está pensado sobre todo para el vídeo streaming (es un buen formato para Youtube, Vimeo y generalmente cualquier plataforma de video-streaming). Pero si lo necesitas, también puedes exportar en formato MP4 o MPEG.</p>



<p class="wp-block-paragraph">Llegados a este punto tendremos dos opciones: <strong>Procesar a un archivo</strong> directamente o <strong>generar un script</strong>.</p>



<p class="wp-block-paragraph">Si solo tenemos que exportar un único video (proyecto), podemos <strong>procesar a un archivo </strong>directamente. Normalmente el tiempo de exportado (renderizado) dependerá de la duración del proyecto, de los efectos aplicados y de la conversión o reescalado (si tiene que procesar la resolución de la fuente original a una nueva) y por supuesto, de la capacidad de tu CPU.</p>



<p class="wp-block-paragraph">Para el tipo de vídeos que yo suelo montar, el tiempo de renderizado suele ser de un 80-90% de la duración del proyecto final, porque no suelo usar muchos efectos ni reescalados. Pero hay proyectos que pueden tardar incluso un 200% o 300% de la duración del proyecto.</p>



<p class="wp-block-paragraph"><strong>¿Y para qué sirve lo de Generar Script?</strong></p>



<p class="wp-block-paragraph">Esto es un «puntazo» en Kdenlive. Imagina que tienes que editar 10 vídeos independientes y renderizarlos uno a uno. Teniendo en cuenta que el renderizado merma considerablemente los recursos de la máquina, estarás perdiendo un tiempo precioso en realizar otras tareas.</p>



<p class="wp-block-paragraph">¿Pero y si pudieras editar los vídeos y renderizarlos todos de una vez? Podrías escoger un momento del día en el que no estés usando el equipo para hacer este trabajo.</p>



<p class="wp-block-paragraph">En este caso, en lugar de procesar a un archivo, <strong>genera un script </strong>el cual se quedará en Kdenlive esperando a que lo actives.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="731" height="284" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-13.png" alt="" class="wp-image-9015" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-13.png 731w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-13-300x117.png 300w" sizes="auto, (max-width: 731px) 100vw, 731px" /></figure>



<p class="wp-block-paragraph">Ahora podrías abrir el siguiente proyecto a renderizar y generar un nuevo script, el cual se añadirá a la cola:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="721" height="672" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-14.png" alt="" class="wp-image-9016" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-14.png 721w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-14-300x280.png 300w" sizes="auto, (max-width: 721px) 100vw, 721px" /></figure>



<p class="wp-block-paragraph">Cuando tengas todos los scripts generados, puedes iniciarlos de uno en uno, los cuales se irán yendo a la Cola de Tareas:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="726" height="462" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-15.png" alt="" class="wp-image-9017" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-15.png 726w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-15-300x191.png 300w" sizes="auto, (max-width: 726px) 100vw, 726px" /></figure>



<p class="wp-block-paragraph">Y lo mejor es que en la Cola de Tareas puedes marcar que se apague el equipo cuando termine de renderizar el último vídeo:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="720" height="464" src="https://danisanchez.net/wp-content/uploads/2020/08/imagen-16.png" alt="" class="wp-image-9018" srcset="https://danisanchez.net/wp-content/uploads/2020/08/imagen-16.png 720w, https://danisanchez.net/wp-content/uploads/2020/08/imagen-16-300x193.png 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph">Bien, con esta pequeña guía y un poco de tu parte para seguir explorando y probando, creo que puedes hacerte rápidamente con este excelente editor de vídeo.</p>



<p class="wp-block-paragraph"><em>Me reservo para un siguiente artículo, cómo generar fácilmente pases de diapositivas partiendo de un directorio de imágenes, y además aplicar interesantes efectos de paneo y zoom, de forma muy sencilla.</em></p>



<p class="wp-block-paragraph">Un saludo 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/tutorial-basico-kdenlive-el-editor-de-video-libre-de-la-comunidad-kde/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Calcular rutas con OpenStreetMap partiendo de la geolocalización del usuario</title>
		<link>https://danisanchez.net/calcular-rutas-con-openstreetmap-partiendo-de-la-geolocalizacion-del-usuario/</link>
					<comments>https://danisanchez.net/calcular-rutas-con-openstreetmap-partiendo-de-la-geolocalizacion-del-usuario/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 16 Jan 2020 09:46:15 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[programación web]]></category>
		<category><![CDATA[tutoriales]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=6448</guid>

					<description><![CDATA[Hace unos días veíamos los conceptos básicos para integrar OpenStreetMap en nuestras aplicaciones web. Hoy vamos a ir un paso más allá y veremos un ejemplo de cómo calcular rutas partiendo de la geolocalización del usuario hasta el punto destino que estará predefinido (por ejemplo, nuestro negocio, un punto de interés, etc.). Lo primero, debemos [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hace unos días veíamos los conceptos básicos para <a href="https://danisanchez.net/integra-openstreetmap-en-tus-aplicaciones-web-con-leaflet-y-mapbox/" target="_blank" rel="noreferrer noopener" aria-label="integrar OpenStreetMap (opens in a new tab)">integrar OpenStreetMap</a> en nuestras aplicaciones web.</p>



<p class="wp-block-paragraph">Hoy vamos a ir un paso más allá y veremos un ejemplo de cómo calcular rutas partiendo de la geolocalización del usuario hasta el punto destino que estará predefinido (por ejemplo, nuestro negocio, un punto de interés, etc.).</p>



<p class="wp-block-paragraph">Lo primero, debemos agregar un nuevo plugin que se encargará de realizar los cálculos de ruta y dibujar el trazado: <a href="https://www.liedman.net/leaflet-routing-machine/"><strong>Leaflet Routing Machine</strong></a>.</p>



<p class="wp-block-paragraph">Este sería el código base de nuestra página HTML, con las llamadas tanto a las librerías de Leaflet como a las de Routing Machine.</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.2.0/dist/leaflet.css" />
    &lt;link rel="stylesheet" href="https://unpkg.com/leaflet-routing-machine@latest/dist/leaflet-routing-machine.css" />
    &lt;script src="https://unpkg.com/leaflet@1.2.0/dist/leaflet.js">&lt;/script>
    &lt;script src="https://unpkg.com/leaflet-routing-machine@latest/dist/leaflet-routing-machine.js">&lt;/script>
    &lt;title>Calcular rutas&lt;/title>
    &lt;style>
        #mapa{
            height: 600px;
        }
    &lt;/style>
&lt;/head>

&lt;body>
    &lt;div id="mapa">&lt;/div>
&lt;/body>
&lt;/html></code></pre>



<h2 class="wp-block-heading">Comprobar que el dispositivo (navegador) soporta geolocalización</h2>



<p class="wp-block-paragraph">Aquí me voy a centrar en la <strong>documentación de Mozilla</strong> donde no he tenido ningún problema para geolocalizarme con Firefox (en Chrome/Chromium si he tenido problemas para geolocalizarme debido a unas limitaciones que ha impuesto Google a la geolocalización a través de HTML5).</p>



<p class="wp-block-paragraph"><em><strong>El siguiente código está probado para Firefox y podría no funcionar correctamente en otros navegadores.</strong></em></p>



<pre class="wp-block-code"><code>&lt;script>
    if(navigator.geolocation){
        //Funciona la geolocalización
    }
    else{
        //No funciona la geolocalización
    }
&lt;/script></code></pre>



<p class="wp-block-paragraph">Con el código anterior comprobamos si la geolocalización está disponible en el dispositivo o navegador web del usuario, en caso afirmativo dibujaremos un mapa donde se mostrará la ruta calculada desde la posición del usuario hasta nuestra ubicación de interés.</p>



<p class="wp-block-paragraph">En caso de que la geolocalización no funcione, podemos dibujar un mapa normal con la ubicación de nuestro destino (sin calcular rutas).</p>



<pre class="wp-block-code"><code>&lt;script>
    if(navigator.geolocation){
        navigator.geolocation.getCurrentPosition(function(position){
            var latitude = position.coords.latitude;
            var longitude = position.coords.longitude;

            var mymap = L.map('mapa', {
                center: &#91;latitude, longitude],
                zoom: 12
            });

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

            L.Routing.control({
                waypoints: &#91;
                    L.latLng(latitude, longitude),
                    L.latLng(37.17059, -3.60552)
                ],
                language: 'es'
            }).addTo(mymap);
        });
    }
    else{
        var mymap = L.map('mapa', {
            center: &#91;37.17059, -3.60552],
            zoom: 17
        });

        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></code></pre>



<h2 class="wp-block-heading">Obtener las coordenadas del usuario</h2>



<p class="wp-block-paragraph">Vamos a comentar un poco el codigo. En caso de que la geolocalización esté disponible, el método que obtiene la ubicación del usuario es <strong>getCurrentPosition</strong>, al que le pasamos una función de callback con un parámetro (position) en el que podemos obtener tanto la latitud como la longitud por separado:</p>



<pre class="wp-block-code"><code>navigator.geolocation.getCurrentPosition(function(position){
    var latitude = position.coords.latitude;
    var longitude = position.coords.longitude;
});</code></pre>



<p class="wp-block-paragraph">A continuación dibujamos el mapa posicionándolo en la ubicación del usuario:</p>



<pre class="wp-block-code"><code>var mymap = L.map('mapa', {
    center: &#91;latitude, longitude],
    zoom: 12
});</code></pre>



<p class="wp-block-paragraph">Hay que tener en cuenta que la geolocalización a través de IP puede no ser muy fiable. Si la central a la que estás conectado se encuentra en tu misma población, la geolocalización te ubicará más o menos en tu pueblo, pero por ejemplo, mi conexión ADSL proviene de una red Air Wifi, cuya central se encuentra en otra ciudad, así que el navegador me geolocaliza en esa otra ciudad&#8230;</p>



<p class="wp-block-paragraph">Esto no ocurre con el navegador de mi smartphone si además tengo activada la Ubicación, en este caso me geolocaliza a la perfección.</p>



<p class="wp-block-paragraph">Tras dibujar el mapa llamamos al Routing Machine pasándole las dos coordenadas a calcular:</p>



<h2 class="wp-block-heading">Llamar al método para calcular la ruta</h2>



<pre class="wp-block-code"><code>L.Routing.control({
    waypoints: &#91;
        L.latLng(latitude, longitude), //dirección obtenida del usuario
        L.latLng(37.17059, -3.60552) //dirección fija de destino
    ],
    language: 'es'
}).addTo(mymap);</code></pre>



<p class="wp-block-paragraph">No olvides especificar el código de idioma para que las indicaciones aparezcan en español.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="984" height="711" src="https://danisanchez.net/wp-content/uploads/2020/01/imagen-5.png" alt="" class="wp-image-6460" srcset="https://danisanchez.net/wp-content/uploads/2020/01/imagen-5.png 984w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-5-300x217.png 300w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-5-768x555.png 768w" sizes="auto, (max-width: 984px) 100vw, 984px" /></figure>



<p class="wp-block-paragraph"><strong>NOTA IMPORTANTE:</strong></p>



<p class="wp-block-paragraph">El cálculo de ruta se origina en un servidor OSRM de demostración cuya finalidad es la de probar la API, de hecho si abrimos la consola del inspector de elementos nos avisa de esto:</p>



<p class="wp-block-paragraph"><em>You are using OSRM&#8217;s demo server. Please note that it is <strong>NOT SUITABLE FOR PRODUCTION USE</strong>. Refer to the demo server&#8217;s usage policy: https://github.com/Project-OSRM/osrm-backend/wiki/Api-usage-policy</em></p>



<p class="wp-block-paragraph"><em>To change, set the serviceUrl option.</em></p>



<p class="wp-block-paragraph"><em>Please do not report issues with this server to neither Leaflet Routing Machine or OSRM &#8211; it&#8217;s for demo only, and will sometimes not be available, or work in unexpected ways.</em></p>



<p class="wp-block-paragraph">P<em>lease set up your own OSRM server, or use a paid service provider for production.</em></p>



<p class="wp-block-paragraph">El texto nos advierte que no es recomendable usarlo para entornos de producción, ya que el servidor puede no estar disponible en determinados momentos.</p>



<p class="wp-block-paragraph">Por lo que si queremos implementar el cálculo de rutas en una aplicación web de producción, deberíamos configurar nuestro propio servidor OSRM en nuestro servicio de hosting (consultar al soporte técnico) y modificar la variable <strong>serviceURL</strong> dentro del <em>leaflet-routing-machine.js</em></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="984" height="711" src="https://danisanchez.net/wp-content/uploads/2020/01/imagen-4.png" alt="" class="wp-image-6458" srcset="https://danisanchez.net/wp-content/uploads/2020/01/imagen-4.png 984w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-4-300x217.png 300w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-4-768x555.png 768w" sizes="auto, (max-width: 984px) 100vw, 984px" /></figure>



<h2 class="wp-block-heading">Calcular rutas enviando las coordenadas a OpenStreetMap.org</h2>



<p class="wp-block-paragraph">Si no queremos configurar un servidor OSRM siempre podemos hacer el cálculo de rutas directamente en la web de <a rel="noreferrer noopener" aria-label="openstreetmap.org (opens in a new tab)" href="https://www.openstreetmap.org" target="_blank">openstreetmap.org</a>.</p>



<p class="wp-block-paragraph">Para ello podemos enviar a través de un formulario HTML, las coordenadas mediante GET al action=»https://www.openstreetmap.org/directions?engine=fossgis_osrm_car» si queremos hacer la ruta en coche o a  «https://www.openstreetmap.org/directions?engine=fossgis_osrm_foot» si queremos calcular la ruta a pie.</p>



<p class="wp-block-paragraph">La cadena con las coordenadas tiene que tener la siguiente síntaxis:</p>



<p class="wp-block-paragraph"><em>latitud1,longitud1;latitud2,longitud2</em>, por ejemplo:</p>



<p class="wp-block-paragraph"><em>37.17618,-3.96473;37.1894,-3.7216</em></p>



<p class="wp-block-paragraph">Las coordenadas del usuario tendrán que enviarse en el formulario de forma dinámica, es decir, a través de una variable, mientras que las coordenadas de destino pueden especificarse estáticamente.</p>



<p class="wp-block-paragraph">Para el ejemplo, vamos a crear una página HTML con el formulario, y un archivo de funciones .JS que obtendrá las coordenadas del usuario, las pasará al formulario y lo enviará a openstreetmap.org. En el código he integrado jQuery para hacer las escuchas al botón y enviar los datos.</p>



<p class="wp-block-paragraph">Página HTML:</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;script src="https://code.jquery.com/jquery-3.4.1.min.js"
		integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
        crossorigin="anonymous">
    &lt;/script>
    &lt;script src="js/funciones.js">&lt;/script>
    &lt;title>Document&lt;/title>
&lt;/head>
&lt;body>
    &lt;h2>Cómo llegar&lt;/h2>

    &lt;form id="formulario_rutas" method="get" action="https://www.openstreetmap.org/directions?engine=fossgis_osrm_car">    
        &lt;input id="coordenadas" type="hidden" name="route" value=""/>
        &lt;input id="calcular_ruta" type="button" value="Cómo llegar"/>
    &lt;/form>
&lt;/body>
&lt;/html></code></pre>



<p class="wp-block-paragraph">Crearemos un formulario con un campo oculto (hidden) que contendrá como valor la cadena que pasaremos a openstreetmap ya formateada como éste espera recibirla. Y un botón que al hacer clic ejecute todo el proceso.</p>



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



<pre class="wp-block-code"><code>"use strict";

$(document).ready(function(){
    $("#calcular_ruta").click(function(){
        if(navigator.geolocation){
            navigator.geolocation.getCurrentPosition(function(position){
                var latitude = position.coords.latitude;
                var longitude = position.coords.longitude;

                var cadenaRuta = latitude+","+longitude+";37.1894,-3.7216";
                $("#coordenadas").val(cadenaRuta);
                $("#formulario_rutas").submit();
            });
        }
    });
});</code></pre>



<p class="wp-block-paragraph">En el archivo de funciones, captamos el clic al botón del formulario, geolocalizamos al usuario y construimos la cadenaRuta que pasaremos como valor al campo hidden (coordenadas) del formulario. Por último hacemos un submit al formulario y OpenStreetMap hará la magia.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="588" src="https://danisanchez.net/wp-content/uploads/2020/01/imagen-6-1024x588.png" alt="" class="wp-image-6467" srcset="https://danisanchez.net/wp-content/uploads/2020/01/imagen-6-1024x588.png 1024w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-6-300x172.png 300w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-6-768x441.png 768w, https://danisanchez.net/wp-content/uploads/2020/01/imagen-6.png 1239w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">No queda integrado en nuestra web como sí pasaría con un servidor OSRM, pero al menos es una solución elegante.</p>



<p class="wp-block-paragraph">Paso a paso y no sin alguna dificultad vamos avanzando hacia la no dependencia del todopoderoso GoogleMaps. Seguiremos próximamente&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/calcular-rutas-con-openstreetmap-partiendo-de-la-geolocalizacion-del-usuario/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title>Limitar el tipo de archivos permitidos que podemos subir a WordPress</title>
		<link>https://danisanchez.net/limitar-el-tipo-de-archivos-permitidos-que-podemos-subir-a-wordpress/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 13 Jan 2020 08:40:17 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=6437</guid>

					<description><![CDATA[Hace unos meses publiqué unos tutoriales para crear formularios externos para colaboradores externos. En uno de ellos se hablaba de cómo permitir a un usuario colaborador subir archivos a WordPress, para por ejemplo, agregar imágenes a sus artículos. Me han comentado la preocupación de que estos usuarios colaboradores puedan subir archivos malintencionados aprovechando sus permisos [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hace unos meses publiqué unos tutoriales para crear formularios externos para colaboradores externos. En uno de ellos se hablaba de <a href="https://danisanchez.net/permitir-usuario-colaborador-subir-archivos-desde-frontend-wordpress/" target="_blank" rel="noreferrer noopener" aria-label="cómo permitir a un usuario colaborador subir archivos a  WordPress (opens in a new tab)">cómo permitir a un usuario colaborador subir archivos a  WordPress</a>, para por ejemplo, agregar imágenes a sus artículos.</p>



<p class="wp-block-paragraph">Me han comentado la preocupación de que estos usuarios colaboradores puedan subir archivos malintencionados aprovechando sus permisos de subida de archivos a WordPress.</p>



<h2 class="wp-block-heading">Especificar únicamente los archivos permitidos</h2>



<p class="wp-block-paragraph">Para asegurarnos, podemos limitar el tipo de archivos permitidos para subir a WordPress utilizando la función:</p>



<pre class="wp-block-code"><code>function restringir_tipos_de_archivo($mime_types){
    $mime_types = array(
        'jpg|jpeg|jpe' => 'image/jpeg',
        'gif' => 'image/gif',
        'png' => 'image/png',
        'pdf' => 'application/pdf'
    );
    return $mime_types;
}
add_filter('upload_mimes', 'restringir_tipos_de_archivo');</code></pre>



<p class="wp-block-paragraph">Esta función sobreescribe los archivos permitidos por defecto de WordPress por nuestra lista, donde podemos añadir los tipos extra que necesitemos (por ejemplo archivos de video .avi, .mpeg, .webm&#8230;).</p>



<h2 class="wp-block-heading">Bloquear tipos de archivo específicos</h2>



<p class="wp-block-paragraph">Si solamente queremos bloquear ciertos tipos de archivos, podemos usar la función:</p>



<pre class="wp-block-code"><code>function eliminar_tipos_de_archivo( $mime_types=array()){
    unset( $mime_types&#91;'mov|qt'] ); // Vídeos con la extensión .mov
    unset( $mime_types&#91;'mp4|m4v'] ); // Vídeos con la extensión .mp4
    unset( $mime_types&#91;'avi'] ); // Vídeos con la extensión .avi
    unset( $mime_types&#91;'mpeg|mpg|mpe'] ); // Vídeos con la extensión .mpg
 
    return $mime_types;
}
add_filter('upload_mimes','eliminar_tipos_de_archivo');</code></pre>



<p class="wp-block-paragraph">Añadiendo en cada unset() el tipo de archivo a bloquear.</p>



<p class="wp-block-paragraph">Una capa extra de seguridad que podemos añadir a nuestros proyectos con una pocas líneas de código.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Integra OpenStreetMap en tus aplicaciones web con LeafLet y MapBox</title>
		<link>https://danisanchez.net/integra-openstreetmap-en-tus-aplicaciones-web-con-leaflet-y-mapbox/</link>
					<comments>https://danisanchez.net/integra-openstreetmap-en-tus-aplicaciones-web-con-leaflet-y-mapbox/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Fri, 10 Jan 2020 17:47:06 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[leaflet]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[tutoriales]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=6418</guid>

					<description><![CDATA[Para compartir una ubicación rápida con OpenStreetMap puedes ir directamente a OpenStreetMap.org y localizar el lugar que deseas compartir, ya sea indicando una dirección exacta o unas coordenadas: En el menú derecho utiliza la opción «Compartir», selecciona HTML y copia el código HTML que tendrás que incrustar en tu página. Ejemplo de mapa incrustado: Ver [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Para compartir una ubicación rápida con OpenStreetMap puedes ir directamente a <a rel="noreferrer noopener" aria-label="OpenStreetMap.org (opens in a new tab)" href="https://www.openstreetmap.org" target="_blank">OpenStreetMap.org</a> y localizar el lugar que deseas compartir, ya sea indicando una dirección exacta o unas coordenadas:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://danisanchez.net/wp-content/uploads/2020/01/001.buscar-en-open-street-map-1024x635.jpg" alt="" class="wp-image-6423" srcset="https://danisanchez.net/wp-content/uploads/2020/01/001.buscar-en-open-street-map-1024x635.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/01/001.buscar-en-open-street-map-300x186.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/001.buscar-en-open-street-map-768x476.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/01/001.buscar-en-open-street-map.jpg 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En el menú derecho utiliza la opción «Compartir», selecciona HTML y copia el código HTML que tendrás que incrustar en tu página.</p>



<p class="wp-block-paragraph">Ejemplo de mapa incrustado:</p>



<iframe loading="lazy" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox=-3.8318252563476567%2C37.05736900011469%2C-3.392715454101563%2C37.292081740702365&amp;layer=mapnik&amp;marker=37.17481651466045%2C-3.6122703552246094" style="border: 1px solid black" width="100%" height="350" frameborder="0"></iframe><br><small><a href="https://www.openstreetmap.org/?mlat=37.1748&amp;mlon=-3.6123#map=12/37.1748/-3.6123">Ver mapa más grande</a></small>



<p class="wp-block-paragraph">Pero si necesitas crear un mapa personalizado, con varios marcadores, con la posibilidad de insertar áreas, personalizar la imagen del marcador, podemos integrar OpenStreetMap en nuestro proyecto web gracias a las librerías de <a rel="noreferrer noopener" aria-label="Leaflet (opens in a new tab)" href="https://leafletjs.com/" target="_blank">Leaflet</a> y a los fondos de <a rel="noreferrer noopener" aria-label="MapBox (opens in a new tab)" href="https://www.mapbox.com/" target="_blank">MapBox</a>.</p>



<p class="wp-block-paragraph">Para dar nuestros primeros pasos vamos a ejecutar un ejercicio sencillo. Crea un nuevo directorio con los siguientes archivos:</p>



<ul class="wp-block-list"><li>index.html</li><li>estilos.css</li></ul>



<p class="wp-block-paragraph">En el archivo index.html añade las librerías de LeafLet:</p>



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



<pre class="wp-block-code"><code>&lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
   integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
   crossorigin=""/></code></pre>



<p class="wp-block-paragraph">Enlaza también tu archivo de estilos.css:</p>



<pre class="wp-block-code"><code>&lt;link rel="stylesheet" href="estilos.css"/></code></pre>



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



<pre class="wp-block-code"><code>&lt;script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
    integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
    crossorigin="">
&lt;/script></code></pre>



<p class="wp-block-paragraph">Y crea un DIV con un identificador, por ejemplo:</p>



<pre class="wp-block-code"><code>&lt;div id="mimapa">&lt;/div></code></pre>



<p class="wp-block-paragraph">Ajusta con CSS el alto que desees para el mapa:</p>



<pre class="wp-block-code"><code>#mimapa {height: 600px;}</code></pre>



<p class="wp-block-paragraph">De forma que tu index.html quede más o menos así:</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;link rel="stylesheet" href="estilos.css"/>
    &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 Open Street Map&lt;/title>
&lt;/head>

&lt;body>
    &lt;div id="mimapa">&lt;/div>
&lt;/body>

&lt;/html></code></pre>



<p class="wp-block-paragraph">A continuación vamos a añadir un poco de JavaScript para inicializar el mapa en una ubicación predefinida. Este código podemos insertarlo en el archivo index.html a continuación del DIV o en un archivo de funciones JavaScript externo.</p>



<pre class="wp-block-code"><code>&lt;script>
    var mymap = L.map('mimapa').setView([37.1698, -3.965], 18);
&lt;/script></code></pre>



<p class="wp-block-paragraph">Utiliza las coordenadas con las que quieras inicializar el mapa, el segundo parámetro «18» corresponde al ZOOM inicial.</p>



<p class="wp-block-paragraph">Ahora tenemos que llamar a las librerías de MapBox para dibujar el mapa:</p>



<pre class="wp-block-code"><code>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);</code></pre>



<p class="wp-block-paragraph">No olvides especificar las atribuciones tal y como se exige en las condiciones y términos de uso.</p>



<pre class="wp-block-code"><code>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></code></pre>



<p class="wp-block-paragraph">Existen varios tipos de mapa en MapBox, puedes consultar en su documentación y utilizar el que prefieras, para el ejemplo hemos utilizado «streets-v11».</p>



<p class="wp-block-paragraph">Con este código ya tenemos inicializado un mapa con una ubicación y zoom predefinidos.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://danisanchez.net/wp-content/uploads/2020/01/002-mapa-predefinido-1024x635.jpg" alt="" class="wp-image-6424" srcset="https://danisanchez.net/wp-content/uploads/2020/01/002-mapa-predefinido-1024x635.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/01/002-mapa-predefinido-300x186.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/002-mapa-predefinido-768x476.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/01/002-mapa-predefinido.jpg 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Añadir un marcador</h2>



<p class="wp-block-paragraph">Vamos a añadir nuestro primer marcador:</p>



<pre class="wp-block-code"><code>var marker = L.marker([37.1698, -3.965]).addTo(mymap);</code></pre>



<p class="wp-block-paragraph">Especifica las coordenadas del marcador.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://danisanchez.net/wp-content/uploads/2020/01/003-nuevo-marcador-1024x635.jpg" alt="" class="wp-image-6425" srcset="https://danisanchez.net/wp-content/uploads/2020/01/003-nuevo-marcador-1024x635.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/01/003-nuevo-marcador-300x186.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/003-nuevo-marcador-768x476.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/01/003-nuevo-marcador.jpg 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Popups en marcadores</h3>



<p class="wp-block-paragraph">Podemos activar un popup utilizando el método bindPopup, con información al hacer clic en el marcador. La información podemos generarla en HTML con todas las ventajas que conlleva (insertar links, imágenes&#8230;):</p>



<pre class="wp-block-code"><code>marker.bindPopup("&lt;b>Mi ubicación&lt;/b>&lt;br>&lt;a href='#'>Solicita más información&lt;/a>");</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://danisanchez.net/wp-content/uploads/2020/01/004-popup-marcador-1024x635.jpg" alt="" class="wp-image-6426" srcset="https://danisanchez.net/wp-content/uploads/2020/01/004-popup-marcador-1024x635.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/01/004-popup-marcador-300x186.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/004-popup-marcador-768x476.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/01/004-popup-marcador.jpg 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Personalizar el marcador</h3>



<p class="wp-block-paragraph">Incluso podemos personalizar el tipo de marcador por defecto agregando una imagen.</p>



<pre class="wp-block-code"><code>var marcador = L.icon({
        iconUrl:'images/marcador.png',
        iconSize: [60, 85]
});</code></pre>



<p class="wp-block-paragraph">Y asignarlo a un marcador:</p>



<pre class="wp-block-code"><code>var marker = L.marker([37.1698, -3.965], {icon: marcador}).addTo(mymap);</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://danisanchez.net/wp-content/uploads/2020/01/005-marcador-personalizado-1024x635.jpg" alt="" class="wp-image-6428" srcset="https://danisanchez.net/wp-content/uploads/2020/01/005-marcador-personalizado-1024x635.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/01/005-marcador-personalizado-300x186.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/005-marcador-personalizado-768x476.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/01/005-marcador-personalizado.jpg 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Y recuerda que puedes agregar todos los marcadores que necesites (por ejemplo, extraídos de una base de datos):</p>



<pre class="wp-block-code"><code>var marker2 = L.marker([37.1699, -3.968], {icon: marcador}).addTo(mymap);
var marker3 = L.marker([37.1697, -3.966], {icon: marcador}).addTo(mymap);</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="635" src="https://danisanchez.net/wp-content/uploads/2020/01/006-varios-marcadores-1024x635.jpg" alt="" class="wp-image-6429" srcset="https://danisanchez.net/wp-content/uploads/2020/01/006-varios-marcadores-1024x635.jpg 1024w, https://danisanchez.net/wp-content/uploads/2020/01/006-varios-marcadores-300x186.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/006-varios-marcadores-768x476.jpg 768w, https://danisanchez.net/wp-content/uploads/2020/01/006-varios-marcadores.jpg 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Añadir un área (círculo)</h2>



<p class="wp-block-paragraph">Hay casos en los que no nos interesa especificar la ubicación exacta del marcador, si no una zona aproximada (muy habitual por ejemplo en webs inmobiliarias, donde no queremos indicar dónde hay inmuebles vacíos&#8230;).</p>



<pre class="wp-block-code"><code>var circle = L.circle([37.1697, -3.964], {
        color: 'red',
        fillColor: '#f03',
        fillOpacity: 0.5,
        radius: 40
}).addTo(mymap);</code></pre>



<p class="wp-block-paragraph">Entre los parámetros que podemos ajustar al area tenemos: las coordenadas, el color principal, el color del borde, la opacidad y el radio del area establecido en metros.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="948" height="603" src="https://danisanchez.net/wp-content/uploads/2020/01/007-circulo.jpg" alt="" class="wp-image-6432" srcset="https://danisanchez.net/wp-content/uploads/2020/01/007-circulo.jpg 948w, https://danisanchez.net/wp-content/uploads/2020/01/007-circulo-300x191.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/007-circulo-768x489.jpg 768w" sizes="auto, (max-width: 948px) 100vw, 948px" /></figure>



<h2 class="wp-block-heading">Añadir polígonos</h2>



<p class="wp-block-paragraph">Asímismo tenemos la posibilidad de crear polígonos para deliminar zonas específicas en el mapa, también muy útil para webs inmobiliarias donde podemos delimitar fincas y parcelas.</p>



<pre class="wp-block-code"><code>var polygon = L.polygon([
        [37.168474, -3.966202],
        [37.167482, -3.966827],
        [37.167602, -3.964477]
]).addTo(mymap);</code></pre>



<p class="wp-block-paragraph">Solo tenemos que especificar las coordenadas de cada punto del polígono.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="951" height="600" src="https://danisanchez.net/wp-content/uploads/2020/01/008-poligono.jpg" alt="" class="wp-image-6434" srcset="https://danisanchez.net/wp-content/uploads/2020/01/008-poligono.jpg 951w, https://danisanchez.net/wp-content/uploads/2020/01/008-poligono-300x189.jpg 300w, https://danisanchez.net/wp-content/uploads/2020/01/008-poligono-768x485.jpg 768w" sizes="auto, (max-width: 951px) 100vw, 951px" /></figure>



<p class="wp-block-paragraph">Con esto ya tenemos para empezar a jugar con los mapas de OpenStreetMap.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Todos estos códigos y más los puedes consultar en la documentación de LeafLet y sacarle todo el partido a la API.</p><cite><a href="https://leafletjs.com/examples.html">https://leafletjs.com/examples.html</a></cite></blockquote>



<p class="wp-block-paragraph">Si te ha gustado, por favor, compártelo en tus redes. 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/integra-openstreetmap-en-tus-aplicaciones-web-con-leaflet-y-mapbox/feed/</wfw:commentRss>
			<slash:comments>25</slash:comments>
		
		
			</item>
		<item>
		<title>Personalizar las columnas del listado de entradas en WordPress</title>
		<link>https://danisanchez.net/personalizar-las-columnas-del-listado-de-entradas-en-wordpress/</link>
					<comments>https://danisanchez.net/personalizar-las-columnas-del-listado-de-entradas-en-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Wed, 28 Aug 2019 06:18:18 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom post]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[taxonomías]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=6079</guid>

					<description><![CDATA[Si accedemos al listado de entradas o de un custom post de WordPress, veremos que por defecto aparecen una serie de columnas con información útil sobre el contenido: En nuestro caso y continuando con la serie de ejercicios anteriores en la que creamos un custom post para guardar vehículos, las columnas que aparecen por defecto [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si accedemos al listado de entradas o de un custom post de WordPress, veremos que por defecto aparecen una serie de columnas con información útil sobre el contenido:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="410" src="https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-1024x410.jpeg" alt="" class="wp-image-6080" srcset="https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-1024x410.jpeg 1024w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-300x120.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-768x308.jpeg 768w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos.jpeg 1326w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En nuestro caso y continuando con la <a href="https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/" target="_blank" rel="noreferrer noopener" aria-label="serie de ejercicios anteriores en la que creamos un custom post (opens in a new tab)">serie de ejercicios anteriores en la que creamos un custom post</a> para guardar vehículos, las columnas que aparecen por defecto son el título, el autor y las taxonomías que creamos: Tipo de Vehículo y Extras).</p>



<p class="wp-block-paragraph">Estas taxonomías aparecen como columnas porque al definirlas especificamos el argumento:</p>



<pre class="wp-block-code"><code>'show_admin_column' =&gt; true</code></pre>



<p class="wp-block-paragraph">Lo que hace que lo muestre en la columna del administrador. Si no queremos que aparezca solo tenemos que cambiar el valor a «false».</p>



<p class="wp-block-paragraph">En este artículo veremos cómo añadir nuestras propias columnas para mostrar por ejemplo, el precio y la matrícula que tenemos guardados en campos personalizados.</p>



<p class="wp-block-paragraph">Para ello vamos a hacer uso del filtro &#8216;manage_edit-<strong>nombre-del-custom-post</strong>_columns&#8217; y el action &#8216;manage_<strong>nombre-del-custom-post</strong>_posts_custom_column&#8217;.</p>



<h2 class="wp-block-heading">1. Especificamos las columnas con el filtro manage_edit-xxxx_columns</h2>



<pre class="wp-block-code"><code>function columnas_post_type_vehiculos($columnas){
    $columnas = array(
        'cb' =&gt; '&amp;lt;input type="checkbox" /&gt;',
        'title' =&gt; 'Título',
        'matricula' =&gt; 'Matrícula',
        'precio' =&gt; 'Precio',   
    );
    return $columnas;
}
add_filter('manage_edit-vehiculos_columns', 'columnas_post_type_vehiculos') ;</code></pre>



<p class="wp-block-paragraph">Analizando el código, estamos haciendo referencia a las columnas del tipo de post «vehiculos».</p>



<p class="wp-block-paragraph">Hemos especificado que aparezca:</p>



<ol class="wp-block-list"><li>El checkbox para poder seleccionar el post y realizar acciones en lote con él.</li><li>El título del post.</li><li>La matricula.</li><li>El precio. </li></ol>



<p class="wp-block-paragraph">Si nos fijamos en los elementos <strong>matrícula y precio</strong>, el primer valor es la variable que tenemos que especificar sin caracteres especiales, el segundo valor es la etiqueta o nombre que aparecerá en la columna.</p>



<p class="wp-block-paragraph">Ahora tenemos que especificar de donde tomar los datos para cada columna.</p>



<h2 class="wp-block-heading">2. Tomar los datos para cada columna</h2>



<pre class="wp-block-code"><code>function filas_post_type_vehiculos($columna, $post_id){
    global $post;
    switch($columna){
        case 'matricula':
            $matricula = get_post_meta($post_id, 'matricula', true);
            the_field('matricula');
            break;          
        case 'precio':
            $precio = get_post_meta($post_id, 'precio', true);
            the_field('precio');
            break;     
        
        default :
            break;
    }
}
add_action('manage_vehiculos_posts_custom_column', 'filas_post_type_vehiculos', 2, 10);</code></pre>



<p class="wp-block-paragraph">Recorremos con un switch columna tras columna y obtenemos su valor con la función <strong>the_field()</strong> de advanced custom field que es donde tenemos el valor guardado.</p>



<p class="wp-block-paragraph">En este ejemplo solo aparecerán las columnas, título, matrícula y precio:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="410" src="https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-1024x410.jpeg" alt="" class="wp-image-6081" srcset="https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-1024x410.jpeg 1024w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-300x120.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-768x308.jpeg 768w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas.jpeg 1326w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Si queremos que también aparezcan las demás columnas (autor, tipo de vehículo y extras, tenemos que definirlas:</p>



<pre class="wp-block-code"><code>function columnas_post_type_vehiculos($columnas){
    $columnas = array(
        'cb' =&gt; '&amp;lt;input type="checkbox" /&gt;',
        'title' =&gt; 'Título',
        'matricula' =&gt; 'Matrícula',
        'precio' =&gt; 'Precio',  
        'tipo_vehiculo' =&gt; 'Tipo de Vehículo',
        'extras' =&gt; 'Extras',
        'author' =&gt; 'Autor',
    );
    return $columnas;
}
add_filter('manage_edit-vehiculos_columns', 'columnas_post_type_vehiculos');</code></pre>



<pre class="wp-block-code"><code>function filas_post_type_vehiculos($columna, $post_id){
    global $post;
    switch($columna){
        case 'matricula':
            $matricula = get_post_meta($post_id, 'matricula', true);
            the_field('matricula');
            break;  
        case 'precio':
            $precio = get_post_meta($post_id, 'precio', true);
            the_field('precio');
            break;
        case 'tipo_vehiculo':
	    //consultar qué taxonomías hay marcadas
	    $terms = get_the_terms( $post-&gt;ID , 'tipo-vehiculo' );
	    if($terms != null){
		foreach( $terms as $term ) {
		    echo $term-&gt;name . " ";
		    unset($term);
		}
            }
            break;
        case 'extras':
	    //consultar extras
	    $terms = get_the_terms( $post-&gt;ID , 'extras' );
	    if($terms != null){
	        foreach( $terms as $term ) {
		    echo $term-&gt;name . " ";
		    unset($term);
		}
	    }
            break;
        default :
            break;
    }
}
add_action('manage_vehiculos_posts_custom_column', 'filas_post_type_vehiculos', 2, 10);</code></pre>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="410" src="https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-2-1024x410.jpeg" alt="" class="wp-image-6083" srcset="https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-2-1024x410.jpeg 1024w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-2-300x120.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-2-768x308.jpeg 768w, https://danisanchez.net/wp-content/uploads/2019/08/01-listado-vehiculos-columnas-personalizadas-2.jpeg 1326w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<p class="wp-block-paragraph">Hay que tener precaución en cómo llamar a los filtros y acciones de forma que no cometamos errores.</p>



<p class="wp-block-paragraph">En el <strong>add_filter y add_action</strong>, modifica únicamente el nombre de tu custom post:</p>



<p class="wp-block-paragraph">manage_<strong>vehiculos</strong>_posts_custom_column<br>manage_<strong>animales</strong>_posts_custom_column<br>manage_<strong>casas</strong>_posts_custom_column</p>



<p class="wp-block-paragraph">Espero que este artículo te haya sido de interés y puedas utilizarlo en tus proyectos. Seguro que a tus clientes les viene bien tener información a mano de sus contenidos sin necesidad de entrar al post.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/personalizar-las-columnas-del-listado-de-entradas-en-wordpress/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Cifrar tus copias de seguridad en la nube con GNUPG</title>
		<link>https://danisanchez.net/cifrar-tus-copias-de-seguridad-en-la-nube-con-gnupg/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Sat, 03 Aug 2019 07:56:04 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[gnupg]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[seguridad]]></category>
		<category><![CDATA[tutoriales]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=5948</guid>

					<description><![CDATA[La nube, ese término de marketing inventado para referirse «al ordenador de otro», a veces puede sacarnos de un apuro si por accidente o robo perdemos tanto nuestro trabajo como nuestras copias de seguridad físicas (pendrives, discos externos&#8230;). En estos casos (no habituales pero tampoco imposibles) nos puede salvar tener un respaldo de nuestros datos [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">La nube, ese término de marketing inventado para referirse «al ordenador de otro», a veces puede sacarnos de un apuro si por accidente o robo perdemos tanto nuestro trabajo como nuestras copias de seguridad físicas (pendrives, discos externos&#8230;).</p>



<p class="wp-block-paragraph">En estos casos (no habituales pero tampoco imposibles) nos puede salvar tener un respaldo de nuestros datos en algún servicio cloud como Drive, Dropbox, Hostiso, etc. Tendremos la tranquilidad de que nuestros datos estarán a salvo, pues estos servicios suelen realizar backups diarios y tener varias réplicas en distintos servidores.</p>



<p class="wp-block-paragraph">¿Pero la privacidad de tus archivos también está salvo? ¿Quién te asegura que no van a «husmear» en tus datos, e incluso tomar aquello que les interese para algún fin?</p>



<p class="wp-block-paragraph">Partiendo de que no aconsejo utilizar ningún servicio de cloud, precisamente por el tema delicado de la privacidad, si no nos queda más remedio, al menos deberíamos seguir una serie de recomendaciones para ponérselo díficil a los «curiosos».</p>



<h2 class="wp-block-heading">1. Empaquetar todos tus archivos en uno</h2>



<p class="wp-block-paragraph">La primera recomendación sería tomar todas las carpetas y archivos que compondrán el backup y empaquetarlos en un único archivo.</p>



<p class="wp-block-paragraph">Vamos a imaginar que tenemos 3 documentos de texto sueltos. Los seleccionamos y abrimos nuestra herramienta de empaquetado, en mi caso Ark.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="733" height="549" src="https://danisanchez.net/wp-content/uploads/2019/08/00.documentos-sueltos.jpeg" alt="" class="wp-image-5949" srcset="https://danisanchez.net/wp-content/uploads/2019/08/00.documentos-sueltos.jpeg 733w, https://danisanchez.net/wp-content/uploads/2019/08/00.documentos-sueltos-300x225.jpeg 300w" sizes="auto, (max-width: 733px) 100vw, 733px" /></figure>



<p class="wp-block-paragraph">Existen varios formatos de empaquetado a elegir: zip, tar, tar-gz, gzip&#8230; Pero uno de ellos permite además, poner una contraseña de desempaquetado y cifrar el listado de archivos que contiene. Es el formato <strong>7-zip</strong>. Seleccionamos este tipo y se habilitarán las opciones de <strong>Protección por contraseña</strong>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="616" height="533" src="https://danisanchez.net/wp-content/uploads/2019/08/01.empaquetar-los-archivos-1.jpg" alt="" class="wp-image-5952" srcset="https://danisanchez.net/wp-content/uploads/2019/08/01.empaquetar-los-archivos-1.jpg 616w, https://danisanchez.net/wp-content/uploads/2019/08/01.empaquetar-los-archivos-1-300x260.jpg 300w" sizes="auto, (max-width: 616px) 100vw, 616px" /></figure></div>



<p class="wp-block-paragraph">Aceptamos y obtendremos un único archivo <strong>Documentos.7z</strong>.</p>



<p class="wp-block-paragraph">Si intentamos abrirlo, no solo nos pedirá la contraseña de desempaquetado, si no que ocultará el listado de archivos que contiene.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="733" height="601" src="https://danisanchez.net/wp-content/uploads/2019/08/002.vista-archivos-ocultos.jpg" alt="" class="wp-image-5953" srcset="https://danisanchez.net/wp-content/uploads/2019/08/002.vista-archivos-ocultos.jpg 733w, https://danisanchez.net/wp-content/uploads/2019/08/002.vista-archivos-ocultos-300x246.jpg 300w" sizes="auto, (max-width: 733px) 100vw, 733px" /></figure></div>



<h2 class="wp-block-heading">2. Encriptar el archivo empaquetado</h2>



<p class="wp-block-paragraph">Ahora vamos a encriptar el archivo empaquetado para asegurarnos al 99,99% (nunca existe el 100% en seguridad) de que están seguros.</p>



<p class="wp-block-paragraph">Para ello vamos utilizar el programa <strong>GNUPG</strong>, que viene incluido en prácticamente todas las distribuciones GNU/Linux. Si no está instalado lo localizamos a través de nuestro gestor de paquetes.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="993" height="678" src="https://danisanchez.net/wp-content/uploads/2019/08/03.localizar-gnupc.jpg" alt="" class="wp-image-5951" srcset="https://danisanchez.net/wp-content/uploads/2019/08/03.localizar-gnupc.jpg 993w, https://danisanchez.net/wp-content/uploads/2019/08/03.localizar-gnupc-300x205.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/08/03.localizar-gnupc-768x524.jpg 768w" sizes="auto, (max-width: 993px) 100vw, 993px" /></figure>



<p class="wp-block-paragraph">Para encriptar nuestro archivo, abrimos una terminal en el directorio donde se encuentra y nos identificamos como root:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="864" height="275" src="https://danisanchez.net/wp-content/uploads/2019/08/04.sudo-su.jpg" alt="" class="wp-image-5955" srcset="https://danisanchez.net/wp-content/uploads/2019/08/04.sudo-su.jpg 864w, https://danisanchez.net/wp-content/uploads/2019/08/04.sudo-su-300x95.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/08/04.sudo-su-768x244.jpg 768w" sizes="auto, (max-width: 864px) 100vw, 864px" /></figure>



<p class="wp-block-paragraph">Ahora tecleamos la orden:</p>



<p class="wp-block-paragraph"><strong>gpg -c Documentos.7z</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="866" height="275" src="https://danisanchez.net/wp-content/uploads/2019/08/06.gpg-c.jpeg" alt="" class="wp-image-5956" srcset="https://danisanchez.net/wp-content/uploads/2019/08/06.gpg-c.jpeg 866w, https://danisanchez.net/wp-content/uploads/2019/08/06.gpg-c-300x95.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/06.gpg-c-768x244.jpeg 768w" sizes="auto, (max-width: 866px) 100vw, 866px" /></figure>



<p class="wp-block-paragraph">Nos pedirá una contraseña para poder desencriptarlo después.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="868" height="277" src="https://danisanchez.net/wp-content/uploads/2019/08/07.poner-contrasenna.jpeg" alt="" class="wp-image-5957" srcset="https://danisanchez.net/wp-content/uploads/2019/08/07.poner-contrasenna.jpeg 868w, https://danisanchez.net/wp-content/uploads/2019/08/07.poner-contrasenna-300x96.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/07.poner-contrasenna-768x245.jpeg 768w" sizes="auto, (max-width: 868px) 100vw, 868px" /></figure>



<p class="wp-block-paragraph">Ponemos la contraseña y esto nos generará un archivo con extensión gpg (Documentos.7z.gpg).</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="665" height="191" src="https://danisanchez.net/wp-content/uploads/2019/08/08.archivos-generados.jpeg" alt="" class="wp-image-5958" srcset="https://danisanchez.net/wp-content/uploads/2019/08/08.archivos-generados.jpeg 665w, https://danisanchez.net/wp-content/uploads/2019/08/08.archivos-generados-300x86.jpeg 300w" sizes="auto, (max-width: 665px) 100vw, 665px" /></figure></div>



<p class="wp-block-paragraph">Este archivo resultante es el que podríamos guardar en nuestro servicio de cloud como copia de seguridad.</p>



<p class="wp-block-paragraph">Al intentar abrirlo veremos que el contenido está completamente cifrado:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="648" height="515" src="https://danisanchez.net/wp-content/uploads/2019/08/12.ver-contenido-cifrado.jpeg" alt="" class="wp-image-5963" srcset="https://danisanchez.net/wp-content/uploads/2019/08/12.ver-contenido-cifrado.jpeg 648w, https://danisanchez.net/wp-content/uploads/2019/08/12.ver-contenido-cifrado-300x238.jpeg 300w" sizes="auto, (max-width: 648px) 100vw, 648px" /></figure></div>



<p class="wp-block-paragraph">Si necesitamos recuperar su contenido, solo tenemos que abrir una terminal y teclear el comando:</p>



<p class="wp-block-paragraph"><strong>gpg Documentos.7z.gpg</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="866" height="274" src="https://danisanchez.net/wp-content/uploads/2019/08/09.descifrar.jpeg" alt="" class="wp-image-5959" srcset="https://danisanchez.net/wp-content/uploads/2019/08/09.descifrar.jpeg 866w, https://danisanchez.net/wp-content/uploads/2019/08/09.descifrar-300x95.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/09.descifrar-768x243.jpeg 768w" sizes="auto, (max-width: 866px) 100vw, 866px" /></figure>



<p class="wp-block-paragraph">Y poner la contraseña de desencriptación.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="982" height="496" src="https://danisanchez.net/wp-content/uploads/2019/08/10.contrasena-cifrado.jpeg" alt="" class="wp-image-5960" srcset="https://danisanchez.net/wp-content/uploads/2019/08/10.contrasena-cifrado.jpeg 982w, https://danisanchez.net/wp-content/uploads/2019/08/10.contrasena-cifrado-300x152.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/10.contrasena-cifrado-768x388.jpeg 768w" sizes="auto, (max-width: 982px) 100vw, 982px" /></figure>



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



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="865" height="275" src="https://danisanchez.net/wp-content/uploads/2019/08/11.recuperacion-de-archivos.jpeg" alt="" class="wp-image-5961" srcset="https://danisanchez.net/wp-content/uploads/2019/08/11.recuperacion-de-archivos.jpeg 865w, https://danisanchez.net/wp-content/uploads/2019/08/11.recuperacion-de-archivos-300x95.jpeg 300w, https://danisanchez.net/wp-content/uploads/2019/08/11.recuperacion-de-archivos-768x244.jpeg 768w" sizes="auto, (max-width: 865px) 100vw, 865px" /></figure>



<p class="wp-block-paragraph">Y es todo. Disfrutar de las ventajas de la nube pero mantened la privacidad de vuestros archivos. Nos vemos en el siguiente post!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Crear el Archive Page de nuestro Custom Post (sin plugins)</title>
		<link>https://danisanchez.net/crear-el-archive-page-de-nuestro-custom-post-sin-plugins/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Fri, 26 Apr 2019 12:00:40 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom post]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación web]]></category>
		<category><![CDATA[publicaciones]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=5385</guid>

					<description><![CDATA[Seguimos con esta serie de artículos destinados a la creación de nuestros propios tipos de contenido en WordPress. Hasta ahora hemos visto cómo crear un custom post, asignarle taxonomías y campos personalizados y hasta creamos un template para cargar toda esta información. Ahora lo que nos falta es crear la página archivo (archive page) para [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Seguimos con esta serie de artículos destinados a la creación de nuestros propios tipos de contenido en WordPress. Hasta ahora hemos visto cómo <a href="https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/" target="_blank" rel="noreferrer noopener">crear un custom post</a>, asignarle <a href="https://danisanchez.net/taxonomias-para-que-sirven-y-como-crearlas-sin-plugins/" target="_blank" rel="noreferrer noopener">taxonomías</a> y <a href="https://danisanchez.net/anadir-campos-personalizados-con-advanced-custom-field/" target="_blank" rel="noreferrer noopener">campos personalizados</a> y hasta<a href="https://danisanchez.net/crear-un-template-para-cargar-nuestro-custom-post-contenido-personalizado/" target="_blank" rel="noreferrer noopener"> creamos un template</a> para cargar toda esta información.</p>



<p class="wp-block-paragraph">Ahora lo que nos falta es crear la página archivo (<strong>archive page</strong>) para listar nuestro custom post, a modo de listado de entradas de WordPress.</p>



<p class="wp-block-paragraph">Para ello, al igual que hicimos con el template para el custom post (<em>single-vehiculos.php</em>), necesitamos crear un nuevo archivo (<em>page.php</em>) al que llamaremos por ejemplo <strong>page-todos-los-vehiculos.php</strong> y guardaremos en el directorio principal del tema activo.</p>



<p class="wp-block-paragraph"><strong>page.php</strong> es el archivo que contiene la estructura básica para una página interna de WordPress y al igual que hicimos con <em>single.php</em>, vamos a aprovechar el codigo escrito para copiarlo en nuestro archivo <em>page-todos-los-vehiculos.php</em> y eliminaremos lo que no necesitamos, dejando únicamente el inicio y final del loop.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="657" height="621" src="https://danisanchez.net/wp-content/uploads/2019/04/01-loop-archive-custom-post.jpg" alt="" class="wp-image-5389" srcset="https://danisanchez.net/wp-content/uploads/2019/04/01-loop-archive-custom-post.jpg 657w, https://danisanchez.net/wp-content/uploads/2019/04/01-loop-archive-custom-post-300x284.jpg 300w" sizes="auto, (max-width: 657px) 100vw, 657px" /></figure></div>



<p class="wp-block-paragraph">Dentro del loop vamos a crear la consulta que buscará todas entradas de tipo vehículo.</p>



<p class="wp-block-paragraph">La esctructura de la consulta se define:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">$args = array(
    'post_type' => 'vehiculos',
    'posts_per_page' => -1,
    'orderby' => 'date',
    'order' => 'DESC'
);
$consulta_vehiculos = new WP_Query($args);</pre></code></pre>



<p class="wp-block-paragraph">Primero declaramos una variable <strong>$args</strong> (argumentos) de tipo <em>array</em> donde pasamos los argumentos de la consulta. Los argumentos más básicos que vamos a definir son: el tipo de post al que hacemos referencia (vehículos), el número de resultados por página (-1 devuelve todos los resultados), el orden (por fecha) y el recorrido del orden (ascendente ASC o descendente DESC).</p>



<p class="wp-block-paragraph">Existen muchos otros argumentos que ponemos incorporar a la consulta para complicarla todo lo que deseemos, pero de momento vamos a empezar por lo más básico.</p>



<p class="wp-block-paragraph">Despues generamos una nueva consulta <strong>new WP_Query()</strong> pasándole los argumentos definidos anteriormente: <strong>new WP_Query($args)</strong>.</p>



<p class="wp-block-paragraph">A continuación vamos a mostrar los datos recogidos en la consulta creando nuestro propio loop. La síntaxis sería la siguiente:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">while($consulta_vehiculos->have_posts()) : $consulta_vehiculos->the_post();
   //Código
endwhile; wp_reset_postdata();</pre></code></pre>



<p class="wp-block-paragraph">La forma de declarar nuestro loop personalizado es muy similar al que toma WordPress para el loop principal, con la diferencia de que especificamos la variable donde tenemos nuestra consulta:</p>



<p class="wp-block-paragraph"><strong>while($consulta_vehiculos-&gt;have_posts())</strong><br><strong>$consulta_vehiculos-&gt;the_post()</strong></p>



<p class="wp-block-paragraph">Lo que se traduciría en lenguaje comprensible como: «<em>Mientras existan posts de vehículos, muestrame el post de vehículo</em>«.</p>



<p class="wp-block-paragraph">El final del loop finaliza con <strong>endwhile;</strong></p>



<p class="wp-block-paragraph">Además, para los loops personalizados añadimos la función <strong>wp_reset_postdata()</strong> para «limpiar» los datos de la consulta una vez mostrados y que no interfieran con otros loops que podamos definir en otras partes.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="728" height="533" src="https://danisanchez.net/wp-content/uploads/2019/04/03-codigo-consulta-final.jpg" alt="" class="wp-image-5396" srcset="https://danisanchez.net/wp-content/uploads/2019/04/03-codigo-consulta-final.jpg 728w, https://danisanchez.net/wp-content/uploads/2019/04/03-codigo-consulta-final-300x220.jpg 300w" sizes="auto, (max-width: 728px) 100vw, 728px" /></figure></div>



<p class="wp-block-paragraph">Para asociar este nuevo archivo con una página interna de WordPress que podamos, por ejemplo añadir al menú principal, crearemos una nueva página y utilizaremos como <em>slug</em> (enlace permanente) el nombre que le hayamos dado al archivo del listado, es decir si hemos llamado al archivo page-todos-los-vehiculos.php utilizaremos como <em>slug</em> en la nueva página «<em>todos-los-vehiculos</em>«.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="460" src="https://danisanchez.net/wp-content/uploads/2019/04/02-slug-pagina-todos-los-vehiculos.jpg" alt="" class="wp-image-5394" srcset="https://danisanchez.net/wp-content/uploads/2019/04/02-slug-pagina-todos-los-vehiculos.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/02-slug-pagina-todos-los-vehiculos-300x138.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/02-slug-pagina-todos-los-vehiculos-768x353.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Como siempre, actualizamos los enlaces permanentes de WordPress en Ajustes &#8211; Enlaces Permanentes &#8211; Guardar Cambios y en este momento quedará asociado el nuevo archivo <em>page-todos-los-vehiculos.php</em> con la página interna de WordPress Vehículos.</p>



<p class="wp-block-paragraph">Para probar nuestra nueva página, vamos a incluir en loop una llamada a la función the_title(), que deberá devolvernos todos los títulos de los post de tipo vehículo que haya en la base de datos:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">while($consulta_vehiculos->have_posts()) : $consulta_vehiculos->the_post();
    the_title();
endwhile; wp_reset_postdata();</pre></code></pre>



<p class="wp-block-paragraph">Si visualizamos la página Vehículos, veremos que mostrará el título del post que hay actualmente creado de tipo vehículo:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="423" src="https://danisanchez.net/wp-content/uploads/2019/04/04-vista-pagina-archivo.jpg" alt="" class="wp-image-5398" srcset="https://danisanchez.net/wp-content/uploads/2019/04/04-vista-pagina-archivo.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/04-vista-pagina-archivo-300x127.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/04-vista-pagina-archivo-768x325.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Vamos a añadir algunos vehículos más para poder jugar con los listados de resultados:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="337" src="https://danisanchez.net/wp-content/uploads/2019/04/05.listado-vehiculos.jpg" alt="" class="wp-image-5405" srcset="https://danisanchez.net/wp-content/uploads/2019/04/05.listado-vehiculos.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/05.listado-vehiculos-300x101.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/05.listado-vehiculos-768x259.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Para la página de archivo de vehículos, tomaremos algunos datos para generar el listado, a parte del título, tomaremos la imagen destacada y una parte del contenido. Para ello, en lugar de llamar a la función <strong>the_content()</strong>, llamaremos a la función <strong>the_excerpt()</strong>, que toma solamente una parte del contenido.</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">while($consulta_vehiculos->have_posts()) : $consulta_vehiculos->the_post();
    the_post_thumbnail();
    the_title('&lt;h2>','&lt;/h2>');
    the_excerpt();
endwhile; wp_reset_postdata();</pre></code></pre>



<p class="wp-block-paragraph">Obtendríamos como resultado:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="1951" src="https://danisanchez.net/wp-content/uploads/2019/04/06-listado-vehiculos-frontend.jpg" alt="" class="wp-image-5407" srcset="https://danisanchez.net/wp-content/uploads/2019/04/06-listado-vehiculos-frontend.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/06-listado-vehiculos-frontend-154x300.jpg 154w, https://danisanchez.net/wp-content/uploads/2019/04/06-listado-vehiculos-frontend-525x1024.jpg 525w, https://danisanchez.net/wp-content/uploads/2019/04/06-listado-vehiculos-frontend-768x1498.jpg 768w, https://danisanchez.net/wp-content/uploads/2019/04/06-listado-vehiculos-frontend-787x1536.jpg 787w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Por supuesto ya dependería de nosotros darle un poco de formato CSS, metiendo cada apartado en su correspondiente DIV, ajustando el tamaño de las miniaturas, etc. Detalles de diseño que no vamos a ver en este artículo, pues se extendería demasiado y el objetivo principal es el de generar el listado de entradas.</p>



<p class="wp-block-paragraph">En siguientes artículos veremos cómo paginar este listado, para cuando tengamos un número importante de entradas.</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>
					
		
		
			</item>
		<item>
		<title>Crear un template para cargar nuestro custom post (contenido personalizado)</title>
		<link>https://danisanchez.net/crear-un-template-para-cargar-nuestro-custom-post-contenido-personalizado/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Thu, 11 Apr 2019 08:05:32 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom post]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación web]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=5360</guid>

					<description><![CDATA[Continuamos con esta serie de artículos en los que vemos cómo crear contenidos personalizados en WordPress. Una vez que ya hemos creado nuestro custom post, nuestras taxonomías y campos personalizados, quedará crear la plantilla o template que cargará toda esta información. Dentro de cualquier tema WordPress, el archivo destinado a cargar la información de una [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Continuamos con esta serie de artículos en los que vemos cómo crear contenidos personalizados en WordPress. Una vez que ya hemos creado nuestro <a href="https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/" target="_blank" rel="noreferrer noopener">custom post</a>, nuestras <a href="https://danisanchez.net/taxonomias-para-que-sirven-y-como-crearlas-sin-plugins/" target="_blank" rel="noreferrer noopener">taxonomías</a> y <a href="https://danisanchez.net/anadir-campos-personalizados-con-advanced-custom-field/" target="_blank" rel="noreferrer noopener">campos personalizados</a>, quedará crear la plantilla o template que cargará toda esta información.</p>



<p class="wp-block-paragraph">Dentro de cualquier tema WordPress, el archivo destinado a cargar la información de una entrada es el single.php.</p>



<p class="wp-block-paragraph">La siguiente imagen muestra el contenido del archivo single.php del tema Twenty Sixteen de WordPress. Cada tema tendrá su código propio, pero lo que nos interesa identificar es dónde comienza y termina el loop. El loop es el código que recoge la información del post que estamos llamando y suele comenzar con:</p>



<pre class="wp-block-code"><code>while ( have_posts() ) : the_post();</code></pre>



<p class="wp-block-paragraph">y terminar con:</p>



<pre class="wp-block-preformatted">endwhile;</pre>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="639" src="https://danisanchez.net/wp-content/uploads/2019/04/01.template-custom-post.jpg" alt="" class="wp-image-5361" srcset="https://danisanchez.net/wp-content/uploads/2019/04/01.template-custom-post.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/01.template-custom-post-300x192.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/01.template-custom-post-768x491.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Todo lo que va dentro del loop suelen ser las funciones que llaman al título de la entrada, al contenido y a la sección de comentarios.</p>



<p class="wp-block-paragraph">Para crear un fichero similar que cargue el contenido de nuestros custom posts, solo tenemos que crear un nuevo archivo al que llamaremos <strong>single-nombre_del_custom_post.php</strong>. En nuestro caso será <strong>single-vehiculos.php</strong>.</p>



<p class="wp-block-paragraph">Para este nuevo archivo podemos aprovechar todo el contenido del single.php original (para llamar a la cabecera, sidebars, footer, y menús del tema&#8230;) y quedarnos únicamente con el loop vacío, pues añadiremos nuestro propio código para cargar el custom post de Vehículos.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="655" height="554" src="https://danisanchez.net/wp-content/uploads/2019/04/02.single-vehiculos.jpg" alt="" class="wp-image-5362" srcset="https://danisanchez.net/wp-content/uploads/2019/04/02.single-vehiculos.jpg 655w, https://danisanchez.net/wp-content/uploads/2019/04/02.single-vehiculos-300x254.jpg 300w" sizes="auto, (max-width: 655px) 100vw, 655px" /></figure></div>



<p class="wp-block-paragraph">Una vez creado el archivo <strong>single-vehiculos.php </strong>vamos a refrescar los enlaces permanentes de WordPress, para que este detecte que cada vez que accedamos a una URL del tipo mi-dominio.com/vehiculos/nombre-del-post, cargue la nueva plantilla en lugar de la original. Solo tenemos que ir a Ajustes de WordPress &#8211; Enlaces permanentes y Guardar cambios.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="815" height="478" src="https://danisanchez.net/wp-content/uploads/2019/04/03.actualizar-enlaces-permanentes.jpg" alt="" class="wp-image-5363" srcset="https://danisanchez.net/wp-content/uploads/2019/04/03.actualizar-enlaces-permanentes.jpg 815w, https://danisanchez.net/wp-content/uploads/2019/04/03.actualizar-enlaces-permanentes-300x176.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/03.actualizar-enlaces-permanentes-768x450.jpg 768w" sizes="auto, (max-width: 815px) 100vw, 815px" /></figure></div>



<p class="wp-block-paragraph">Si intentamos acceder a una entrada de tipo Vehículo, veremos que carga correctamente (la URL toma /vehiculos/ford-focus-1-8-tddi), pero el contenido está vacío. Es normal pues dentro del loop no hemos añadido nada de momento.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="599" src="https://danisanchez.net/wp-content/uploads/2019/04/04.template-vacio.jpg" alt="" class="wp-image-5364" srcset="https://danisanchez.net/wp-content/uploads/2019/04/04.template-vacio.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/04.template-vacio-300x180.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/04.template-vacio-768x460.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Para llamar al título del contenido, añadiremos la función <em>the_title()</em> dentro del loop:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="385" height="174" src="https://danisanchez.net/wp-content/uploads/2019/04/05.llamar-titulo.jpg" alt="" class="wp-image-5365" srcset="https://danisanchez.net/wp-content/uploads/2019/04/05.llamar-titulo.jpg 385w, https://danisanchez.net/wp-content/uploads/2019/04/05.llamar-titulo-300x136.jpg 300w" sizes="auto, (max-width: 385px) 100vw, 385px" /></figure></div>



<p class="wp-block-paragraph">Y como resultado obtenedremos el título de la entrada:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="408" src="https://danisanchez.net/wp-content/uploads/2019/04/06.titulo-en-el-template.jpg" alt="" class="wp-image-5366" srcset="https://danisanchez.net/wp-content/uploads/2019/04/06.titulo-en-el-template.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/06.titulo-en-el-template-300x122.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/06.titulo-en-el-template-768x313.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Lo normal es que el título tenga un tamaño destacado, para ello la función <em>the_title()</em> permite definir que el contenido aparezca entre etiquetas HTML, por ejemplo un H2, declarándolo de este modo:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">the_title('&lt;h2>','&lt;/h2>');</pre></code></pre>



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



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="379" height="242" src="https://danisanchez.net/wp-content/uploads/2019/04/07.titulo-en-el-template-h2.jpg" alt="" class="wp-image-5367" srcset="https://danisanchez.net/wp-content/uploads/2019/04/07.titulo-en-el-template-h2.jpg 379w, https://danisanchez.net/wp-content/uploads/2019/04/07.titulo-en-el-template-h2-300x192.jpg 300w" sizes="auto, (max-width: 379px) 100vw, 379px" /></figure></div>



<p class="wp-block-paragraph">También podríamos añadir la imagen destacada, con la función <em>the_post_thumbnail(), </em>declarándola a continuación del título, así como el contenido (procedente del editor de WordPress) con la función <em>the_content():</em></p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">// Start the loop.
while ( have_posts() ) :
    the_post();
    the_title('&lt;h2>','&lt;/h2>'); //Llama al título del post
    the_post_thumbnail(); //Llama a la imagen destacada del post
    the_content(); //Llama al contenido
// End of the loop.
endwhile;</pre></code></pre>



<p class="wp-block-paragraph">Esto nos dará como resultado:</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://danisanchez.net/wp-content/uploads/2019/04/08-template-con-titulo-imagen-contenido-1-1.jpg" alt="" class="wp-image-5370"/></figure></div>



<p class="wp-block-paragraph">Hay que tener en cuenta que la imagen destacada aparecerá con el tamaño del archivo original, o el que permita el contenedor (&lt;div&gt;) donde se encuentre. Podemos llamar a la imagen destacada con un tamaño específico siempre que este se haya declarado en el archivo de funciones del tema.</p>



<p class="wp-block-paragraph">Por ejemplo, si quisiéramos que la imagen destacada apareciera en el post con un ancho de 500px, tendríamos que definirlo en el archivo de funciones (function.php) del tema activo con:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">function tamano_miniaturas(){
    add_image_size('cabeceraPost', 500, false);
}
add_action('after_setup_theme', 'tamano_miniaturas');</pre></code></pre>



<p class="wp-block-paragraph">La función <strong>add_image_size()</strong>, recibe 4 parámetros, el identificador del tamaño, la anchura, la altura y el factor de recorte de proporción (true o false). En este caso solo hemos especificado la anchura, ya que desconocemos la proporción de la imagen y de fijar un alto fijo esta podría aparecer desproporcionada.</p>



<p class="wp-block-paragraph">Después tendríamos que llamar a la función <strong>the_post_thumbnail(&#8216;cabeceraPost&#8217;)</strong>, pasándole como parámetro el identificador del tamaño que hemos especificado en add_image_size().</p>



<p class="wp-block-paragraph">Pero esto son temas de diseño que no vamos a abordar en este post.</p>



<p class="wp-block-paragraph">Solo nos quedaría llamar a nuestros campos personalizados para mostrar el precio y matrícula del vehículo.</p>



<p class="wp-block-paragraph">Advances Custom Field dispone de 2 funciones principales para extraer la información de los campos personalizados:</p>



<ul class="wp-block-list"><li><strong>the_field(&#8216;identificador_del_campo&#8217;)</strong></li><li><strong>get_field(&#8216;identificador_del_campo&#8217;)</strong></li></ul>



<p class="wp-block-paragraph">La principal diferencia entre ellos es que <em>the_field()</em> escribe directamente los datos del campo en el lugar donde lo invoquemos, (viene pre-formateado). Y <em>get_field()</em> está pensado para extraer el valor del campo y almacenarlo en algún lugar, por ejemplo una variable. El uso de uno u otro dependerá de nuestras necesidades. Si solo necesitamos pintar el valor del campo en un div vacío, puede que nos interese hacerlo directamente con the_field(), pero si el dato va a ir dentro de una estructura HTML más compleja, como una tabla, es posible que el pre-formateo de the_title() interfiera y no se muestre correctamente, en casos así sería mejor usar el get_field() guardando el dato en una variable y pintar la variable con un echo. Así es como lo vamos a hacer en nuestro ejemplo:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="518" height="360" src="https://danisanchez.net/wp-content/uploads/2019/04/09.llamada-a-campos-personalizados.jpg" alt="" class="wp-image-5373" srcset="https://danisanchez.net/wp-content/uploads/2019/04/09.llamada-a-campos-personalizados.jpg 518w, https://danisanchez.net/wp-content/uploads/2019/04/09.llamada-a-campos-personalizados-300x208.jpg 300w" sizes="auto, (max-width: 518px) 100vw, 518px" /></figure></div>



<p class="wp-block-paragraph">Definimos una variable $precio y le pasamos el valor del campo personalizado &#8216;precio&#8217; con un get_field()</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">$precio = get_field('precio');</pre></code></pre>



<p class="wp-block-paragraph">Y lo mismo con el campo matrícula:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">$matricula = get_field('matricula');</pre></code></pre>



<p class="wp-block-paragraph">Después pintamos los campos con un echo y un poco de HTML:</p>



<pre class="wp-block-preformatted">echo "&lt;h3&gt;Precio: " . $precio . "€&lt;/h3&gt;";
echo "Matrícula: " . $matricula . "&lt;/h3&gt;";</pre>



<p class="wp-block-paragraph">El resultado obtenido será:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="910" height="383" src="https://danisanchez.net/wp-content/uploads/2019/04/10.template-con-campos-personalizados.jpg" alt="" class="wp-image-5374" srcset="https://danisanchez.net/wp-content/uploads/2019/04/10.template-con-campos-personalizados.jpg 910w, https://danisanchez.net/wp-content/uploads/2019/04/10.template-con-campos-personalizados-300x126.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/10.template-con-campos-personalizados-768x323.jpg 768w" sizes="auto, (max-width: 910px) 100vw, 910px" /></figure></div>



<p class="wp-block-paragraph">Si necesitamos formatear el precio con separadores de miles y decimales, podemos usar la función number_format() de PHP:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">echo "&lt;h3>Precio: " . number_format($precio, 2, ',', '.') . "€&lt;/h3>";</pre></code></pre>



<p class="wp-block-paragraph">A la función number_format() le pasamos la variable $precio, el número de decimales a mostrar, el separador de decimales &#8216;,&#8217; y el separador de miles &#8216;.&#8217; y tendremos como resultado:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="205" height="76" src="https://danisanchez.net/wp-content/uploads/2019/04/11.mejorar-campo-precio.jpg" alt="" class="wp-image-5375"/></figure></div>



<p class="wp-block-paragraph">De esta forma formateamos el precio en el momento de pintarlo en el front-end mientras que en la base de datos se mantiene en formato numérico puro, pudiendo más adelante utilizarlo para ordenar vehículos por precio.</p>



<p class="wp-block-paragraph">En el siguient post veremos como crear una página archivo con los vehículos que ya tengamos guardados en la base de datos.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Añadir campos personalizados con Advanced Custom Field</title>
		<link>https://danisanchez.net/anadir-campos-personalizados-con-advanced-custom-field/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Wed, 10 Apr 2019 07:19:11 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[advanced custom field]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[publicaciones]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=5336</guid>

					<description><![CDATA[Si queremos crear nuestros contenidos personalizados en WordPress, tenemos por un lado que crear nuestro propios custom posts, nuestras propias taxonomías y por supuesto, nuestros propios campos personalizados. ¿Para qué sirve un campo personalizado? Por defecto, en una entrada o página de WordPress tenemos dos campos principales para agregar información, el campo de título y [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si queremos crear nuestros contenidos personalizados en WordPress, tenemos por un lado que crear nuestro propios <a href="https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/" target="_blank" rel="noreferrer noopener">custom posts</a>, nuestras propias <a href="https://danisanchez.net/taxonomias-para-que-sirven-y-como-crearlas-sin-plugins/" target="_blank" rel="noreferrer noopener">taxonomías</a> y por supuesto, nuestros propios campos personalizados.</p>



<h3 class="wp-block-heading">¿Para qué sirve un campo personalizado?</h3>



<p class="wp-block-paragraph">Por defecto, en una entrada o página de WordPress tenemos dos campos principales para agregar información, el <strong>campo de título</strong> y el <strong>editor</strong> donde se redacta el contenido principal. Pero adicionalmente podemos agregar otro tipo de campos para mostrar en secciones especificas de nuestra plantilla o simplemente como información que solo veremos desde el modo de edición.</p>



<p class="wp-block-paragraph">Por ejemplo, podríamos crear un campo para poner el precio de un vehículo y llamar a ese dato en una ubicación especifica de nuestra plantilla. O podríamos crear un campo personalizado no visible al público, pero que guarde información importante sobre el vehículo, como información del anterior propietario, historial de revisiones etc.</p>



<h3 class="wp-block-heading">Advanced Custom Field</h3>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="760" height="248" src="https://danisanchez.net/wp-content/uploads/2019/04/01.acfield.jpg" alt="" class="wp-image-5337" srcset="https://danisanchez.net/wp-content/uploads/2019/04/01.acfield.jpg 760w, https://danisanchez.net/wp-content/uploads/2019/04/01.acfield-300x98.jpg 300w" sizes="auto, (max-width: 760px) 100vw, 760px" /></figure></div>



<p class="wp-block-paragraph">WordPress tiene su propio sistema de creación de campos personalizados, pero es algo confuso y poco intuitivo, por lo que muchos desarrolladores optamos por utilizar el plugin <a href="https://es.wordpress.org/plugins/advanced-custom-fields/" target="_blank" rel="noreferrer noopener">Advanced Custom Field</a>, que permite crear campos personalizados de múltiples tipos y llamarlos con sencillas funciones.</p>



<p class="wp-block-paragraph">Una vez instalado, Advanced Custom Field organiza los campos en grupos, por si necesitas crear diferentes campos para varios custom posts o páginas concretas, así que lo primero que haremos será crear un <strong>Nuevo Grupo de Campos</strong>:</p>



<div class="wp-block-image"><figure class="aligncenter"><img loading="lazy" decoding="async" width="557" height="222" src="https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-grupo-de-campos.jpg" alt="" class="wp-image-5340" srcset="https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-grupo-de-campos.jpg 557w, https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-grupo-de-campos-300x120.jpg 300w" sizes="auto, (max-width: 557px) 100vw, 557px" /></figure></div>



<p class="wp-block-paragraph">Lo primero será darle un título al nuevo Grupo de Campos, por ejemplo «Detalles Vehículos».</p>



<p class="wp-block-paragraph">Antes de añadir los campos, vamos a ver algunos ajustes importantes del nuevo grupo de campos, para empezar su ubicación.</p>



<h3 class="wp-block-heading">Ubicación del grupo de campos</h3>



<p class="wp-block-paragraph">Lo que nos interesa es que este grupo de campos aparezca en el modo de edición de Vehículos, siendo irrelevante que aparezca en otros modos de edición como Entradas o Páginas.</p>



<p class="wp-block-paragraph">Así que definiremos la ubicación en los <strong>Post Type que sean igual a Vehículo:</strong></p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="428" src="https://danisanchez.net/wp-content/uploads/2019/04/03.ubicacion-acf.jpg" alt="" class="wp-image-5342" srcset="https://danisanchez.net/wp-content/uploads/2019/04/03.ubicacion-acf.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/03.ubicacion-acf-300x128.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/03.ubicacion-acf-768x329.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<h3 class="wp-block-heading">Ajustes del grupo de campos</h3>



<p class="wp-block-paragraph">En el apartado de <strong>Ajustes </strong>definiremos el estilo del grupo de campos, lo recomendable es utilizar el estilo <strong>Estándar (WP metabox)</strong> que permite la funcionalidad de arrastarlo y soltarlo en la posición que deseemos. Y hablando de posiciones, la siguiente opción nos permite ubicarlo en la zona de central del modo edición (antes o después del contenido) o en el sidebar (lateral).</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="916" height="226" src="https://danisanchez.net/wp-content/uploads/2019/04/04.ajustes-acf.jpg" alt="" class="wp-image-5344" srcset="https://danisanchez.net/wp-content/uploads/2019/04/04.ajustes-acf.jpg 916w, https://danisanchez.net/wp-content/uploads/2019/04/04.ajustes-acf-300x74.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/04.ajustes-acf-768x189.jpg 768w" sizes="auto, (max-width: 916px) 100vw, 916px" /></figure></div>



<h3 class="wp-block-heading">Agregando campos</h3>



<p class="wp-block-paragraph">Ahora vamos a agregar los campos que necesitemos:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="927" height="260" src="https://danisanchez.net/wp-content/uploads/2019/04/05-anadir-campo.jpg" alt="" class="wp-image-5345" srcset="https://danisanchez.net/wp-content/uploads/2019/04/05-anadir-campo.jpg 927w, https://danisanchez.net/wp-content/uploads/2019/04/05-anadir-campo-300x84.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/05-anadir-campo-768x215.jpg 768w" sizes="auto, (max-width: 927px) 100vw, 927px" /></figure></div>



<p class="wp-block-paragraph">Vamos a agregar un campo para el precio:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="914" height="571" src="https://danisanchez.net/wp-content/uploads/2019/04/06.propiedades-campo.jpg" alt="" class="wp-image-5346" srcset="https://danisanchez.net/wp-content/uploads/2019/04/06.propiedades-campo.jpg 914w, https://danisanchez.net/wp-content/uploads/2019/04/06.propiedades-campo-300x187.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/06.propiedades-campo-768x480.jpg 768w" sizes="auto, (max-width: 914px) 100vw, 914px" /></figure></div>



<p class="wp-block-paragraph">Los parámetros más importantes son la <strong>Etiqueta</strong> (texto que se mostrará en la página de edición), el <strong>Nombre del campo</strong> (identificador único sin espacios ni caracateres especiales) y opcionalmente, un campo para las intrucciones. Por ejemplo, para el campo Precio vamos a insertar un campo de <strong>tipo numérico</strong>, puede que un futuro nos interese ordenar los resultados de una búsqueda de vehículos por su precio y si lo especificamos como una cadena de caracteres (con puntuaciones, símbolos de moneda&#8230;), el sistema no sabría ordenarlo correctamente, por lo que solo se introducirán números sin puntuaciones ni signos.</p>



<p class="wp-block-paragraph">Vamos a añadir un par de campos más, uno para la matrícula (de tipo texto) y otro para observaciones internas (de tipo área de texto):</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="913" height="468" src="https://danisanchez.net/wp-content/uploads/2019/04/07.campo-matricula.jpg" alt="" class="wp-image-5347" srcset="https://danisanchez.net/wp-content/uploads/2019/04/07.campo-matricula.jpg 913w, https://danisanchez.net/wp-content/uploads/2019/04/07.campo-matricula-300x154.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/07.campo-matricula-768x394.jpg 768w" sizes="auto, (max-width: 913px) 100vw, 913px" /></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="904" height="326" src="https://danisanchez.net/wp-content/uploads/2019/04/08.campo-observaciones.jpg" alt="" class="wp-image-5348" srcset="https://danisanchez.net/wp-content/uploads/2019/04/08.campo-observaciones.jpg 904w, https://danisanchez.net/wp-content/uploads/2019/04/08.campo-observaciones-300x108.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/08.campo-observaciones-768x277.jpg 768w" sizes="auto, (max-width: 904px) 100vw, 904px" /></figure></div>



<p class="wp-block-paragraph">Una vez definidos todos los campos, publicamos:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1212" height="361" src="https://danisanchez.net/wp-content/uploads/2019/04/09.publicar-grupo-de-campos.jpg" alt="" class="wp-image-5349" srcset="https://danisanchez.net/wp-content/uploads/2019/04/09.publicar-grupo-de-campos.jpg 1212w, https://danisanchez.net/wp-content/uploads/2019/04/09.publicar-grupo-de-campos-300x89.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/09.publicar-grupo-de-campos-1024x305.jpg 1024w, https://danisanchez.net/wp-content/uploads/2019/04/09.publicar-grupo-de-campos-768x229.jpg 768w" sizes="auto, (max-width: 1212px) 100vw, 1212px" /></figure></div>



<h3 class="wp-block-heading">Publicar el primer Vehículo</h3>



<p class="wp-block-paragraph">Ya estamos listos para publicar un nuevo vehículo. Como en toda entrada pondremos un título y un texto descriptivo y seleccionaremos su/s taxonomía/s, en este caso «Automóvil»:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1199" height="565" src="https://danisanchez.net/wp-content/uploads/2019/04/10.crear-nuevo-vehiculo.jpg" alt="" class="wp-image-5350" srcset="https://danisanchez.net/wp-content/uploads/2019/04/10.crear-nuevo-vehiculo.jpg 1199w, https://danisanchez.net/wp-content/uploads/2019/04/10.crear-nuevo-vehiculo-300x141.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/10.crear-nuevo-vehiculo-1024x483.jpg 1024w, https://danisanchez.net/wp-content/uploads/2019/04/10.crear-nuevo-vehiculo-768x362.jpg 768w" sizes="auto, (max-width: 1199px) 100vw, 1199px" /></figure></div>



<p class="wp-block-paragraph">En la taxonomía de Extras rellenaremos algunas como: Aire Acondicionado, Dirección Asistida, ABS, etc. Y en nuestros nuevos campos personalizados rellenaremos el precio, la matrícula y las observaciones internas.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1019" height="563" src="https://danisanchez.net/wp-content/uploads/2019/04/11-detalles-vehiculo.jpg" alt="" class="wp-image-5351" srcset="https://danisanchez.net/wp-content/uploads/2019/04/11-detalles-vehiculo.jpg 1019w, https://danisanchez.net/wp-content/uploads/2019/04/11-detalles-vehiculo-300x166.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/11-detalles-vehiculo-768x424.jpg 768w" sizes="auto, (max-width: 1019px) 100vw, 1019px" /></figure></div>



<p class="wp-block-paragraph">Ahora que ya tenemos nuestro nuevo contenido publicado es el momento de crear un Template para mostrarlo en pantalla, pero eso lo veremos en 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>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
