<?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>custom post &#8211; danisanchez.net</title>
	<atom:link href="https://danisanchez.net/tag/custom-post/feed/" rel="self" type="application/rss+xml" />
	<link>https://danisanchez.net</link>
	<description></description>
	<lastBuildDate>Wed, 28 Aug 2019 06:18:18 +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>custom post &#8211; danisanchez.net</title>
	<link>https://danisanchez.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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="(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 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="(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 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="(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>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>
