Utilizando la galería de medios de WordPress para listar PDFs

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *