August 31, 2010

Listar y paginar Custom Post Types en WordPress

[!] Esta entrada tiene más de 10 años


Los tipos de datos customizados (Custom Post Types) en WordPress fueron uno de los agregados más importantes de la versión 3. Agregan a la plataforma un soporte nativo para cualquier tipo de dato, conviertiendose cada día más en un CMS completo (nos guste o no.)

En la entrada Custom Post Types en WordPress se puede ver como crear un custom post type de tipo libro. Tienen infinitas utilidades, pero en muchas ocasiones vamos a necesitar por lo menos una página con un listado y una página individual para mostrar un ítem de ese tipo. Para el primer caso, seguramente queramos un paginado.

Hoy en día la manera más sencilla de hacer esto es utilizar la clase SD_Register_Post_Type de Soma Design. Aunque quizá en un futuro este comportamiento esté integrado en la plataforma, hoy es difícil hacerlo sin plugins, sobre todo para el que no conoce mucho el código de WordPress.

La funcionalidad más interesante que provee es:

  1. URLs customizadas para el listado general de un post type, con paginación y feed.
    Ej.: http://sitio.com/libros/, http://sitio.com/libros/page/2/http://sitio.com/libros/feed/ )
  2. Plantillas customizadas para lista de ítems y páginas individuales. Si registramos “libro” como post type, podremos usar libro/single.php (individual) y libro/index.php (lista) para una mejor organización.

Modo de uso

Primero debemos incluír la clase SD_Register_Post_Type en nuestro código. Se puede incluír desde un archivo externo:
require_once('sd_register_post_type.class.php')
o copiar la clase entera a nuestro código (dentro de functions.php por ejemplo.)

Lo único que resta es registrar el nuevo tipo de dato utilizando la función auxiliar sd_register_post_type:

sd_register_post_type('libro', $args, 'libros')

Esta función es simplemente un wrapper de register_post_type, recibe los mismos parámetros(nombre, array de parámetros) más un tercer parámetro para el nombre plural del tipo. Si no se especifica el segundo y tercer parámetro se toman valores por defecto, en el caso del plural se agrega una s al nombre del tipo.

Gracias a eso, se puede reutilizar el código utilizado con register_post_type con esta nueva función:

sd_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' => 'libros'), //->Ver Error 404
	'capability_type' => 'post'
    )
)

Error 404

Como en el caso de la entrada anterior, los cambios de las URLs no van a tener efecto hasta visitar Ajustes>Enlaces Permanentes (Permalinks) para refrescar las reglas de permalinks.

Luego de seguir esos pasos deberías poder administrar libros desde el panel de administración de WordPress y visualizar libros individuales (por default cargados en la plantilla single.php.)

Paginado

Para tener una plantilla con un listado de libros con paginado, creamos un archivo libro/index.php dentro de la carpeta del theme activo y agregamos el código siguiente para traer los posts de la base de datos:

$wp_query = new WP_Query(array('post_type' => 'libro',
                                 'paged' => $paged,
                                 'posts_per_page' => 30,
				 'orderby' => 'title',
				 'order' => 'ASC')
);

Eso seleccionaría 30 libros por página, ordenados por título en forma ascendiente. Por último faltaría agregar los links de paginación. La manera más sencilla es agregando next_posts_link('Página siguiente') y previous_posts_link('Página anterior').

Se puede ver un código similar funcionando en el blog Ted el Mecánico, en la sección de Salas. Se puede ver la página 2 del listado o la página individual de La Trastienda, por ejemplo.

Links

  • http://codex.wordpress.org/Custom_Post_Types
  • http://codex.wordpress.org/Custom_Fields
  • http://somadesign.ca/projects/smarter-custom-post-types/
$wp_query = new WP_Query(array(‘post_type’ => ‘ted_venue’,
‘paged’ => $paged,
‘posts_per_page’ => 30,
‘orderby’ => ‘title’,
‘order’ => ‘ASC’)
);