Cómo crear Custom Post Type (CPT) sin plugin

Publicado el Categorías: WordPress

En los inicios de WordPress sólo existían las entradas o post. No había páginas; y es que sí, WordPress nació como un CMS para blogs. Posteriormente se añadieron las páginas, que no es más que un tipo de post. Lo que pasa es que se decidió crear este tipo de post llamado páginas para crear contenido más «estático».

Pero estos dos tipos de contenido no son los único que tiene WordPress por defecto. Los diferentes tipos de contenido que trae WordPress de serie son:

  • Entradas
  • Páginas
  • Medios
  • Revisiones, que sirven para almacenar las revisiones de un post publicado.
  • Menú de navegación
  • CSS personalizado. El CSS que añadimos en el personalizador de WordPress se almacena en la base de datos, como si fuese un tipo de post.
  • Changesets, o conjunto de cambios. Es como un autoguardado, pero del personalizador de WordPress

Bien, pues desde la versión 3.0 de WordPress, podemos crear nuesto tipos de post personalizados, o Custom Post Types (CPT).

¿Qué son los Custom Post Types?

Los CPT nacen de la necesidad de tener la información de nuestro sitio web bien organizado. Podemos crear diferentes tipos de post para tener información concreta, y con las características que se quiera.

Es decir, no es lo mismo un portfolio de trabajos que un calendario de eventos por ejemplo. Y es que WordPress no sólo nos da la posibilidad de crear diferentes tipos de post, sino que además podemos darles diferentes características.

Podemos hacer que tengo o no la imgen destacada, que sea jerárquico, que tenga su propia taxonomía, etc. Os recomiendo que echéis un vistazo a la página del Codex de WordPress que habla de la función register_post_type(): https://codex.wordpress.org/Function_Reference/register_post_type

Desde mi punto de vista, no hay que tener miedo de crear todos los Custom Post Types que sean necesarios. Facilitaremos mucho la vida de nuestros clientes; y más si lo completamos con custom fields para que añadan la información estrictamente necesaria necesaria sin complicarse.  Pero esto lo trataremos en otro post.

Cómo crear Custom Post Types

Para crear un CPT en WordPress podemos hacerlo como siempre: mediante un plugin o mediante código.

En el repositorio de plugins de WordPress hay un montón de plugins que nos ayudarán a crear nuestros propios Custom Post Types. Mira https://wordpress.org/plugins/search/custom+post+type/

Pero os voy a demostrar que es muy sencillo crearse por código un CPT

Crear un Custom Post Type mediante código

Crear un CPT mediante código es algo tan sencillo como lo siguiente:

function create_post_type() {
  register_post_type( 'acme_product',
    array(
      'labels' => array(
        'name' => __( 'Products' ),
        'singular_name' => __( 'Product' )
      ),
      'public' => true,
      'has_archive' => true,
    )
  );
}
add_action( 'init', 'create_post_type' );

Con este código básico ya tendríamos creado el CPT Products con el identificador acme_product.

Pero vamos a completarlo un poco más, haciendo un ejemplo completo. Vamos a crear un Custom Post Type de Trabajos. En nuestro ejemplo, para crear un CPT, lo haremos en dos pasos:

  • Crear la taxonomía
  • Crear el CPT

Crear la taxonomía

La taxonomías son un elemento realmente poderoso de WordPress, aunque menos utilizado de lo que se debería. Quizás porque es algo que a todo el mundo le suena, pero pocos saben realmente para qué sirve. Información del Codex de WordPress: https://codex.wordpress.org/es:Taxonom%C3%ADas

Pues bien, es algo tan sencillo como decir que nos sirve para clasificar la información de un tipo de post. Por ejemplo, si tenemos un CPT de «deportes», podemos crear diferentes taxonomías: fútbol, baloncesto, petanca, …

En WordPress, por defecto, nos trae de serie dos taxonomías: categorías y etiquetas. Pero podemos crear diferentes taxonomías para cada CPT.

En nuestro ejemplo, vamos a crear una taxonomía llamada «Tipos de Trabajo» para poder agruprar los trabajos por diferentes tipos: programación, diseño, etc. El nombre de los tipos de trabajo es lo de menos porque, al igual que las categorías, puede ser el propio usuario el que las cree.

La función para crear la taxonomía es register_taxonomy(). Codex de WordPress: https://codex.wordpress.org/Function_Reference/register_taxonomy 

Y en nuestro caso sería:

// Registrar la taxonomia
function fgr_trabajos_taxonomia() {

    // Definimos un array para las traducciones de la taxonomía
    $etiquetas = array(
        'name' => __( 'tipos' ),
        'singular_name' => __( 'Tipo de Trabajo' ),
        'search_items' =>  __( 'Buscar Tipos de Trabajo' ),
        'all_items' => __( 'Todos los Tipos de Trabajo' ),
        'parent_item' => __( 'Tipo de Trabajo padre' ),
        'parent_item_colon' => __( 'Tipo de Trabajo padre:' ),
        'edit_item' => __( 'Editar Tipo de Trabajo' ),
        'update_item' => __( 'Actualizar Tipo de Trabajo' ),
        'add_new_item' => __( 'Agregar un nuevo Tipo de Trabajo' ),
        'menu_name' => __( 'Tipos de Trabajo' ),
    );


    // Función WordPress para registrar la taxonomía
    register_taxonomy(
        'tipos',
        array('trabajos'), // Tipos de Post a los que asociaremos la taxonomía
        array(
            'hierarchical' => true, // True para taxonomías del tipo "Categoría" 
//y false para el tipo "Etiquetas"
            'labels' => $etiquetas, // La variable con las traducciones de las etiquetas
            'show_ui' => true,
            'show_admin_column' => true,
            'query_var' => true,
            'rewrite' => array( 'slug' =>; 'tipos-de-trabajos' ),
        )
    );

}
add_action( 'init', 'fgr_trabajos_taxonomia', 0 );

Registrar el Custom Post Type (CPT)

Una vez creada la taxonomía, necesitamos crear nuestro Custom Post Type (CPT), llamado «Trabajos«.  Esto se hace con la función de WordPress register_post_type(). Codex de WordPress: https://codex.wordpress.org/Function_Reference/register_post_type 

En nuestro caso sería los iguiente:

function fgr_trabajos_cpt() {

 	$labels = array(
 		'name'                  => _x( 'Trabajos', 'Post Type General Name', 'fgr' ),
 		'singular_name'         => _x( 'Trabajo', 'Post Type Singular Name', 'fgr' ),
 		'menu_name'             => __( 'Trabajos', 'fgr' ),
 		'name_admin_bar'        => __( 'Trabajos', 'fgr' ),
 		'archives'              => __( 'Trabajos Archivos', 'fgr' ),
 		'attributes'            => __( 'Trabajos Atributos', 'fgr' ),
 		'parent_item_colon'     => __( 'Trabajo superior', 'fgr' ),
 		'all_items'             => __( 'Todos los Trabajos', 'fgr' ),
 		'add_new_item'          => __( 'Añadir nuevo Trabajo', 'fgr' ),
 		'add_new'               => __( 'Añadir nuevo', 'fgr' ),
 		'new_item'              => __( 'Nuevo Trabajo', 'fgr' ),
 		'edit_item'             => __( 'Editar Trabajo', 'fgr' ),
 		'update_item'           => __( 'Actualizar Trabajo', 'fgr' ),
 		'view_item'             => __( 'Ver Trabajo', 'fgr' ),
 		'view_items'            => __( 'Ver Trabajos', 'fgr' ),
 		'search_items'          => __( 'Buscar Trabajo', 'fgr' ),
 		'not_found'             => __( 'No encontrado', 'fgr' ),
 		'not_found_in_trash'    => __( 'No encontrado en la papelera', 'fgr' ),
 		'featured_image'        => __( 'Imagen destacada', 'fgr' ),
 		'set_featured_image'    => __( 'Establecer imagen destacada', 'fgr' ),
 		'remove_featured_image' => __( 'Borrar imagen destacada', 'fgr' ),
 		'use_featured_image'    => __( 'Usar como imagen destacada', 'fgr' ),
 		'insert_into_item'      => __( 'Insertar en Trabajo', 'fgr' ),
 		'uploaded_to_this_item' => __( 'Subido a este Trabajo', 'fgr' ),
 		'items_list'            => __( 'Listado de Trabajos', 'fgr' ),
 		'items_list_navigation' => __( 'Navegación Trabajos', 'fgr' ),
 		'filter_items_list'     => __( 'Filtrar Trabajos', 'fgr' ),
 	);
 	$args = array(
 		'label'                 => __( 'Trabajo', 'fgr' ),
 		'description'           => __( 'Entradas tipo trabajos / proyectos', 'fgr' ),
 		'labels'                => $labels,
 		'supports'              => array( 'title', 'editor', 'thumbnail', 'custom-fields' ),
 		'taxonomies'            => array( 'tipos' ),
 		'hierarchical'          => false,
 		'public'                => true,
 		'show_ui'               => true,
 		'show_in_menu'          => true,
 		'menu_position'         => 5,
 		'menu_icon'             => 'dashicons-megaphone',
 		'show_in_admin_bar'     => true,
 		'show_in_nav_menus'     => true,
 		'can_export'            => true,
 		'has_archive'           => true,
 		'exclude_from_search'   => false,
 		'publicly_queryable'    => true,
 		'capability_type'       => 'post',
 		'show_in_rest'          => true,
 	);
 	register_post_type( 'trabajos', $args );

 }
 add_action( 'init', 'fgr_trabajos_cpt', 0 );

Algunas aclaraciones:

  • Primero definimos una variable de tipo array, $labels, que simplemente contendrá el texto que aparecerá en las diferentes opciones de nuestro CPT.
  • En la otra variable de tipo array, $args, vamos añadiendo los diferentes argumentos de nuestro CPT. Podéis ver un listado completo en el enlace del Codes de WordPress.
  • Algunos argumentos interesantes cuando creamos el CPT:
    • ‘supports’. Aquí indicamos qué elementos va a tener nuestro CPT. Si no indicamos nada, por defecto sólo contendrá el título y el editor de texto. En nuestro caso le estamos añadiendo también la imagen destacada y soporte para custom fields o campos personalizados.
    • ‘taxonomies’. Le indicamos que nuestra taxonomía va a ser la creada anteriormente, «tipos».
    • Para todas las demás opciones os invito a leer detenidamente la página del Codex de WordPress.

 

Tanto en la función de registrar la taxonomía, como en la de registrar el CPT, utilizamos el hook de WordPress ‘init‘. Este hook se ejecuta inmediatamente después de cargar el WordPress. Es decir, en cuanto carga el core de WordPress, nos creará nuestra taxonomía y nuestro CPT.

Bien pero, ¿dónde se añade este código?

Esto es lo más sencillo 🙂  Para añadir este código tenemos dos opciones:

Una es añadirlo en el archivo functions.php del tema que tenemos activo. Dentro de la carpeta de nuestro tema activo, editamos el archivo functions.php y añadimos ese código y ya está. No tenemos que hacer más.

Pero haciéndolo de esta forma nos podremos encontrar con un problema en el futuro. Y es que cuando cambiemos de tema (que os aseguro que algún día se cambiará) perderemos nuestro CPT.

Lo normal es que queramos conservar el CPT Trabajos para seguir mostrando o añadiendo contenido a ese tipo de post. Entonces lo que podemos hacer es crear nuestro propio plugin con este código.

Es muy sencillo crearse un plugin de este tipo. Es más, podemos crear este código en un plugin que esté ahí siempre y que ningún usuario o administrador de WordPress pueda ni desactivarlo ni eliminarlo. Pero, ¿cómo? Creando un «must use plugin» o «plugin imprescindible«.

Creando un plugin imprescindible o must use plugin

No me voy a extender demasiado en esto, que ya se está haciendo demasiado largo. Simplemente decir que los plugins que creemos de esta manera nos e pueden desactivar desde el WordPress como cualquier otro plugin. Y tampoco eliminar. La única manera de eliminarlo es acceder por ftp y borrarlo.

Lo primero para crear este tipo de plugin es acceder por ftp a la carpete «wp-content» de nuestra instalación de WordPress. Ahí creamos una carpeta nueva, si no está creada, que se llame «mu-plugins«.
Y surge la magia!! Todos los plugins que metamos dentro de esta carpeta aparecerán como «imprescindibles» dentro de la sección plugins de nuestro WordPress. Y ningún usuario lo podrá desactivar ni borrar. Chulo ¿no?

Bien, pues ahí solo debemos de crear por ftp un archivo con extensión php, en mi caso fgr.php

Lo editamos y escribimos los siguiente:

<?php
/*
Plugin Name: Funciones para aumentar funcionalidades
Plugin URI: http://fgrweb.es
Description: Plugin para liberar de funciones el fichero functions.php y ser mas limpio todo. 
Version: 0.0.1 
Author: Fernando Garcia Rebolledo 
Author URI: http://fgrweb.es 
License: GPLv2 o posterior 
*/

Evidentemente podeis cambiar las referencias a fgr por vuestro nombre, o lo que queráis. A continuación pegáis el código de creación de taxonomía y creación de cpt y listo. Aunque se cambie de tema, al tener el código dentro de este plugin imprescindible, siempre vais a tener el CPT Trabajos.

 

Y eso es todo. Me ha quedado un poco máslargo de lo que me esperaba, pero bueno.

Espero que haya quedado claro. Espero vuestro feedback!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *