¿Cómo gestionar tus propios CPT o Custom Post Types?

como crear CPT

Por defecto WordPress te facilita dos tipos de contenido llamados post y páginas para insertar el contenido en tu web, y en muchos casos esto es suficiente.

Pero… si necesitas mostrar y estructurar en tu web un contenido diferente, o sencillamente diferentes tipos de contenido que no quieres que vayan todos juntos como un blog, es importante que aprendas a gestionar tus propios CPT o Custom Post Types o contenido personalizado.

Si usas plugins es probable que ya tengas algunos nuevos CPT en tu web, como por ejemplo productos si instalas Woocommerce o el CPT portfolio si instalas un plugin de portfolio.

En realidad todo lo que tiene que ver con contenido gira alrededor de los post, todo son diferentes tipos de post, y es bueno que aprendas a crearlos, ya que es muy fácil.

Si no quieres tocar nada de código, pero quieres gestionar tus propios CPT o Custom Post Types te recomiendo probar el plugin Custom Post Type UI el cual te permite crearlos en un periquete. 😉

Ten en cuenta que si creas CPT con este plugin o cualquier otro dependerás de tener siempre instalado ese plugin si no quieres perder todo tu nuevo contenido… bueno en realidad seguirá en la base de datos pero no podrás verlo.

Antes de perderlo puedes migrarlo. Hay formas sencillas de pasar un contenido de un tipo de post o CPT a otro, como por ejemplo el plugin Post Type Switcher que te permite hacerlo de modo manual uno a uno.

Si necesitas cambiar muchos CPT de golpe puedes probar con el plugin Convert Post Types, aunque no lo recomiendo porque lleva tiempo sin actualizarse y porqué no gestiona los custom fields asociados a los CPT, por lo que tendrás que gestionarlo de otro modo como tocando directamente la base de datos.

¿que te recomiendo entonces?

Que NO instales temas, plantillas, themes,.. o como lo quieras llamar… que añadan CPT a tu WordPress porque acabarás si o si teniendo problemas.

¡Hazlo con código o con plugins!

Lo mejor para gestionar tus propios CPT o Custom Post Types es hacerlo tu mismo con código. Te dejo un par de ejemplos, más simple y más completo, para que los modifiques y adaptes a tu gusto. El primero tiene lo mínimo y el segundo permite una mayor personalización.

<?php
add_action( 'init', 'pc_crear_cpt_recetas' );
/**
 * Crear CPT 'recetas'
 */
function pc_crear_cpt_recetas() {
     $args = array(
     'public' => true,
     'label' => 'Recetas'
        );
 
        register_post_type( 'recetas', $args );
}
<?php
 
if ( ! function_exists('pc_crear_cpt_recetas') ) {
/**
 * Crear CPT 'recetas'
 */
function pc_crear_cpt_recetas() {
 
        $labels = array(
                'name'                  => _x( 'Recetas', 'Post Type General Name', 'text_domain' ),
                'singular_name'         => _x( 'Receta', 'Post Type Singular Name', 'text_domain' ),
                'menu_name'             => __( 'Recetas', 'text_domain' ),
                'name_admin_bar'        => __( 'Recetas', 'text_domain' ),
                'archives'              => __( 'Recetas', 'text_domain' ),
                'attributes'            => __( 'Recetas', 'text_domain' ),
                'parent_item_colon'     => __( 'Padre Recetas', 'text_domain' ),
                'all_items'             => __( 'Todas las recetas', 'text_domain' ),
                'add_new_item'          => __( 'Añadir nueva receta', 'text_domain' ),
                'add_new'               => __( 'Añadir nueva', 'text_domain' ),
                'new_item'              => __( 'Nueva receta', 'text_domain' ),
                'edit_item'             => __( 'Editar receta', 'text_domain' ),
                'update_item'           => __( 'Actualizar receta', 'text_domain' ),
                'view_item'             => __( 'Ver receta', 'text_domain' ),
                'view_items'            => __( 'Ver recetas', 'text_domain' ),
                'search_items'          => __( 'Buscar recetas', 'text_domain' ),
                'not_found'             => __( 'Recetas no encontradas', 'text_domain' ),
                'not_found_in_trash'    => __( 'No encontradas en la papelera', 'text_domain' ),
                'featured_image'        => __( 'Imagen destacada receta', 'text_domain' ),
                'set_featured_image'    => __( 'Establecer imagen receta', 'text_domain' ),
                'remove_featured_image' => __( 'Borrar imagen receta', 'text_domain' ),
                'use_featured_image'    => __( 'Usar como imagen destacada', 'text_domain' ),
                'insert_into_item'      => __( 'Insertar en receta', 'text_domain' ),
                'uploaded_to_this_item' => __( 'Subir a recetas', 'text_domain' ),
                'items_list'            => __( 'Listado recetas', 'text_domain' ),
                'items_list_navigation' => __( 'Listado recetas', 'text_domain' ),
                'filter_items_list'     => __( 'Listado filtrado recetas', 'text_domain' ),
        );
        $args = array(
                'label'                 => __( 'Receta', 'text_domain' ),
                'description'           => __( 'CPT Recetas', 'text_domain' ),
                'labels'                => $labels,
                'supports'              => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'trackbacks', 'revisions', 'custom-fields', 'page-attributes', 'post-formats', ),
                'taxonomies'            => array( 'category', 'post_tag' ),
                'hierarchical'          => false,
                'public'                => true,
                'show_ui'               => true,
                'show_in_menu'          => true,
                'menu_position'         => 5,
                'menu_icon'             => 'dashicons-welcome-write-blog',
                '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'       => 'page',
        );
        register_post_type( 'recetas', $args );
 
}
add_action( 'init', 'pc_crear_cpt_recetas', 0 );
 
}

Recuerda incorporar tu código en tu propio plugin, ya que es más fácil de lo que imaginas: ¿Cómo crear un plugin de personalizaciones para WordPress?

¿Cómo crear una galería de imágenes en WordPress?

como crear galería imágenes

ACTUALIZACIÓN diciembre 2018: el aquí citado editor de texto de WordPress TinyMCE ha quedado obsoleto en sustitución del nuevo editor de bloques integrado en el core de WordPress desde la versión WP 5.0 fruto del proyecto denominado Gutenberg. 

Resulta que crear una galería de imágenes en WordPress es de lo más fácil, ya que ni tan siquiera necesitas plugins ya que se trata de una funcionalidad que viene por defecto en el core.

Si sabes añadir imágenes en tus entradas o páginas, también sabes añadir galería de imágenes. Tan sólo estate atento a cuando añades una imagen en añadir objeto dentro del editor de texto, pulsar en crear galería.

¡así de fácil!

La diferencia cuando insertas una imagen y estás en el apartado crear galería es que puedes ir seleccionando todas la imágenes que quieras y estas se irán quedando seleccionadas con una v.

Al introducirlas se creará automáticamente un mosaico de imágenes con todas las seleccionadas previamente, y esto a priori puede ser suficiente para ti.

¿ y si quieres mejorar este mosaico de imágenes creado por defecto?

Como podrás imaginar… si quieres crear una galería de imágenes en WordPress con un mejor aspecto que el que trae por defecto, tendrás que recurrir a plugins.

El primero que te recomiendo se llama WP Featherlight y lo que te permite es que cuando se pinche sobre una imagen del mosaico de imágenes esta aparezca ampliada en vez de enlazarte a la página de adjuntos que nadie quiere.

WP Gallery Custom Links es otro plugin muy recomendable para permitir lo que mucha gente espera al darle a una imagen, y es que te lleve a otra página; bien sea de la propia web o incluso un enlace externo. Esto último muy útil para enlazar imágenes como links de afiliado.

Pero sin duda el mejor modo de crear una galería de imágenes en WordPress dándole un poco de estilo sin tener que tocar código es recurriendo a una funcionalidad de JetPack pero sin tener que instalarlo. Se trata del plugin Tiled Gallery Carousel Without JetPack, que te ayudará a mejorar el aspecto de la galería de imágenes con varias plantillas predefinidas que evitarán el básico aspecto por defecto de todas la imágenes del mismo tamaño.

Desde WordPress 5.0 mi recomendación es el plugin Block Gallery – Photo Gallery Gutenberg Blocks.

En relación con esto te recomiendo:  ¿Cómo tener más control de la biblioteca multimedia de WordPress?

¿Cómo añadir un formulario de contacto a tu web?

como crear formulario contacto

Hay mil formas… bueno, tal vez no tantas, pero sí que hay muchas formas de añadir un formulario de contacto a tu web.

No importa tanto cual elijas, como sí que es muy importante que sea como sea… facilites un modo de contacto como este. El teléfono es una buena opción para algunos tipos de webs, pero no suficiente ni incluso necesario en la mayoría de los casos.

Por otra parte puedes poner simplemente tu correo anotado y esperar que alguien te escriba… pero es poco probable que esto suceda.

No esperes más, añadir un formulario de contacto a tu web es muy recomendable y no tienes excusas para no ponerlo, ya que es muy fácil.

El plugin que todo el mundo recomienda es Contact form 7, siendo además uno de los plugins más conocidos y utilizado en el mundo WordPress.  

Es super sencillo y ofrece muchas extensiones para ampliar sus funcionalidades básicas de modo gratuito, permitiéndote llegar hasta casi los niveles de los mejores plugins de contacto de pago como el conocido Gravity Forms con el que literalmente puedes hacer lo que se te ocurra.

El segundo plugin recomendado y muy utilizado estaría entre medio de los dos citados, siendo gratuito en su versión básica pero pudiendo extenderlo con plugins de pago para conseguir lo que imagines. Se trata de Ninja forms.

Pero si únicamente quieres un formulario sencillo y gratuito para que te llegue la información como si te mandarán directamente un email pero ofreciendo la comodidad de hacerlo con un formulario, échale un vistazo al plugin Contact Form Email, ya que ofrece lo suficiente y necesario.

Por último te recomiendo un plugin muy conocido llamado Contact Form de WPForms, que es más moderno que el mítico Contact form y que pretende mejorar la usabilidad con una interfaz drag & drop y muchas más opciones con soporte de sus creadores, pero previo pago.

Para terminar te dejo un poco de código por si quieres mejorar el plugin Contact form 7 evitando que cargue scripts en todas partes como hace por defecto… y así mejorar su rendimiento si sólo tienes un formulario de contacto en la página contacto.

<?php

add_action( 'wp_print_scripts', 'limitar_javascript_cf7', 100 );
 /**
 * Evitar carga innecesaria JavaScript plugin 'Contact form 7'
 */
 function limitar_javascript_cf7() {
    if ( ! is_page('Contacto') ) {
        wp_deregister_script( 'contact-form-7');
    }
 }
 
 add_action( 'wp_print_styles', 'limitar_estilos_cf7', 100 );
 /**
 * Evitar carga innecesaria estilos plugin 'Contact form 7'
 */
 function limitar_estilos_cf7() {
    if ( ! is_page('Contacto') ) {
        wp_deregister_style( 'contact-form-7');
    }
 }

¿Cómo crear un plugin de personalizaciones para WordPress?

como crear plugin WordPress

Si te animas a personalizar WordPress sin usar los miles de plugins gratuitos a tu disposición en el repositorio oficial, optando por crear un plugin de personalizaciones, tienes como siempre varias opciones posibles.

En primer lugar destacar que normalmente salvo que la personalización que quieras hacer sólo sea viable para el tema que estas usando actualmente… lo más recomendable siempre es crear un plugin de personalizaciones independiente del tema.

Y es que aunque a priori pueda parecer algo complicado sólo para usuario avanzados, esto es algo al alcance de cualquier usuario, y la mejor práctica a seguir para implementar todo ese código que te vas encontrando por Internet y que te gustaría probar en tu web.

En definitiva, en vez de colocar tu código en el archivo functions.php de tu tema-plantilla-theme activo, crea en un momento tu propio plugin para personalizar WordPress.

La manera más fácil y rápida al alcance de cualquier usuario sin necesidad de tener acceso ftp ni nada por el estilo, es gracias a como no podía ser de otro modo… gracias a un fantástico plugin: Pluginception.

Con este plugin crear tus propios plugins es muy sencillo. Además luego puedes borrarlo, ya que no crea ninguna dependencia con tu propio plugin recién creado.

Otro plugin muy recomendable tanto para usuario básicos como para  algunos desarrolladores, es el llamado Code Snippets. Te permite de un modo muy ordenado ir añadiendo pequeños fragmentos de código a tu web, pudiendo incluso más tarde exportar a PHP ese código.

Este plugin esta genial, pero realmente guarda tu código en la base de datos, y esto no es lo más eficiente… aunque sí una opción muy válida y útil para hacer pruebas de pequeños códigos en una web.

¿y qué es lo más eficiente?

Crear un plugin de personalizaciones bien usando el plugin generador que te he recomendado, o directamente crear tu un archivo PHP con un editor de código. Para activarlo puedes subirlo directamente por ftp a la carpeta de plugins, o comprimirlo como zip y subirlo de modo manual desde la pantalla de instalación de plugins.

Para que WordPress detecte tu fichero PHP con todo tu código personalizado como si de un plugin se tratara, sólo tienes que tener en cuenta de colocar en la cabecera del mismo un código establecido por WordPress y que te dejo aquí mismo. Recuerda modificar las líneas según tus propios datos.

<?php
/*
Plugin Name: El nombre de tu plugin aquí
Plugin URI:  https://tudominio.com
Description: Coloca aquí la descripción
Version:     1.0
Author:      Pablo Cianes
Author URI:  https://pablocianes.com
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: tu-text-domain
Domain Path: /languages
*/

¡así de fácil! 😉

>