Desde el primer momento, WordPress viene con una variedad de diferentes tipos de ‘posts’ que se guardan en la tabla posts de la base de datos. Los más notorios son los tipos post y page.
Utilizando las funciones adecuadas, un desarrollador puede crear nuevos tipos de post personales. Estos tipos también se guardan en la tabla posts y funcionan como cualquier otro tipo en la mayor parte de los casos. Los atributos y comportamientos de estos posts personalizados también son editables con las funciones adecuadas.
Este capítulo mostrará cómo crear tipos de posts personalizados, como recuperar su contenido de la base de datos, y como mostrar en el front-end de tu sitio.
Registrar tipos de posts personalizados
WordPress viene con cinco tipos de posts por defecto (post, page, attachment, revision y menu). Mientras desarrolles tu plugin, puedes modificar esto de diferentes maneras. Pero a veces puede ser que necesites crear tu propio tipo de contenido específico: por ejemplo, productos para un sitio eCommerce, asignaciones para un sitio eLearning, u otros.
Recomendamos que crees tus tipos de post personalizados mejor en un plugin que en un tema. Esto asegura que el contenido de los usuarios es portable, aunque deseen cambiar el diseño de su sitio.
Añadir un tipo de post personalizado
Para crear un nuevo tipo de post, puedes utilizar la función register_post_type().
Observa que debes llamar a la función register_post_type() después de los ganchos admin_menu y after_setup_theme. Un buen gancho es init.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
add_action( 'init', 'create_post_type' ); //Registers the Product's post type function create_post_type() { register_post_type( 'acme_product', array( 'labels' => array( 'name' => __( 'Products' ), 'singular_name' => __( 'Product' ) ), 'public' => true, 'has_archive' => true, ) ); } |
Esto crea un nuevo tipo de post, Product, que se identifica en la base de datos como acme_product.
Se le pasan dos argumentos mayores:
- labels define el nombre del tipo de post en sus formas plural y singular.
- public determina si el post se muestra en las pantallas de administración y en el contenido del sitio.
- has_archive determina si el tipo de post personalizado puede tener un archivo de plantilla.
Una vez que el tipo de post se ha creado, generará una pantalla administrativa de primer nivel que se podrá utilizar para gestionar y crear posts de dicho tipo.
La documentación de la función register_post_type contiene una larga lista de argumentos que se le pueden pasar.
Buenas prácticas
Es importante que prefijas los identificadores de tu tipo de posts con un nombre corto que identifique tu plugin, tema o el sitio que los usa.
Si tu identificador es demasiado genérico, p.ej. Producto, puede entrar en conflicto con otros plugins o temas. Si ello ocurre, se producirán errores en el sitio.
Asegurate que el identificador de tus tipos de post personalizados no excedan los 20 caracteres, ya que la columna post_type de la base de datos actualmente es un campo tipo VARCHAR de dicha longitud.
Para asegurar la compatibilidad futura, no utilices el prefijo wp_ ya que puede ser utilizado en el núcleo de WordPress en el futuro.
URLs
Un tipo de post personalizado tiene su propio slug dentro de la estructura URL del sitio. En el próximo ejemplo, un post de este tipo de post de producto personalizado puede mostrarse en http://example.com/acme_product/%product_name%, donde acme_product es el slug de tu tipo de post personalizado y %product_name% es el slug del producto en concreto, luego un permalink podría ser: http://example.com/product/foobrozinator. Puedes ver este permalink en la pantalla de edición del post.
URLs de identificadores de tipos de posts personalizados
Cuando nombras un identificador de un tipo de post personalizado y quieres utilizar una estructura sencilla de URL, necesitas indicarlo mediante un argumento de la función register_post_type().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
add_action( 'init', 'create_post_type' ); function create_post_type() { register_post_type( 'acme_product', array( 'labels' => array( 'name' => __( 'Products' ), 'singular_name' => __( 'Product' ) ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'products'), ) ); } |
Esto generará URLs de la forma:
http://example.com/products/%product_name%
NOTA: Utilizar un slug genérico como ‘products’ puede generar potencialmente conflictos con otros plugins o temas que utilicen el mismo slug, pero mucha gente desestima URLs largas y oscuras. Sin embargo, resolver los conflictos de URL entre dos plugins es fácil, porque la estructura de la URL no se guarda permanentemente en cada registro de la base de datos, de la misma forma que se guardan los identificadores de los tipos de post personalizados.
Trabajar con datos de tipos de post personalizados
Plantillas de tipos de posts personalizados
Puedes crear plantillas personalizadas para tus tipos de posts personalizados. De la misma forma que los posts y sus archivos pueden visualizarse mediante los archivos de plantilla single.php y archive.php, puedes crear las plantillas:
- single-{post_type}.php para los posts personalizados individuales.
- archive-{post_type}.php para sus archivos.
donde {post_type} es el argumento $post_type de la función register_post_type().
Así, para el ejemplo anterior, los archivos serían single-acme_product.php y archive-acme_product.php.
Alternativamente, puedes utilizar la función is_post_type_archive() en cualquier fichero de plantilla, para averiguar si la consulta muestra una página de archivo de un tipo de post dado, y la función post_type_archive_title() para mostrar el título del tipo de post.
Buscar por tipo de post
En cualquier fichero de plantilla del sistema del tema de WordPress, puedes crear nuevas consultas para mostrar posts de un tipo de post específico. Esto se hace mediante el argumento post_type del objeto WP_Query:
1 2 3 4 5 6 7 8 |
$args = array( 'post_type' => 'product', 'posts_per_page' => 10 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '<div class="entry-content">'; the_content(); echo '</div>'; endwhile; |
Es bucle recorre los últimos diez posts tipo product y muestra el título y contenido de ellos uno a uno.
Tipos de posts personalizados en la consulta principal de WP
Registrar un tipo de posts personalizados no significa que sean añadidos automáticamente a la consulta principal.
Si quieres que los posts de tu tipo personalizado se muestren en archivos estándar o en tu home page mezclados con otros tipos de posts, utiliza el gancho pre_get_posts.
1 2 3 4 5 6 7 8 |
// Show posts of 'post', 'page' and 'movie' post types on home page add_action( 'pre_get_posts', 'add_my_post_types_to_query' ); function add_my_post_types_to_query( $query ) { if ( is_home() && $query->is_main_query() ) $query->set( 'post_type', array( 'post', 'page', 'movie' ) ); return $query; } |