July 21, 2010

Custom Post Types en WordPress

Primero que nada, ¿Qué son Custom Post Types?

Los tipos  de datos que maneja WordPress nativamente son post, page, attachment, revision y nav menu. Los Custom Post Types son básicamente tipos de datos personalizados, algo así como los Content Types de Drupal. Son infelizmente llamados Post Types porque viven en la misma tabla que posts y pages (wp_posts), y son diferenciados por una columna post_type.

Definir nuevo custom post type

Para definir un tipo nuevo utilizamos la función create_post_type(). El siguiente código puede ser utilizado desde el archivo functions.php o aún mejor, desde un plugin.

add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'libro',
	array(
		'public' => true,
		'labels' => array(
			'name' => __( 'Libros' ),
			'singular_name' => __( 'Libro' ),
			'add_new' => __( 'Añadir Libro' ),
			'add_new_item' => __( 'Añadir Nuevo Libro' ),
			'edit' => __( 'Editar' ),
			'edit_item' => __( 'Editar Libro' ),
			'new_item' => __( 'Nueva Libro' ),
			'view' => __( 'Ver Libro' ),
			'view_item' => __( 'Ver Libro' ),
			'search_items' => __( 'Buscar Libro' ),
			'not_found' => __( 'Libro No Encontrado' ),
			'not_found_in_trash' => __( 'Libro no encontrado en Papelera' )
		),
		'description' => __( 'Libros y revistas' ),
		'menu_position' => 20,
		'menu_icon' => get_stylesheet_directory_uri() . '/images/libros.png',
		'query_var' => true,
		'supports' => array(
			'title',
			'editor',
			'comments',
			'trackbacks',
			'page-attributes',
			'thumbnail' ),
		'rewrite' => array( 'slug' => 'biblioteca'), //->Ver Error 404
		'capability_type' => 'post'
	)
  );
}

La función create_post_type() recibe como primer parámetro el nombre del tipo de dato y en segundo lugar una lista de parámetros para configurarlo. Aquí se puede ver el detalle de esta función: Function reference: register_post_type.

Luego de añadir ese código deberíamos ver un menú lateral “Libros” que nos permite gestionar nuevos elementos de tipo libro, tal como manejamos posts o páginas. Con el parámetro rewrite especificamos que las urls serán del tipo http://sitio.com/biblioteca/nombre-libro.

Error 404

Al editar el nuevo tipo de dato es posible encontrarse con errores de página no encontrada, al hacer preview o al visitar un nuevo ítem publicado si utilizamos el parámetro rewrite para hacer uso de permalinks. Para corregir esto basta con visitar Settings/Permalinks o agregando flush_rewrite_rules() luego de llamar a register_post_type().

Definir campos para el nuevo tipo de datos

A través del array supports podemos definir los campos nativos que contiene nuestro tipo de datos, por ejemplo title, editor (contenido), comments, etc. Pero también podemos añadir nuevos campos. Supongamos que quiero agregar un nuevo campo Editorial al tipo Libro.

Para esto hay que agregar un meta_box (las cajitas con opciones dentro de post.php) en la administración para poder editar ese campo. Esto se hace mediante la función add_meta_box().

add_action("admin_init", "admin_init");

function admin_init(){
    add_meta_box("libro-meta", "Información Extra", "info", "libro", "side", "low");
}

function info(){
    global $post;
    $custom = get_post_custom($post->ID);
    $capacity = $custom["editorial"][0];
    ?>
        <label for="capacity">Editorial</label>
        <input name="capacity" id="capacity" value="<?php echo $capacity; ?>" />
    <?php
}

Por último, registramos una función para guardar los campos personalizados.

add_action('save_post', 'save_extra');
function save_extra(){
    global $post;
    update_post_meta($post->ID, 'editorial', $_POST['editorial']);
}

Listo. Ahora además de posts y pages podemos crear Libros. Cómo mostrarlos, eso es tema para otro post 🙂

Desgargar código fuente

[download id=”3″]

Probado en WordPress 3.0.

Fuentes

  • http://codex.wordpress.org/Custom_Post_Types
  • http://codex.wordpress.org/Function_Reference/register_post_type
  • http://thinkvitamin.com/dev/create-your-first-wordpress-custom-post-type/