19, septiembre - 2019

¿Cómo crear un Custom Post Type en WordPress?

En esta entrada vamos a ver cómo podemos crear nuestros propios tipos de post en el sistema CMS de WordPress. Los denominados cpt (Custom Post Types). Junto con dos taxonomías propias del cpt y dos metaboxes también propias de nuestro cpt recién creado.
De esa forma, cada vez que necesitemos un nuevo tipo de publicaciones, por ejemplo, imaginemos que necesitamos registrar Libros, y que queremos que tengan la misma estructura que tienen los post del sistema, lo podremos hacer sin ninguna dificultad y de esa forma, expandir los contenidos de nuestro sitio web desarrollado en WordPress.

¡¡¡Comencemos!!!

¿Qué es un Custom Post Type?

Los cpt son tipos de post personalizados,  o lo que es igual, tipos de contenido únicos, creados por nosotros según nuestras necesidades específicas para cada página desarrollada en WordPress.

Ya sabemos que el sistema WP en su zona de administración o backend, tiene una serie de botones en la parte izquierda que nos van a permitir ir creando nuevos contenidos en la web. El botón de Entradas o el de Páginas son dos de ellos.
¿Y si además de esos tipos de contenidos queremos poner nosotros algunos propios..? En ese caso vamos a necesitar la creación del Custom Post Type.

¿Dónde se puede colocar el código fuente para programar un cpt?

Para poder crear nuestros propios tipos de post vamos a necesitar, a no ser que usemos un plugin, cosa que desaconsejamos si lo único que queremos es crear el cpt. Bien, como decía, vamos a necesitar programar dicho ctp, las líneas de código que veremos a continuación y que serán las que creen el ctp pueden ponerse en varias partes del sistema de WordPress.
Veamos qué partes son éstas.

  1. – En el archivo functions.php de tu theme activo.
    El archivo functions.php sería en principio, el lugar más sencillo para colocar el code que cree nuestro ctp. Está pensado justo para estas labores, para ejecutar cualquier función o poo (objeto de programación) que necesite nuestra web. De esa forma, si ponemos en él los códigos para crear el ctp, éste será creado antes de que el navegador cargue nuestro sitio web desarrollado con WordPress.
  2. – En alguno de los archivos que conformen un plugin que se esté desarrollando, o un plugin existente.
    Si lo que estamos creando es un plugin, y éste va a necesitar sus propios tipos de contenido. Podemos crear el código fuente dentro de los códigos de ese plugin para que muestre los ctp que vaya a necesitar.
  3. – En los archivos que conformen un theme que se esté desarrollando, o un theme existente.
    De igual forma, si lo que estamos desarrollando es un nuevo theme para WP, dentro de los archivos de programación de dicho template podemos insertar los códigos que generen los ctp que se vayan a necesitar. Con un matiz, es mucho más práctico desarrollar un plugin separado del theme y en él crear los ctp o diferentes funcionalidades que vaya a necesitar el theme. De esa forma, si necesitamos realizar algún cambio o actualización, podremos lanzar esa actualización en el plugin sin necesidad de alterar el theme o de tener que actualizarlo. Algo por lo que ya están optando muchos desarrolladores de WP.

¿Cómo se puede programar un Custom Post Type?

Ahora sí. Vamos a lo que nos interesa, la programación del tipo de post personalizado. Lo vamos a hacer de dos formas, una por programación convencional o por funciones, ideal para el archivo functions.php del theme con el que estemos trabajando. Y otra por programación orientada a objetos o poo, ideal para el desarrollo de un supuesto plugin o template.

Código desarrollado en funciones para crear un cpt.

Algunas consideraciones a tener en cuenta para que lo podáis usar de forma correcta. La palabra clave que debéis cambiar por la vuestra propia es ‘books’, todo en minúsculas. Ahí pondréis vosotros la que corresponda, el código está desarrollado para soportar las traducciones del sistema, en este caso el archivo de traducción se encontrará en el theme que estemos usando, de esa forma, la palabra clave que tendréis que sustituir será ‘themetraduction’ por el nombre de vuestro theme, y después generar de nuevo el archivo de traducción, .mo .po.

function create_custom_post_books() {
$labels = array(
'name' => _x( 'Books', 'Post Type General Name', 'themetraduction' ),
'singular_name' => _x( 'Book', 'Post Type Singular Name', 'themetraduction' ),
'menu_name' => __( 'Books', 'themetraduction' ),
'name_admin_bar' => __( 'Manager Books', 'themetraduction' ),
'archives' => __( 'Item Archives', 'themetraduction' ),
'attributes' => __( 'Item Attributes', 'themetraduction' ),
'parent_item_colon' => __( 'Parent Item:', 'themetraduction' ),
'all_items' => __( 'All Items', 'themetraduction' ),
'add_new_item' => __( 'Add New Item', 'themetraduction' ),
'add_new' => __( 'Add New', 'themetraduction' ),
'new_item' => __( 'New Item', 'themetraduction' ),
'edit_item' => __( 'Edit Item', 'themetraduction' ),
'update_item' => __( 'Update Item', 'themetraduction' ),
'view_item' => __( 'View Item', 'themetraduction' ),
'view_items' => __( 'View Items', 'themetraduction' ),
'search_items' => __( 'Search Item', 'themetraduction' ),
'not_found' => __( 'Not found', 'themetraduction' ),
'not_found_in_trash' => __( 'Not found in Trash', 'themetraduction' ),
'featured_image' => __( 'Featured Image', 'themetraduction' ),
'set_featured_image' => __( 'Set featured image', 'themetraduction' ),
'remove_featured_image' => __( 'Remove featured image', 'themetraduction' ),
'use_featured_image' => __( 'Use as featured image', 'themetraduction' ),
'insert_into_item' => __( 'Insert into item', 'themetraduction' ),
'uploaded_to_this_item' => __( 'Uploaded to this item', 'themetraduction' ),
'items_list' => __( 'Items list', 'themetraduction' ),
'items_list_navigation' => __( 'Items list navigation', 'themetraduction' ),
'filter_items_list' => __( 'Filter items list', 'themetraduction' ),
);
$args = array(
'label' => __( 'Book', 'themetraduction' ),
'description' => __( 'Custom post type books', 'themetraduction' ),
'labels' => $labels,
'rewrite'            => array( 'slug' => 'book' ),
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'revisions' ),
//'taxonomies' => array( 'category', 'post_tag' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 10,
'menu_icon' => 'dashicons-book',
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true
);
register_post_type( 'books', $args );
}
add_action( 'init', 'create_custom_post_books', 0 );

El mismo código por objetos de programación

class Movies_custom_post {

public function __construct() {
add_action( 'init',     array( $this, 'init_custom_post_type_movies' ) );
}

public function init_custom_post_type_movies() {
return $this->custom_post_type_movies();
}

public function custom_post_type_movies() {
$labels = array(
'name' => _x( 'Movies', 'Post Type General Name', 'themetraduction' ),
'singular_name' => _x( 'Movie', 'Post Type Singular Name', 'themetraduction' ),
'menu_name' => __( 'Movies', 'themetraduction' ),
'name_admin_bar' => __( 'Manager Movies', 'themetraduction' ),
'archives' => __( 'Item Archives', 'themetraduction' ),
'attributes' => __( 'Item Attributes', 'themetraduction' ),
'parent_item_colon' => __( 'Parent Item:', 'themetraduction' ),
'all_items' => __( 'All Items', 'themetraduction' ),
'add_new_item' => __( 'Add New Item', 'themetraduction' ),
'add_new' => __( 'Add New', 'themetraduction' ),
'new_item' => __( 'New Item', 'themetraduction' ),
'edit_item' => __( 'Edit Item', 'themetraduction' ),
'update_item' => __( 'Update Item', 'themetraduction' ),
'view_item' => __( 'View Item', 'themetraduction' ),
'view_items' => __( 'View Items', 'themetraduction' ),
'search_items' => __( 'Search Item', 'themetraduction' ),
'not_found' => __( 'Not found', 'themetraduction' ),
'not_found_in_trash' => __( 'Not found in Trash', 'themetraduction' ),
'featured_image' => __( 'Featured Image', 'themetraduction' ),
'set_featured_image' => __( 'Set featured image', 'themetraduction' ),
'remove_featured_image' => __( 'Remove featured image', 'themetraduction' ),
'use_featured_image' => __( 'Use as featured image', 'themetraduction' ),
'insert_into_item' => __( 'Insert into item', 'themetraduction' ),
'uploaded_to_this_item' => __( 'Uploaded to this item', 'themetraduction' ),
'items_list' => __( 'Items list', 'themetraduction' ),
'items_list_navigation' => __( 'Items list navigation', 'themetraduction' ),
'filter_items_list' => __( 'Filter items list', 'themetraduction' ),
);
$args = array(
'label' => __( 'Movie', 'themetraduction' ),
'description' => __( 'Custom post type movies', 'themetraduction' ),
'labels' => $labels,
'rewrite'            => array( 'slug' => 'movie' ),
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'revisions' ),
//'taxonomies' => array( 'category', 'post_tag' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 10,
'menu_icon' => 'dashicons-money',
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true
);
register_post_type( 'movies', $args );
}
}
new Movies_custom_post;

Explicación

Explicando un poco el código fuente. Hemos creado dos cpt ‘books’ y ‘movies’, uno con funciones y el otro poo. Con dos variables importantes $labels, encargada de almacenar en un array las frases que usará el backend de WP, y $args, que describe las propiedades del nuevo ctp.
En esas propiedades, hemos indicado que utilice

‘supports’ => array( ‘title’, ‘editor’, ‘author’, ‘thumbnail’, ‘excerpt’, ‘comments’, ‘revisions’ ) (aunque posteriormente incluiremos también nuestras propias metaboxes).
Y unas cuantas opciones más, que se entienden bastante bien. No obstante, os dejamos la información oficial del codex de wordpress
https://codex.wordpress.org/Function_Reference/register_post_type

Seguimos en el siguiente post, programando un custom post type hasta poder usarlo en nuestra web.
Gracias por la lectura.

Sobre el Autor

Entradas Relacionadas

Social Media

  • YouTube

    Suscríbete a nuestro canal de YouTube para ver todos nuestros vídeos sobre programación

  • Twitter

    Síguenos en Twitter e infórmanos de ello, es muy probable que también te sigamos

  • Facebook

    Estamos pensando si abrir una página de Facebook o no...

  • LinkedIn

    En breve...

  • Instagram

    En breve...

  • Github

    En breve...

A %d blogueros les gusta esto: