Listar los PDFs en la librería de medios de WordPress puede mejorar la usabilidad de tu sitio web y proporcionar a tus usuarios acceso rápido a información relevante. Ya sea para recursos educativos, archivos descargables o simplemente para organizar documentos en una intranet.
La capacidad de listar y mostrar PDFs ofrece un valor significativo a tu audiencia. Aprovecha esta funcionalidad en WordPress para mejorar la experiencia del usuario y hacer que la gestión de contenido sea más eficiente.
En nuestro caso utilizamos la clase wp_query() para sacar la información que necesitamos de la base de datos de WordPress y la envolveremos en un shortcode para luego mostrar el listado o bien en una página o una template del tema.
function list_pdfs_shortcode() {
ob_start(); // Inicia el buffer de salida
$query_pdf_args = array(
'post_type' => 'attachment',
'post_mime_type' => 'application/pdf',
'post_status' => 'inherit',
'posts_per_page' => -1,
);
$query_pdf = new WP_Query( $query_pdf_args );
if ( $query_pdf->have_posts() ) {
while ( $query_pdf->have_posts() ) {
$query_pdf->the_post();
// Obtener el enlace al archivo PDF
$pdf_url = wp_get_attachment_url( get_the_ID() );
// Mostrar el enlace o cualquier otra información que desees
echo '<a href="' . esc_url( $pdf_url ) . '">' . get_the_title() . '</a><br>';
}
// Restablecer los datos postglobales
wp_reset_postdata();
} else {
echo 'No se encontraron archivos PDF.';
}
return ob_get_clean(); // Devuelve el contenido del buffer de salida
}
// Registra el shortcode
add_shortcode('list_pdfs', 'list_pdfs_shortcode');
Para mostrar el listado en tus páginas o secciones utiliza el shortcode:
[list_pdfs]
Para mostrar el listado en tus templates o con PHP utiliza esta función de WordPress:
<?php echo do_shortcode('[list_pdfs]'); ?>
Si necesitas afinar las búsquedas con wp_query(), te recomiendo habilitar las categorías y etiquetas para la galería de medios de WordPress o crear tus propias taxonomías. Por defecto en WordPress esto no es posible. No te preocupes, te dejo dos snippets sencillos para tu functions.php o plugin de funcionalidades.
La solución perfecta para tener distintos listados dependiendo de valor de la taxonomía o con una combinación de estas.
// Habilitar categorías y etiquetas en la biblioteca de medios
function enable_media_categories_and_tags() {
// Habilitar categorías
register_taxonomy_for_object_type('category', 'attachment');
// Habilitar etiquetas
register_taxonomy_for_object_type('post_tag', 'attachment');
}
add_action('init', 'enable_media_categories_and_tags');
// Añadir nueva taxonomía para los medios - Protocolos de Seguridad
function add_media_taxonomy() {
$labels = array(
'name' => _x('Protocolos de Seguridad', 'taxonomy general name'),
'singular_name' => _x('Protocolo de Seguridad', 'taxonomy singular name'),
'search_items' => __('Buscar Protocolos de Seguridad'),
'popular_items' => __('Protocolos de Seguridad Populares'),
'all_items' => __('Todos los Protocolos de Seguridad'),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __('Editar Protocolo de Seguridad'),
'update_item' => __('Actualizar Protocolo de Seguridad'),
'add_new_item' => __('Añadir Nuevo Protocolo de Seguridad'),
'new_item_name' => __('Nuevo Nombre del Protocolo de Seguridad'),
'separate_items_with_commas' => __('Separar Protocolos de Seguridad con comas'),
'add_or_remove_items' => __('Añadir o quitar Protocolos de Seguridad'),
'choose_from_most_used' => __('Elegir de los más usados'),
'menu_name' => __('Protocolos de Seguridad'),
);
$args = array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'protocolos-de-seguridad'),
);
register_taxonomy('protocolos_de_seguridad', 'attachment', $args);
}
add_action('init', 'add_media_taxonomy');
Si utilizad una nueva taxonomía como la que acabo de crear, necesitarás cambiar la función que has creado con wp_query() añadiendo tax_query() para hacer el filtro por la taxonomía y filtrando por el valor que le hayas indicado. El filtro se hace infinito.
Por ejemplo en una intranet añades la taxonomía «personas» y asignas documentos de forma individual, consigues tener una intranet privada con una forma fácil de compartir estos documento.
function list_pdfs_shortcode() {
ob_start();
$protocolo_to_filter = 'nombre_del_protocolo'; // Cambia 'nombre_del_protocolo' por el protocolo deseado
$query_pdf_args = array(
'post_type' => 'attachment',
'post_mime_type' => 'application/pdf',
'post_status' => 'inherit',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'protocolos_de_seguridad',
'field' => 'slug',
'terms' => $protocolo_to_filter,
),
),
);
$query_pdf = new WP_Query($query_pdf_args);
if ($query_pdf->have_posts()) {
while ($query_pdf->have_posts()) {
$query_pdf->the_post();
$pdf_url = wp_get_attachment_url(get_the_ID());
echo '<a href="' . esc_url($pdf_url) . '">' . get_the_title() . '</a><br>';
}
wp_reset_postdata();
} else {
echo 'No se encontraron archivos PDF en el protocolo de seguridad especificado.';
}
return ob_get_clean();
}
add_shortcode('list_pdfs', 'list_pdfs_shortcode');
* Como apunte añadido, también puedes afinar mucho mas si se filtra por Roles de usuario. De igual forma, puedes crear tus propios roles de usuario e introducir el filtro en la función programada con wp_query(). De nuevo, infinitas opciones.
¿Necesitas un desarrollador web especializado en WordPress a medida?
Utilizo las técnicas más avanzadas para poner en marcha proyectos profesionales con WordPress. Desarrollo funcionalidades específicas para cada proyecto y creo sitios basados en bloques a medida con ACF. ¿Quieres un proyecto profesional y 100% escalable?
Casos de uso
- Directorio de recursos
- Menú de descargas para miembros
- Catálogo de productos descargables (Incluso de pago, añadiendo stripe)
- Página de recursos educativos
- Intranet personal y dinámica
Espero que te esté tutorial te sirva de ayuda, si tienes algún problema o quieres que profundice mas o con mas ejemplos, házmelo saber.