Desde el lanzamiento de WordPress 3.0 esta plataforma ofrece la posibilidad de crear tipos de entradas personalizadas, de esta manera podemos cubrir necesidades más concretas que con las entradas por defecto de wordpress.

En este artículo veremos cómo crear un tipo de post “Proyectos” muy útil para quien quiera utilizar una página funcionando sobre WordPress cómo, por ejemplo,  portafolio personal.

Primero tenemos que declarar nuestro custom post en el archivo functions.php localizado en la raíz de nuestra Theme:

add_action( 'init', 'create_post_type_proyectos' );
function create_post_type_proyectos() {
	register_post_type( 'proyecto',
		array(
			'labels' => array(
				'name' => __( 'Proyectos' ),
				'singular_name' => __( 'Proyecto' )
			),
		'public' => true,
		'has_archive' => true,
		)
	);
}


Esta sería una declaración básica para nuestro post, como podemos ver solo definimos las etiquetas que aparecerán en nuestro panel de administración, lo declaramos como público y que tenga archivo. Si entramos en el panel de control de nuestro WordPress veremos como ya nos aparece «Proyectos» en el menú de la izquierda.

Ahora si queremos podemos definir algunas propiedades más:

add_action( 'init', 'create_post_type_proyectos' );
function create_post_type_proyectos() {
	register_post_type( 'proyecto',
		array(
			'labels' => array(
				'name' => __( 'Proyectos' ),
				'singular_name' => __( 'Proyecto' ),
				'singular_label' => __( 'Proyecto' ),
				'all_items' => __('Proyectos'),
				'add_new_item' => __('Añadir un proyecto nuevo'),
				'edit_item' => __('Editar proyecto')
			),
		'public' => true,
		'has_archive' => true,
		'capability_type' => 'post',
		'hierarchical' => true,
		'query_var' => true,
		'menu_position' => 5,
		'menu_icon' => get_stylesheet_directory_uri() . '/images/proyecto_icon.png',
		'rewrite' => array('slug' => 'proyectos'),
		'supports' => array('title','editor','thumbnail')
		)
	);
}

Con esta declaración hemos añadido algunas propiedades más a nuestro custom post proyectos, hemos definido más etiquetas para el panel de administración de wordpress, hemos modificado la posición por defecto de estos en el menú (5 es justo debajo de las entradas), hemos definido un icono personalizado para el menú que cogerá de la carpeta imágenes de nuestra theme, y le hemos dado soporte para que tenga imágenes destacadas o «thumbnails«.

Para ver más a fondo la función register_post_type() visitad la web del codex de WordPress:

Función register_post_type(); [ENG]

Ahora digamos que queremos poder ordenar o clasificar nuestro custom post según diferentes criterios, para eso existen las taxonomías, en nuestro caso particular podemos crear una taxonomáa con la categoría y otra con el cliente del proyecto, para crear las taxonomías debemos utilizar el siguiente código:

register_taxonomy("categoria", array("proyecto"), array("hierarchical" => true, "label" => "Categorías", "singular_label" => "Categoría",'query_var' => true, "rewrite" => true));
register_taxonomy("cliente", array("proyecto"), array("hierarchical" => true, "label" => "Clientes", "singular_label" => "Cliente",'query_var' => true, "rewrite" => true));

Con estas líneas declaramos el nombre de la taxonomía, a qué tipo de post queremos asignársela (en nuestro caso «Proyectos») si queremos que sea jerárquica (hierarchical) en este caso si la definimos como TRUE, esta taxonomía será del estilo de las categorías, si la definimos como FALSE, tendrá estructura de tags.

Función register_taxonomy(); [ENG]

Con esto ya tenemos nuestro custom post creado con sus taxonomías, ahora vamos a crear una plantilla en nuestro tema donde mostrar nuestros proyectos:

<?php
/*
Theme:Mi theme
Template name: Proyectos
*/
?>
<?php get_header(); ?>
<h1>Proyectos</h1>
<?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args=array('paged'=>$paged, 'post_type'=>'proyecto');
    query_posts($args);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div class="proyecto">
<h2><?php the_title(); ?></h2>
		<?php the_content(); ?>
		<?php
			$client = get_the_term_list( $post->ID, 'client', '<strong>Cliente:</strong> ', ', ', '',', ' );
			$categoria = get_the_term_list( $post->ID, 'categoria', '<strong>Categoria:</strong> ', ', ', '',', ' );
			echo $cliente.'<br />'.$categoria;
		?>
	</div>
<?php endwhile; ?>
<?php endif; ?>
<div class="navigation">
        <?php posts_nav_link(' ','&laquo; Siguientes proyectos', 'Proyectos anteriores'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Esta sería una plantilla básica para mostrar nuestros proyectos, la estructura es muy parecida a la que utilizaríamos para mostrar nuestros posts normales, las líneas importantes son las siguientes:

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args=array('paged'=>$paged, 'post_type'=>'proyecto');
query_posts($args);

Aquí le decimos a la consulta que busque los posts con el tipo de post ‘proyecto’ que nosotros hemos definido anteriormente en nuestro functions.php

Otro punto importante del código es como mostramos las taxonomías que hemos creado, lo hacemos mediante la función get_the_term_list();

$client = get_the_term_list( $post->ID, 'client', '<strong>Cliente:</strong> ', ', ', '',', ' );
$categoria = get_the_term_list( $post->ID, 'categoria', '<strong>Categoria:</strong> ', ', ', '',', ' );
echo $cliente.'<br />'.$categoria;

Llegados a este punto solo nos queda crear una nueva página en WordPress y asignarle nuestra plantilla proyectos, espero que os haya sido de ayuda.


( ! ) Notice: compact(): Undefined variable: limits in /home/mageekla/public_html/polsola/wp-includes/class-wp-comment-query.php on line 853
Call Stack
#TimeMemoryFunctionLocation
10.0004400960{main}( ).../index.php:0
20.0005401240require( '/home/mageekla/public_html/polsola/wp-blog-header.php' ).../index.php:17
30.736312402352require_once( '/home/mageekla/public_html/polsola/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.746712517472include( '/home/mageekla/public_html/polsola/wp-content/themes/polsola/single.php' ).../template-loader.php:74
50.864313875376comments_template( ).../single.php:78
60.864413876400WP_Comment_Query->__construct( ).../comment-template.php:1410
70.864413876400WP_Comment_Query->query( ).../class-wp-comment-query.php:302
80.864413876400WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
90.864513882288WP_Comment_Query->get_comment_ids( ).../class-wp-comment-query.php:395
100.864813888088compact ( ).../class-wp-comment-query.php:853

( ! ) Notice: compact(): Undefined variable: groupby in /home/mageekla/public_html/polsola/wp-includes/class-wp-comment-query.php on line 853
Call Stack
#TimeMemoryFunctionLocation
10.0004400960{main}( ).../index.php:0
20.0005401240require( '/home/mageekla/public_html/polsola/wp-blog-header.php' ).../index.php:17
30.736312402352require_once( '/home/mageekla/public_html/polsola/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.746712517472include( '/home/mageekla/public_html/polsola/wp-content/themes/polsola/single.php' ).../template-loader.php:74
50.864313875376comments_template( ).../single.php:78
60.864413876400WP_Comment_Query->__construct( ).../comment-template.php:1410
70.864413876400WP_Comment_Query->query( ).../class-wp-comment-query.php:302
80.864413876400WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
90.864513882288WP_Comment_Query->get_comment_ids( ).../class-wp-comment-query.php:395
100.864813888088compact ( ).../class-wp-comment-query.php:853

( ! ) Notice: compact(): Undefined variable: limits in /home/mageekla/public_html/polsola/wp-includes/class-wp-comment-query.php on line 853
Call Stack
#TimeMemoryFunctionLocation
10.0004400960{main}( ).../index.php:0
20.0005401240require( '/home/mageekla/public_html/polsola/wp-blog-header.php' ).../index.php:17
30.736312402352require_once( '/home/mageekla/public_html/polsola/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.746712517472include( '/home/mageekla/public_html/polsola/wp-content/themes/polsola/single.php' ).../template-loader.php:74
50.864313875376comments_template( ).../single.php:78
60.864413876400WP_Comment_Query->__construct( ).../comment-template.php:1410
70.864413876400WP_Comment_Query->query( ).../class-wp-comment-query.php:302
80.864413876400WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
90.865913913216WP_Comment_Query->fill_descendants( ).../class-wp-comment-query.php:461
100.866013917136get_comments( ).../class-wp-comment-query.php:975
110.866013917360WP_Comment_Query->query( ).../comment.php:226
120.866013917360WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
130.866013928576WP_Comment_Query->get_comment_ids( ).../class-wp-comment-query.php:395
140.866113934136compact ( ).../class-wp-comment-query.php:853

( ! ) Notice: compact(): Undefined variable: groupby in /home/mageekla/public_html/polsola/wp-includes/class-wp-comment-query.php on line 853
Call Stack
#TimeMemoryFunctionLocation
10.0004400960{main}( ).../index.php:0
20.0005401240require( '/home/mageekla/public_html/polsola/wp-blog-header.php' ).../index.php:17
30.736312402352require_once( '/home/mageekla/public_html/polsola/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.746712517472include( '/home/mageekla/public_html/polsola/wp-content/themes/polsola/single.php' ).../template-loader.php:74
50.864313875376comments_template( ).../single.php:78
60.864413876400WP_Comment_Query->__construct( ).../comment-template.php:1410
70.864413876400WP_Comment_Query->query( ).../class-wp-comment-query.php:302
80.864413876400WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
90.865913913216WP_Comment_Query->fill_descendants( ).../class-wp-comment-query.php:461
100.866013917136get_comments( ).../class-wp-comment-query.php:975
110.866013917360WP_Comment_Query->query( ).../comment.php:226
120.866013917360WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
130.866013928576WP_Comment_Query->get_comment_ids( ).../class-wp-comment-query.php:395
140.866113934136compact ( ).../class-wp-comment-query.php:853

( ! ) Notice: compact(): Undefined variable: limits in /home/mageekla/public_html/polsola/wp-includes/class-wp-comment-query.php on line 853
Call Stack
#TimeMemoryFunctionLocation
10.0004400960{main}( ).../index.php:0
20.0005401240require( '/home/mageekla/public_html/polsola/wp-blog-header.php' ).../index.php:17
30.736312402352require_once( '/home/mageekla/public_html/polsola/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.746712517472include( '/home/mageekla/public_html/polsola/wp-content/themes/polsola/single.php' ).../template-loader.php:74
50.864313875376comments_template( ).../single.php:78
60.864413876400WP_Comment_Query->__construct( ).../comment-template.php:1410
70.864413876400WP_Comment_Query->query( ).../class-wp-comment-query.php:302
80.864413876400WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
90.865913913216WP_Comment_Query->fill_descendants( ).../class-wp-comment-query.php:461
100.867313951624get_comments( ).../class-wp-comment-query.php:975
110.867313951848WP_Comment_Query->query( ).../comment.php:226
120.867313951848WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
130.867313963064WP_Comment_Query->get_comment_ids( ).../class-wp-comment-query.php:395
140.867413968624compact ( ).../class-wp-comment-query.php:853

( ! ) Notice: compact(): Undefined variable: groupby in /home/mageekla/public_html/polsola/wp-includes/class-wp-comment-query.php on line 853
Call Stack
#TimeMemoryFunctionLocation
10.0004400960{main}( ).../index.php:0
20.0005401240require( '/home/mageekla/public_html/polsola/wp-blog-header.php' ).../index.php:17
30.736312402352require_once( '/home/mageekla/public_html/polsola/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.746712517472include( '/home/mageekla/public_html/polsola/wp-content/themes/polsola/single.php' ).../template-loader.php:74
50.864313875376comments_template( ).../single.php:78
60.864413876400WP_Comment_Query->__construct( ).../comment-template.php:1410
70.864413876400WP_Comment_Query->query( ).../class-wp-comment-query.php:302
80.864413876400WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
90.865913913216WP_Comment_Query->fill_descendants( ).../class-wp-comment-query.php:461
100.867313951624get_comments( ).../class-wp-comment-query.php:975
110.867313951848WP_Comment_Query->query( ).../comment.php:226
120.867313951848WP_Comment_Query->get_comments( ).../class-wp-comment-query.php:346
130.867313963064WP_Comment_Query->get_comment_ids( ).../class-wp-comment-query.php:395
140.867413968624compact ( ).../class-wp-comment-query.php:853

7 comentarios en “Cómo crear un Custom Post en WordPress

  1. Miguel

    2 febrero 2012 el 0:37

    Primero de todo, muchas felicidades. Entradas muy concretas y muy bien explicadas. Muy útiles las dos de WordPress y la de CSS3. Ánimo!

    Una duda sobre esta entrada…

    ¿Se podría cambiar el nombre de Entradas por Proyectos simplemente (así como cambiar cualquier otra mencion a Entrada) sin necesidad de crear un custom post nuevo?

    Gracias!

    PD: He ido a Sobre Mi y me he quedado con las ganas de saber más sobre tu persona. No sale nada. Un saludo!

    • Pol

      2 febrero 2012 el 11:07

      Hola Miguel, primero de todo muchas gracias por comentar 🙂 este blog lo inicié hace poco y lo voy llevando en mi tiempo libre asi que poco a poco iré metiendo todo el contenido que falta…

      De lo que me comentas hay una practica muy útil para estos casos

      add_filter( ‘gettext’, ‘change_post_to_article’ );
      add_filter( ‘ngettext’, ‘change_post_to_article’ );

      function change_post_to_article( $translated )
      {
      $translated = str_replace( ‘Entradas’, ‘Notícias’, $translated );
      $translated = str_replace( ‘entradas’, ‘notícias’, $translated );
      return $translated;
      }

      Con este código cambiarias el nombre de «Entradas» por «Notícias».
      Otra opción es desactivar el menú de notícias y dejar tu custom post «Proyectos» en su sitio, mi próxima entrada va a ir sobre esto. Espero haberte ayudado!

  2. Miguel

    3 febrero 2012 el 20:21

    Hola, Pol

    Sí, me has ayudado mucho. Gracias. No obstnate, la traducción de Entradas por Noticias no la arrastra para todo el panel. Me explico. En el menú he visto cambiado Entradas por Noticias pero no así cuando entro dentro de la opción. ¿Alguna solución para que se cambie a lo largo de toda la navegación? De todas formas, probaré a crear un Custom Post también y así cojo soltura.

    Un saludo y gracias de nuevo.

    Estupendo el nuevo post!

    • Pol

      4 febrero 2012 el 13:05

      Entonces Miguel quizás la mejor solución es la que comentas tu, puedes crear un custom post «notícias» y ocultar la opción de «Entradas» del menú, en el último post puedes ver como hacerlo. Si ocultas «entradas» y al custom-post notícias le pones posición en el menú ‘5’, será como cambiar una por la otra.
      Espero que te sirva 🙂

  3. Pol

    27 marzo 2012 el 12:46

    Miguel, hoy he leido este articulo, es un poco tarde, pero creo que es lo que buscas 🙂

    http://wp.tutsplus.com/tutorials/creative-coding/customizing-your-wordpress-admin/

  4. Alejandro

    28 noviembre 2012 el 18:14

    Gran Entrada!! Pero tengo una duda hay alguna manera para que cuando utilizas el plugin de multilenguaje WPML tenga en cuenta tambien los tipos de posts nuevos?? Es decir solo me da la opcion de poner en varios idomas las entradas tipicas, las que he creado yo no!

    • Pol

      28 noviembre 2012 el 19:15

      Hola Alejandro muchas gracias por comentar, WPML por defecto no traduce los custom post, pero puedes marcarlos como traducibles desde la página de configuración del plugin, dentro de «Opciones de traducción», una vez lo hagas veras como automáticamente aparecen las banderas

      Un saludo,
      Pol

Deja un comentario