Creación de Custom Post Type en Wordpress

  • Por
En el siguiente artículo vamos a ver cómo crear de forma manual los custom post type de Wordpress.

Antes de comenzar se que todos estaréis pensando para crearlos a mano si existen ya plugin que lo hacen y nos resuelven el problema. Bien esa es una solución y al final del artículo os pasare algunos plugins que hacen lo mismo que vamos a explicar aquí, pero en mi humilde opinión hay que saber lo que hace un plugin por si en algun momento deja de funcionar y nos vemos obligados a tocar el código. Además siempre es bueno saber hacer este tipo de cosas si quieres ser un buen experto de wordpress.

¿Qué son los Custom Post Type?

Los Custom Post Type no son otra cosa que entradas personalizadas en Wordpress, es decir, igual que tenemos entradas y páginas, podemos crearnos una entrada propia por ejemplo llamada Libros, para mostrar libros, de la misma forma que mostramos paginas y entradas de blog.

El problema es que por defecto wordpress no permite hacer este tipo de entradas personalizas. Nos obliga a utilizar plugins o tocar el código para poderlas crear y mostrar.

Para crear a mano una entrada personalizada lo primero que tenemos que hacer es irnos al archivo functions.php de nuestro theme de wordpress. Es ahí donde tendremos que agregar el código necesario para nuestro fín.

Una vez dentro de functions.php tendremos que añadir el siguiente código:

// La función no será utilizada antes del 'init'.
add_action( 'init', 'my_custom_init' );


function my_custom_init() {
        $labels = array(
        'name' => _x( 'Libros', 'post type general name' ),
        'singular_name' => _x( 'Libro', 'post type singular name' ),
        'add_new' => _x( 'Añadir nuevo', 'book' ),
        'add_new_item' => __( 'Añadir nuevo Libro' ),
        'edit_item' => __( 'Editar Libro' ),
        'new_item' => __( 'Nuevo Libro' ),
        'view_item' => __( 'Ver Libro' ),
        'search_items' => __( 'Buscar Libros' ),
        'not_found' =>  __( 'No se han encontrado Libros' ),
        'not_found_in_trash' => __( 'No se han encontrado Libros en la papelera' ),
        'parent_item_colon' => ''
    );
 
    // Creamos un array para $args
    $args = array( 'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
    );
 
    register_post_type( 'libro', $args ); 
}

Como podéis comprobar el código no es muy complicado y tan solo necesitamos cambiar los textos para que aparezca tal como queremos en el escritorio.

Bien con esto tenemos una entrada personalizada creada y que aparece en nuestro escritorio, pero si nos fijamos no tenemos taxonomía para libros, es decir, no tenemos ni categorías (que podría ser géneros en este ejemplo), ni autores. Bien pues vamos a ver como creamos las taxonomías.

Para ello es necesario el siguiente código:

// Lo enganchamos en la acción init y llamamos a la función create_book_taxonomies() cuando arranque
add_action( 'init', 'create_book_taxonomies', 0 );
 
// Creamos dos taxonomías, género y autor para el custom post type "libro"
function create_book_taxonomies() {
        // Añadimos nueva taxonomía y la hacemos jerárquica (como las categorías por defecto)
        $labels = array(
        'name' => _x( 'Géneros', 'taxonomy general name' ),
        'singular_name' => _x( 'Género', 'taxonomy singular name' ),
        'search_items' =>  __( 'Buscar por Género' ),
        'all_items' => __( 'Todos los Géneros' ),
        'parent_item' => __( 'Género padre' ),
        'parent_item_colon' => __( 'Género padre:' ),
        'edit_item' => __( 'Editar Género' ),
        'update_item' => __( 'Actualizar Género' ),
        'add_new_item' => __( 'Añadir nuevo Género' ),
        'new_item_name' => __( 'Nombre del nuevo Género' ),
);
register_taxonomy( 'genero', array( 'libro' ), array(
        'hierarchical' => true,
        'labels' => $labels, /* Aquí es donde se utiliza la variable $labels que hemos creado arriba*/
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'genero' ),
));
// Añado otra taxonomía, esta vez no es jerárquica, como las etiquetas.
$labels = array(
        'name' => _x( 'Escritores', 'taxonomy general name' ),
        'singular_name' => _x( 'Escritor', 'taxonomy singular name' ),
        'search_items' =>  __( 'Buscar Escritores' ),
        'popular_items' => __( 'Escritores populares' ),
        'all_items' => __( 'Todos los escritores' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Editar Escritor' ),
        'update_item' => __( 'Actualizar Escritor' ),
        'add_new_item' => __( 'Añadir nuevo Escritor' ),
        'new_item_name' => __( 'Nombre del nuevo Escritor' ),
        'separate_items_with_commas' => __( 'Separar Escritores por comas' ),
        'add_or_remove_items' => __( 'Añadir o eliminar Escritores' ),
        'choose_from_most_used' => __( 'Escoger entre los Escritores más utilizados' )
);
 
register_taxonomy( 'escritor', 'libro', array(
        'hierarchical' => false,
        'labels' => $labels, 
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'escritor' ),
));
}

Como veis es muy parecida a la anterior pero en esta hacemos referencia a la entrada personalizada a la que queremos añadir las taxonomías, recordando que se debe añadir al archivo functions.php de nuestro theme.

Con esto ya tenemos creado nuestro Custom Post Type manualmente. Pero todavia nos quedaría un paso más, que es el de añadir campos personalizados a nuestro nuevo tipo de entrada. Esto lo explicaremos en otro artículo ya que es bastante amplio y no quiero agobiaros con tanto código.

Plugins para creación de Custom Post Type

Tal como os prometí al inicio del artículo os dejo unos plugins que te crean estos tipos de entradas personalizadas.

  • Custom Post Type UI (https://wordpress.org/plugins/custom-post-type-ui/): es el más conocido. Muy intuitivo y sencillo de utilizar. Necesitaremos de un diseñador para la parte del front ya que no genera plantilla para mostrar el nuevo tipo de Post.

  • Types (https://wordpress.org/plugins/types/): muy similar al anterior. Además de crear entradas personalizadas, permite crear taxonomías y campos individualizados.

  • Pods (https://wordpress.org/plugins/pods/): se trata de un plugin de lo más completo realiza todo lo anteriormente citado en los otros plugins, pero además cuenta con plantillas y otras muchas opciones.

    También podéis ayudaros de este generador de código que simplifica un poco la tarea si lo deseas hacer manualmente: http://generatewp.com/post-type/

Autor

Sara Alvarez

Equipo DesarrolloWeb.com

Compartir

Comentarios

alpaezes

12/11/2015
Mostrar página de resultados de taxonomía
Muy interesante el artículo pero tengo una duda. He creado un custom post type y he generado varias taxonomías, pero a la hora de mostrar la página de resultados de una taxonomía me aparece como título "archivos" en vez del nombre de la taxonomía, ¿cómo puedo modificarlo para que muestre en el título el nombre de la taxonomía que está mostrando?
Gracias por vuestra aportación

Hugo

06/4/2017
Genial artículo :)
Enhorabuena Sara, está muy bien explicado. Muy útil.
En mi caso, tengo una duda, espero explicarla bien porque no soy muy ducho en el tema.
Mi blog es una especie de tube, por lo que todas las entradas incluyen un campo obligatorio para vídeo.
Quiero crear un tipo de entrada que no incluya el vídeo.
¿Hay algún modo de "llamar" a otro archivo en lugar de "single.php"?
En mi caso, por ejemplo:
- Llamaría a (...)/theme/single.php
- Querría llamar, por ejemplo, a (...)/theme/single-nuevopost.php
Yo en "single-nuevopost.php" habría eliminado esa obligatoriedad de utilizar el vídeo.
¿Sería esto posible? Agradezco mucho su tiempo y la ayuda. ¡Saludos!