Contenido

WordPress 3.0: Exprimiendo los Custom Post Types

19 jun

+ 31

Una de las funcionalidades incluidas en WordPress 3.0 es la posibilidad de definir tipos de posts personalizados. Esto que parece que ha pasado desapercibido por la comunidad de desarrolladores es realmente interesante y ofrece una gran capacidad para extender cualquier WordPress fácilmente.

¿Que son los Custom Post Types?

Hasta la versión 2.9.x de WordPress disponíamos de unos pocos tipos de posts disponibles para identificar nuestros artículos. Estos tipos de posts, indicaban el estado del mismo (draft, revision,…) o el tipo de usado (attachment, page,…).

Ahora con la nueva versión de WordPress, la 3.0, la posibilidad de definir tipos de posts personalizados abre un abanico de posibilidades.

¿Como definir un nuevo Custom Post Type?

La API de WordPress está muy bien documentada en WordPress Codex y allí podemos encontrar como definir un Post Type fácilmente.

Todo pasa por la función register_post_type(), que se encarga de registrar un nuevo tipo con una serie de características personalizadas.

add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'super',
    array(
      'labels' => array(
        'name' => __( 'Supers' ),
        'singular_name' => __( 'Super' )
      ),
      'public' => true,
    )
  );
}

Como vemos, debemos crear una función que se ejecutará en el action “init” de WordPress y que registrará el nuevo tipo. Disponemos de muchos parámetros que podemos usar para personalizar el nuevo tipo, pero los veremos más adelante.

post_type_wordpress_3
(Ver Imagen)

Introduciendo este código en, por ejemplo, el fichero functions.php de tu theme o en un plugin. Obtendremos un resultado similar al que vemos en la imagen. Se trata de un nuevo menú con el nuevo tipo registrado.

En el nuevo menú descubrimos que podemos mostrar un listado de artículos del nuevo tipo o crear uno nuevo, siempre asociado al post-type definido previamente.

Detalles de register_post_type()

Los parámetros que esta función reciba condicionarán el panel de administración de nuestro nuevo post_type.

Labels

  • name: El plural del nuevo tipo (películas).
  • singular_name: Singular del nuevo tipo (película)
  • add_new: Etiqueta de “Añadir nuevo”
  • add_new_item: Cabecera del panel “Añadir nuevo”
  • edit: Etiqueta de “Editar”
  • edit_item: Cabecera del panel “Editar”
  • new_item: Muestra en el menú favoritos
  • view: Se utiliza como texto en un enlace para ver el post.
  • view_item:Se muestra junto con el enlace permanente en la pantalla de edición posterior
  • search_items: Botón de texto para el cuadro de búsqueda en la pantalla de edición de mensajes
  • not_found: Texto para cuando no encuentre items
  • not_found_in_trash:Texto para cuando no encuentre items en la papelera.
  • parent: Se utiliza para definir el tipo padre. Solo útil en tipos heredados.

Ejemplo

'labels' => array(
	'name' => __( 'Super Dupers' ),
	'singular_name' => __( 'Super Duper' ),
	'add_new' => __( 'Add New' ),
	'add_new_item' => __( 'Add New Super Duper' ),
	'edit' => __( 'Edit' ),
	'edit_item' => __( 'Edit Super Duper' ),
	'new_item' => __( 'New Super Duper' ),
	'view' => __( 'View Super Duper' ),
	'view_item' => __( 'View Super Duper' ),
	'search_items' => __( 'Search Super Dupers' ),
	'not_found' => __( 'No super dupers found' ),
	'not_found_in_trash' => __( 'No super dupers found in Trash' ),
	'parent' => __( 'Parent Super Duper' ),
),

description

La descripción, es usada para explicar de que trata el nuevo tipo.

Ejemplo

'description' => __( 'A super duper is a type of content that is the most wonderful content in the world. There are no alternatives that match how insanely creative and beautiful it is.' ),

public

Se trata de un parámetro que permite personalizar todo lo referente al comportamiento público del nuevo tipo. En caso de estar activo (true) nos permitirá usar otros parámetros para personalizar nuestro post_type.

  • show_ui: Mostrar en las pantallas de Administración
  • publicly_queryable: Permitir que las consultas por este tipo estén disponibles a los usuarios.
  • exclude_from_search: Eliminar de la lista de resultados de búsquedas.
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,

capability_type / capabilities

El tema de permisos es algo que también está reflejado en los Custom Post Types, permitiendo definir que capacidades tiene cada perfil de usuarios sobre el tipo.

Para ello usaremos el atributo “capabilities“:

  • edit_post: Alguien puede crear y editar un post específico
  • edit_posts: Capacidad de guardar los mensajes que permite la edición de este tipo de posts
  • edit_others_posts: Capacidad que permite la edición de los posts de los demás.
  • publish_posts: Capacidad de la concesión de la publicación de este tipo de posts.
  • read_post: Capacidad que controla la lectura de un puesto específico de este tipo de posts.
  • read_private_posts: Capacidad para permitir la lectura de los mensajes privados.
  • delete_post: Capacidad que otorga el privilegio de la supresión de posts.

Ejemplo

/* Global control over capabilities. */
'capability_type' => 'super_duper',

/* Specific control over capabilities. */
'capabilities' => array(
	'edit_post' => 'edit_super_duper',
	'edit_posts' => 'edit_super_dupers',
	'edit_others_posts' => 'edit_others_super_dupers',
	'publish_posts' => 'publish_super_dupers',
	'read_post' => 'read_super_duper',
	'read_private_posts' => 'read_private_super_dupers',
	'delete_post' => 'delete_super_duper',
),

supports

Permite definir que cajas van a estar visibles a la hora de crear/editar un nuevo post del tipo definido. Para ello pasaremos un listado con los nombres de las mismas.

  • title: Caja de título
  • editor: Editor donde va el contenido del post
  • comments: Posibilidad de activar/desactivar los comentarios
  • trackbacks: Capacidad de activar/desactivar los trackbacks
  • revisions: Permitir ver las revisiones
  • author: Caja para definir el autor
  • excerpt: Caja de excerpt.
  • thumbnail: Caja para definir la miniatura del post.
  • custom-fields: Caja de Custom Fields
  • page-attributes: Atributos de páginas

Ejemplo

'supports' => array( 'title', 'editor', 'excerpt', 'custom-fields', 'thumbnail' ),

rewrite

La URL también puede ser personalizada mediante un simple parámetro que especificará el enlace usado. Para ello debemos especificar estos parámetros:

  • slug: El prefijo del post
  • with_front:  Si el prefijo ha de estar en el frontend.

Más información

Actualización

  1. Custom Post Types UI, plugin que nos genera un cómodo interface web donde personalizar nuestros tipos de posts. Via.
  2. Magic Fields, plugin que permite generar interfaces amigables para todas las opciones de WordPress, inlcuye la opción de Custom Post Types.Via judas.
  • Gracias! Precisamente ahora me estaba peleando con los Custom Post Types.
    El lanzamientode WordPress 3 me ha motivado bastante , ahora con las entradas y los campos personalizados las posibilidades de personalización del contenido son inmensas

  • Creo que junto a los tipos de post personalizados, tampoco se le ha dado mucha relevancia a la posibilidad de definir taxonomías personalizadas (http://codex.wordpress.org/Custom_Taxonomies) … y juntos a mi entender son de los cambios más importantes de esta versión !.

  • Hahaha todo el día de ayer (horario MX) estuve esperando a que publicaras este post… Habrá que seguir jugando con esto.

  • Muy bien explicado, muchas gracias.

    Es una opción muy interesante la de los tipos de post personalizados, también existe un plugin (Custom Post Type UI) para hacerlo sin editar código.

  • Un consejo, que veo que no sólo a mí me va a venir muy bien.

    Existe un plugin llamado Magic Fields que es maravilloso y que permite crear, mediante UI, nuevos custon_post_types. Es muy similar a Custom Post Type UI, mencinado arriba, pero tiene una ventaja abismal: te crea las cajas de los campos personalizados automáticamente, para cada tipo de contenido específico y con varios formatos.

    En ambos casos, hay que definir las taxonomías de cada custom_post_type “a pelo”, y deben funcionar perfectamente. Custom Post Type UI crea los custom_post_types, y listo. Magic Fields te permite además personalizar la página de edición de cada custom_post_type con boxes de custom fields predefinidos.

    Con esas tres cosas: custom_post_type, custom_fields adaptados a ellos y taxonomías adaptadas también a ellos, WordPress acaba de dar un salto enorme.

  • Pues la verdad es que mi idea original es ir trastocando hasta dar con la combinación taxonomías-campos personalizados perfecta, usando MagicFields, y una vez hecho llevarlo al functions.php en la versión final, pero me faltaría una cosa, y es que MagicFields añade campos personalizados de otros tipos distintos del típico de la caja de texto.

    ¿Conocéis de alguna guía donde se explique cómo crear campos personalizados que no sean simples lineas de texto sino multiples lineas de texto con editor, cajas de selección múltiple o booleanos? ¿O MagicFields lo único que está haciendo es “enmascarar” la posibilidad de múltiples valores para la misma clave? Si lo consigo, me ahorraré un plugin y eso se valora.

    • @judas: si, en magic fields tenemos 15 distintos tipos de campos (entre ellos upload de imagenes) y cuenta con funciones para mostrar dichos campos. tambien cuenta con la posibilidad de duplicar campos o grupos. entre muchas otras cosas. en la version 1.5 tenemos planeado integrar post types (relacionados con los custom fields que actualmente tenemos) y custom taxonomy para reducir el codigo y mejorar el rendimiento de magic fields

  • Yo estoy siguiendo este método: http://www.deluxeblogtips.com/2010/04/how-to-create-meta-box-wordpress-post.html .
    Funciona perfectamente pero hecho en falta 2 funciones: la posibilidad de añadir arrays o múltiples valores a los campos y un método sencillo para que el cliente asigne imágenes de la galería multimedia. A ver si Andrés se anima y nos regala un tuto sobre el tema ;)

  • Muy bueno el artículo. Personalmente prefiero utilizar mi propio código antes de usar un plugin. En este caso con más razón, es realmente sencillo crear un Post Type.

    @Jacobo: Precisamente estoy trabajando con ese código.
    El archivo de descarga viene con images y files upload. Los files dan algún problema, hay que cambiar el js para recoger el nombre. La solución está en uno de los comentarios.

    Aparte he añadido la posibilidad de te tenga o no tinymce y algún retoque más.

    La verdad es que me ha ahorrado mucho tiempo ;)

  • Muchas gracias por el enlace, Jacobo. Lo encontré ayer googleando sobre el tema, y la verdad es que me ha venido muy bien. aunque es en la segunda parte donde está el resumen y el código final a usar, que es sencillo, potente y parece que con el bug de subir archivos arreglado.

    Es verdad que se echa de menos la posibilidad de campos con valores múltiples, pero en realidad prefiero evitar que mis clientes tengan esa posibilidad. Porque en caso de necesitarla realmente, casi que integro ese campo como taxonomía tipo tag y listo. Y en mi caso no necesito subir archivos, con el thumbnail nativo me va bien.

    Pero el caso es que en una hora puedes tener listo el esqueleto de cualquier tipo de contenido que quieras mostrar. Qué lujo.

  • Que bueno … esperaba mucho el WordPress 3.0 y mucho mejor tu ayuda pues realmente me servirá.

  • Muy bueno el articulo, gracias por la explicación. Por cierto me encanta wordpress

  • Una pregunta, quería saber si para actualizar de WordPress 2.9.X a 3.0 hay que hacer el procedimiento “habitual” para actualizar manualmente.

  • Bueno… creo que clamaba al cielo que WP se convirtiera en un CMS sencillito en su versión 3…

    Esto pero puede ser útil aunque bastante farragoso… el Magic Fields me dió muchos problemas con el plugin WPML en la última versión de WP (2.9.2), así que probaré esta alternativa…

  • realmente se me habia pasado ese detalle en esta ultima version de wordpress, en http://www.thepaginasweb.com somos fanáticos de wordpress, gracias por recordarnos esta utilidad

  • Lo mejor sería que WordPress dejara de pesar, que cada vez “engorda más” y prometieron que llegaría a pesar 800kb, a ver cuando lo cumplen.

  • gracias, me sirvio mucho la referecia de “magic-fields” justo lo que buscaba

  • quisiera saber como puedo cambiar la imagen de la cabecera de wp 3.0, pues estpy usando la plantilla wpcontempo y no sé como cambiar eso por mi propio logo. Gracias

  • Pues esto esta genial también hay un plugins que ofrece exactamente eso, la creación de tipos de entradas personalizadas sin necesidad de tocar ni una línea de código.

    se llama Custom Post Type UI y la verdad que no esta nada mal.

  • Tengo una duda es posible crear y asignarle url me explico:
    Si yo creo un custom post type que sea por ejemplo “productos”, no sé cómo podría hacer para que el permalink de una encuesta fuera: “www.miweb.com/productos/producto1/” y que a parte en “www.miweb.com/productos/” se pudieran listar todos los productos que sean escrito bajo este post type
    Gracias

  • Todavía no me he puesto a ensuciarme las manos con el código, ando leyendo sobre custom post types y son muy interesantes a la hora de gestionar algo que no sean posts. La verdad es que se les echaba de menos.
    Pero lo que no he conseguido ver en ningún sitio es información sobre cómo hacer un interfaz en el front end para los usuarios.
    Es decir, la típica base de datos ‘peliculas favoritas de nuestros usuarios’ y que desde el front-end, aquellos que estén registrados, puedan dar introducir (dar de alta) su película, editarla o borrarla.

    Se que lo pueden hacer desde el dashboard, pero no quiero perder el aspecto de la web en favor de la gestión, sino integrarlo.

    ¿Alguien sabe donde encontrar información al respecto o algún ejemplo? Gracias.

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.