<?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>desarrollo web &#8211; danisanchez.net</title>
	<atom:link href="https://danisanchez.net/tag/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>https://danisanchez.net</link>
	<description></description>
	<lastBuildDate>Tue, 31 Mar 2020 09:06:12 +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>desarrollo web &#8211; danisanchez.net</title>
	<link>https://danisanchez.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Composer en Ubuntu y derivadas</title>
		<link>https://danisanchez.net/composer-en-ubuntu-y-derivadas/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Tue, 31 Mar 2020 09:06:12 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=6557</guid>

					<description><![CDATA[Los desarrolladores web contamos con infinidad de recursos para implementar directamente en nuestros proyectos, si bien es cierto que muchas de estas librerías requieren de un elevado número de archivos, en ocasiones procedentes de diversas fuentes, haciendo que la implementación y posterior mantenimiento conlleve un trabajo adicional considerable. Para ello contamos con Composer, un avanzado [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Los desarrolladores web contamos con infinidad de recursos para implementar directamente en nuestros proyectos, si bien es cierto que muchas de estas librerías requieren de un elevado número de archivos, en ocasiones procedentes de diversas fuentes, haciendo que la implementación y posterior mantenimiento conlleve un trabajo adicional considerable.</p>



<p class="wp-block-paragraph">Para ello contamos con <strong>Composer</strong>, un avanzado gestor de paquetes y dependencias para PHP, con el cual podemos instalar de forma sencilla una completa librería PHP para nuestro proyecto y mantener todas sus dependencias al día.</p>



<p class="wp-block-paragraph">Si tienes contratado un alojamiento web, es posible que desde el panel de gestión (CPanel, Plesk&#8230;) ya cuentes con un apartado dedicado a Composer, para facilitarte la instalación de librerías en tus proyectos.</p>



<p class="wp-block-paragraph">Si eres de los que como yo, desarrollas tus proyectos web en modo local (localhost) para posteriormente subirlo a un hosting final, necesitarás instalar Composer en tu sistema operativo para descargar todas las librerías y dependencias correctamente.</p>



<p class="wp-block-paragraph">Yo me muevo entre distribuciones basadas en Ubuntu (Debian), aunque seguramente el proceso de instalación no difiera mucho de otras basadas en Arch o Red Hat.</p>



<h2 class="wp-block-heading">Instalar Composer en Ubuntu (y derivadas)</h2>



<p class="wp-block-paragraph">Cuando hablamos de derivadas, nos referimos a distribuciones que tienen como base Ubuntu, ya sean los sabores oficiales de Ubuntu (Ubuntu Mate, Xubuntu, Lubuntu, Kubuntu&#8230;) y otras tales como Linux Mint, KDE Neon, Zorin OS, Elementary OS&#8230;</p>



<h3 class="wp-block-heading">Instalar paquetes necesarios</h3>



<p class="wp-block-paragraph">Antes de instalar Composer, necesitamos contar con los siguientes paquetes previamente instalados:</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install wget php-cli php-zip unzip</code></pre>



<h3 class="wp-block-heading">Descarcar Composer desde el terminal</h3>



<p class="wp-block-paragraph">Vamos a descargar Composer directamente desde la línea de comandos:</p>



<pre class="wp-block-code"><code>php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"</code></pre>



<p class="wp-block-paragraph">Con esto hemos descargado el archivo composer-setup.php en el directorio en curso del terminal.</p>



<h3 class="wp-block-heading">Verificar la instalación</h3>



<p class="wp-block-paragraph">Para garantizar la integridad del archivo descargado utilizamos el HASH SHA-384. Primero tomamos el HASH desde la propia fuente:</p>



<pre class="wp-block-code"><code>HASH="$(wget -q -O - https://composer.github.io/installer.sig)"</code></pre>



<p class="wp-block-paragraph">Y lo comparamos con nuestro archivo recién descargado:</p>



<pre class="wp-block-code"><code>php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"</code></pre>



<p class="wp-block-paragraph">Si la verificación es correcta debemos ver el mensaje «Installer verified», de lo contrario nos dirá «Installer corrupt». En este último caso, tendríamos que volver a empezar el proceso desde el principio hasta que la verificación sea la correcta.</p>



<h3 class="wp-block-heading">Instalar Composer de modo global</h3>



<p class="wp-block-paragraph">Para poder utilizar Composer desde cualquier ubicación de nuestor equipo, vamos a instalarlo en /usr/local/bin</p>



<pre class="wp-block-code"><code>sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer</code></pre>



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



<pre class="wp-block-code"><code>All settings correct for using Composer
Downloading...

Composer (version X.X.X) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer</code></pre>



<p class="wp-block-paragraph">Si todo ha ido bien, lanzamos Composer desde el terminal y deberíamos ver algo así:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="572" src="https://danisanchez.net/wp-content/uploads/2019/12/imagen-1-2-1024x572.png" alt="" class="wp-image-8459" srcset="https://danisanchez.net/wp-content/uploads/2019/12/imagen-1-2-1024x572.png 1024w, https://danisanchez.net/wp-content/uploads/2019/12/imagen-1-2-300x168.png 300w, https://danisanchez.net/wp-content/uploads/2019/12/imagen-1-2-768x429.png 768w, https://danisanchez.net/wp-content/uploads/2019/12/imagen-1-2.png 1026w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Instalar librerías en nuestro proyecto usando Composer</h3>



<p class="wp-block-paragraph">Si decesitamos instalar una librería en nuestro proyecto web, solo tenemos que situarnos en el directorio de nuestro proyecto y ejecutar:</p>



<pre class="wp-block-code"><code>composer require vendor/name</code></pre>



<p class="wp-block-paragraph">Hay que sustituir vendor/name por el nombre de la librería.</p>



<p class="wp-block-paragraph">Normalmente se instala un directorio /vendor en nuestro proyecto con todos los archivos y dependencias de la librería referenciada.</p>



<p class="wp-block-paragraph">Para usarla solo tenemos que hacer <strong>require once</strong> en nuestro script PHP o archivo de funciones del proyecto y ya tendremos acceso a todas las funciones y métodos de la librería:</p>



<pre class="wp-block-code"><code>require once '/vendor/autoload.php';</code></pre>



<p class="wp-block-paragraph">Si usas Visual Studio Code, es tan sencillo como abrir un terminal en el directorio y ejecutar la orden:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1457" height="1017" src="https://danisanchez.net/wp-content/uploads/2020/03/imagen-2.png" alt="" class="wp-image-6561" srcset="https://danisanchez.net/wp-content/uploads/2020/03/imagen-2.png 1457w, https://danisanchez.net/wp-content/uploads/2020/03/imagen-2-300x209.png 300w, https://danisanchez.net/wp-content/uploads/2020/03/imagen-2-1024x715.png 1024w, https://danisanchez.net/wp-content/uploads/2020/03/imagen-2-768x536.png 768w" sizes="(max-width: 1457px) 100vw, 1457px" /></figure>



<p class="wp-block-paragraph">Y nada más, una vez terminado el proyecto, subimos todo al hosting (incluyendo el directorio /vendor).</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/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</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 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="(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>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>
		<item>
		<title>Taxonomías, para qué sirven y cómo crearlas (sin plugins)</title>
		<link>https://danisanchez.net/taxonomias-para-que-sirven-y-como-crearlas-sin-plugins/</link>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 08 Apr 2019 10:56:34 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación web]]></category>
		<category><![CDATA[publicaciones]]></category>
		<category><![CDATA[taxonomías]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=5320</guid>

					<description><![CDATA[Tras el último post en el que veíamos cómo crear custom posts, continuamos esta serie de artículos aprendiendo a generar nuestros propios contenidos en WordPress. Uno de los elementos más importantes son las taxonomías. Las taxonomías sirven para categorizar, organizar y filtrar nuestros contenidos de una forma mucho más concisa que utilizando el simple cajetín [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Tras el <a href="https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/" target="_blank" rel="noreferrer noopener">último post</a> en el que veíamos cómo crear custom posts, continuamos esta serie de artículos aprendiendo a generar nuestros propios contenidos en WordPress. Uno de los elementos más importantes son las <strong>taxonomías</strong>.</p>



<p class="wp-block-paragraph">Las taxonomías sirven para <em>categorizar, organizar y filtrar</em> nuestros contenidos de una forma mucho más concisa que utilizando el simple cajetín de categorías que WordPress incorpora por defecto. De hecho, tanto las categorías como las etiquetas de WordPress son en sí taxonomías. Veremos más adelante por qué.</p>



<p class="wp-block-paragraph">Continuando con el ejemplo del concesionario de vehículos, supongamos que necesitamos catalogar estos vehículos de diferentes formas. Por ejemplo, podríamos categorizarlos por tipo de vehículo: coche, camión, motocicleta&#8230;, pero también podríamos necesitar categorizarlo por el tipo de motor: diesel, gasolina, eléctrico&#8230;, por el número de puertas: 3, 4, 5&#8230;, por la marca, color, etc.</p>



<p class="wp-block-paragraph">En este caso, la categoría por defecto se nos quedaría corta, de ahí que necesitemos extender el número de «categorías» para definir correctamente el vehículo. Esa es la función principal de las taxonomías.</p>



<p class="wp-block-paragraph">Además, gracias a las taxonomías, podremos construir consultas personalizadas para mostrar únicamente las entradas que tengan marcadas esas taxonomías.</p>



<p class="wp-block-paragraph">Para declarar una taxonomía, utilizaremos como siempre, el archivo de funciones del tema activo (functions.php) o <a href="https://danisanchez.net/wordpress-crear-nuestro-propio-plugin-de-funciones/" target="_blank" rel="noreferrer noopener">nuestro propio plugin de funciones</a>. Podemos declarar todas las taxonomías que necesitemos utilizando la misma función.</p>



<h2 class="wp-block-heading">Declara una taxonomía</h2>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">function mis_taxonomias(){
    //Tipo de Vehículo
    $labels = array(
     'name' => _x('Tipo de Vehículo', 'taxonomy general name', 'twentysixteen'),
     'singular_name' => _x('Tipo de Vehículo', 'taxonomy_general_name', 'twentysixteen'),
     'search_items' => __('Buscar Tipo de Vehículo', 'twentysixteen'),
     'all_items' => __('Todos los Tipos de Vehículos', 'twentysixteen'),
     'parent_item' => __('Padre Tipo de Vehículo', 'twentysixteen'),
     'parent_item_colon' => __('Padre Tipo de Vehículo', 'twentysixteen'),
     'edit_item' => __('Editar Tipo de Vehículo', 'twentysixteen'),
     'update_item' => __('Actualizar Tipo de Vehículo', 'twentysixteen'),
     'add_new_item' => __('Añadir Nuevo Vehículo', 'twentysixteen'),
     'new_item_name' => __('Nuevo Tipo de Vehículo', 'twentysixteen'),
     'menu_name' => __('Tipo de Vehículo', 'twentysixteen'),
    );
    $args = array(
     'hierarchical'  => true,
     'labels'  => $labels,
     'show_ui'  => true,
     'show_admin_column'     => true,
     'query_var'  => true,
     'rewrite'  => array('slug' => 'tipo_de_vehiculo'),
    );
    register_taxonomy('tipo-vehiculo', array('vehiculos'), $args);
}
add_action('init','mis_taxonomias');</pre></code></pre>



<p class="wp-block-paragraph">La función <strong>register_taxonomy() </strong>es la encargada de declarar nuestras taxonomías personalizadas.</p>



<p class="wp-block-paragraph">La declaración es bastante similar a declarar un nuevo custom post. Por un lado recibe las etiquetas (labels) para los textos que se mostrará en el panel de WordPress, y por otro los argumentos (args) que definen las caracteríticas y el comportamiento.</p>



<p class="wp-block-paragraph">Los argumentos más interesantes son:</p>



<ul class="wp-block-list"><li><strong>hierarchical:</strong> su estado puede ser true o false. Si es true, la taxonomía mostrará los elementos a modo de listado para seleccionarlos tal y como se hace con las <strong>Categorías</strong> de WordPress. Si está en false, la taxonoḿia se verá como un campo de texto, donde insertaremos manualmente el nombre de los elementos de la taxonomía (como las <strong>Etiquetas</strong> de WordPress).</li><li><strong>rewrite:</strong> Donde especificaremos el slug de la taxonomía, que nos permitirá usar en un nuevo template para obtener un listado de las entradas que incluyan dicha taxonomía.</li></ul>



<p class="wp-block-paragraph">Una vez declarada, esta taxonomía se incluirá directamente como submenú dentro del menú de Vehículos (nuestro custom posts):</p>



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



<p class="wp-block-paragraph">Accediendo a la taxonomía podremos añadir elementos:</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="454" src="https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-elementos-taxonomia.jpg" alt="" class="wp-image-5324" srcset="https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-elementos-taxonomia.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-elementos-taxonomia-300x136.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/02.anadir-elementos-taxonomia-768x349.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Una vez creados los elementos de la taxomía, si añadimos un nuevo vehículo veremos el cajetín de la taxonomía, con su listado de elementos a modo de nueva categoría.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="463" src="https://danisanchez.net/wp-content/uploads/2019/04/03.vista-taxonomia-en-custom-post.jpg" alt="" class="wp-image-5326" srcset="https://danisanchez.net/wp-content/uploads/2019/04/03.vista-taxonomia-en-custom-post.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/03.vista-taxonomia-en-custom-post-300x139.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/03.vista-taxonomia-en-custom-post-768x356.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Aprovechando la misma funcion (mis_taxonomias()), vamos a añadir una nueva categoría pero de un estilo más «flexible», donde vamos a especificar los «extras» del vehículo: aire acondicionado, pintura metalizada, dirección asistida, navegador&#8230;). Para ello crearemos una taxonomía al estilo de <strong>Etiquetas</strong> de WordPress.</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">//Extras del Vehículo
    $labels = array(
     'name' => _x('Extras', 'taxonomy general name', 'twentysixteen'),
     'singular_name' => _x('Extras', 'taxonomy_general_name', 'twentysixteen'),
     'search_items' => __('Buscar Extras', 'twentysixteen'),
     'all_items' => __('Todos los Extras', 'twentysixteen'),
     'parent_item' => __('Padre Extras', 'twentysixteen'),
     'parent_item_colon' => __('Padre Extras', 'twentysixteen'),
     'edit_item' => __('Editar Extras', 'twentysixteen'),
     'update_item' => __('Actualizar Extras', 'twentysixteen'),
     'add_new_item' => __('Añadir Extras', 'twentysixteen'),
     'new_item_name' => __('Nuevo Extras', 'twentysixteen'),
     'menu_name' => __('Extras', 'twentysixteen'),
    );
    $args = array(
     'hierarchical'  => false,
     'labels'  => $labels,
     'show_ui'          => true,
     'show_admin_column'     => true,
     'query_var'  => true,
     'rewrite'  => array('slug' => 'extras'),
    );
    register_taxonomy('extras', array('vehiculos'), $args);</pre></code></pre>



<p class="wp-block-paragraph">Para conseguir el aspecto de taxonomía a modo de etiquetas, solo tenemos que definir el parámetro <strong>&#8216;hierarchical&#8217;</strong> en false.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="601" src="https://danisanchez.net/wp-content/uploads/2019/04/04.vista-taxonomia-en-custom-post.jpg" alt="" class="wp-image-5328" srcset="https://danisanchez.net/wp-content/uploads/2019/04/04.vista-taxonomia-en-custom-post.jpg 1000w, https://danisanchez.net/wp-content/uploads/2019/04/04.vista-taxonomia-en-custom-post-300x180.jpg 300w, https://danisanchez.net/wp-content/uploads/2019/04/04.vista-taxonomia-en-custom-post-768x462.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure></div>



<p class="wp-block-paragraph">Ahora que sabemos cómo declarar nuevas taxonomías, crearemos algunas más que usaremos para hacer pruebas.</p>



<p class="wp-block-paragraph">En el siguiente post veremos cómo crear campos personalizados internos para nuestro custom post, como por ejemplo, un campo para el precio, otro para el año de fabricación, el kilometraje (si el vehículo es usado), etc.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Crear un custom post en WordPress (sin plugins)</title>
		<link>https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/</link>
					<comments>https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/#comments</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Fri, 05 Apr 2019 08:09:47 +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=5307</guid>

					<description><![CDATA[En WordPress no estamos limitados a crear páginas internas y entradas de noticias, podemos crear nuestros propios contenidos a través de los llamados «custom posts«, es aquí donde nos damos cuenta del verdadero potencial de WordPress. Imaginemos que estamos desarrollando la web de un concesionario de vehículos y queremos publicarlos de forma que cada vehículo [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En WordPress no estamos limitados a crear páginas internas y entradas de noticias, podemos crear nuestros propios contenidos a través de los llamados «<em>custom posts</em>«, es aquí donde nos damos cuenta del verdadero potencial de WordPress.</p>



<p class="wp-block-paragraph">Imaginemos que estamos desarrollando la web de un concesionario de vehículos y queremos publicarlos de forma que cada vehículo se trate como una entrada individual, y así poder categorizarlos, añadirles etiquetas, realizar búsquedas, etc.</p>



<p class="wp-block-paragraph">Los <em>custom post</em> pueden ser declarados en el archivo de funciones del tema activo (functions.php) o en nuestro propio <a href="https://danisanchez.net/wordpress-crear-nuestro-propio-plugin-de-funciones/" target="_blank" rel="noreferrer noopener">plugin de funciones</a>.</p>



<h2 class="wp-block-heading">Declarar un custom post</h2>



<p class="wp-block-paragraph">La estructura básica para añadir el nuevo custom post sería:</p>



<pre class="wp-block-code"><code><pre class="wp-block-syntaxhighlighter-code">&lt;?php
//Custom Post Vehículos
function post_Vehiculos(){
 $labels = array(
 'name'               => _x('Vehículos', 'twentysixteen'),
 'singular_name'      => _x('Vehículo', 'post type singular name', 'twentysixteen'),
 'menu_name'          => _x('Vehículos', 'admin menu', 'gestiona-inmobiliaria'),
 'name_admin_bar'     => _x('Vehículos', 'add new on admin bar', 'twentysixteen'),
 'add_new'            => _x('Añadir Vehículo', 'book', 'twentysixteen'),
 'add_new_item'       => __('Añadir Nuevo Vehículo', 'twentysixteen'),
 'new_item'           => __('Nuevos Vehículos', 'twentysixteen'),
 'edit_item'          => __('Editar Vehículo', 'twentysixteen'),
 'view_item'          => __('Ver Vehículo', 'twentysixteen'),
 'all_items'          => __('Todos los Vehículos', 'twentysixteen'),
 'search_items'       => __('Buscar Vehículos', 'twentysixteen'),
 'parent_item_colon'  => __('Parent Vehículos:', 'twentysixteen'),
 'not_found'          => __('No se han encontrado Vehículos', 'twentysixteen'),
 'not_found_in_trash' => __('No se han encontrado Vehículos en la papelera', 'twentysixteen')
 );
 $args = array(
     'labels'             => $labels,
     'description'        => __('Description.', 'twentysixteen'),
     'public'             => true,
     'publicly_queryable' => true,
     'show_ui'            => true,
     'show_in_menu'       => true,
     'query_var'          => true,
     'rewrite'            => array('slug' => 'vehiculos'),
     'capability_type'    => 'post',
     'has_archive'        => true,
     'hierarchical'       => false,
     'menu_position'      => 6,
     'supports'           => array('title', 'editor', 'author', 'thumbnail'),
 );
 register_post_type('vehiculos', $args);
}
add_action('init', 'post_Vehiculos');
?></pre></code></pre>



<p class="wp-block-paragraph">La función contiene 2 elementos principales, las etiquetas ($labels) y los argumentos ($args).</p>



<p class="wp-block-paragraph">Las etiquetas hacen referencia a los textos que muestra WordPress acerca del custom post, tales como el nombre en singular, en plural, cómo se muestra en el menú, el texto para añadir uno nuevo, para editarlo, etc.</p>



<p class="wp-block-paragraph">Los argumentos tratan cómo se comportará el custom post, algunos parámetros interesantes son:</p>



<ul class="wp-block-list"><li><strong>rewrite</strong>: el slug que generará nuestro custom post, ejemplo: www.tudominio.com/<strong>vehiculos</strong>/url_del_post. Es importante escoger uno apropiado de cara al SEO.</li><li><strong>capability_type:</strong> especifica si el custom post se va a comportar como una página interna (para información fija) o como un post (entrada). Normalmente pondremos tipo post.</li><li><strong>has_archive: </strong>define si el custom post va a tener su propio archivo-listado de posts.</li><li><strong>menu_position:</strong> Controla en qué posición del menú aparecerá el nuevo custom post, por ejemplo, antes o después de las Entradas normales. Podemos jugar con el número hasta dejarlo donde queremos.</li><li><strong>supports</strong>: Define los elementos que podremos utilizar dentro del custom post, por ejemplo un campo para el título, el editor de WordPress, el autor y la imagen destacada (thumbnail).</li></ul>



<p class="wp-block-paragraph">Una vez declarado estará disponible en nuestro menú:</p>



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



<p class="wp-block-paragraph">Si añadimos un nuevo vehículo, veremos una pantalla de edición muy similar a las entradas, con su campo para el título, el editor de WordPress, la selección del autor y la imagen destacada:</p>



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



<p class="wp-block-paragraph">Sin embargo esto podríamos enriquecerlo mucho más, añadiendo categorías, taxonomías y campos personalizados que desatarán realmente todo el potencial de los custom post y que harán que podamos realizar prácticamente cualquier tipo de web.</p>



<p class="wp-block-paragraph">Veremos cómo integrarlos en siguientes posts.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/crear-un-custom-post-en-wordpress-sin-plugins/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
