Como Criar um Gerenciador de Arquivos Zip no WordPress (e Por Que Isso é Útil)

Já pensou em ter uma área dedicada no seu painel do WordPress para gerenciar todos os arquivos .zip que você faz upload? Se você trabalha com a distribuição de e-books, temas, plugins ou qualquer outro tipo de pacote de arquivos, saber exatamente onde eles estão é fundamental para manter a organização e a eficiência.

Neste artigo, vamos apresentar uma solução simples e prática: uma função PHP que adiciona um submenu à sua área de “Mídia” e cria uma página completa para listar, buscar e deletar seus arquivos .zip.


Por Que Você Precisa de um Gerenciador de Arquivos Zip?

A biblioteca de mídia padrão do WordPress é excelente para gerenciar imagens e vídeos. No entanto, ela nem sempre é a melhor ferramenta para lidar com outros tipos de arquivos. Imagine que você tenha centenas de imagens, PDFs e, no meio de tudo isso, vários arquivos .zip importantes. Encontrá-los pode ser um desafio.

É aí que a nossa função entra. Ela resolve três problemas principais:

  1. Organização Eficiente: Em vez de vasculhar a biblioteca de mídia inteira, você tem uma página exclusiva com todos os seus arquivos .zip em um só lugar. Isso economiza tempo e evita erros.
  2. Busca Rápida: O campo de busca integrado permite que você encontre um arquivo específico em segundos, bastando digitar parte do nome.
  3. Controle Total: Com a opção de deletar os arquivos diretamente da lista, você mantém sua biblioteca limpa e evita o acúmulo de arquivos desnecessários.

Como a Função Funciona nos Bastidores

A função que criamos utiliza as poderosas APIs do WordPress para integrar-se de forma nativa ao seu painel administrativo. Basicamente, ela faz o seguinte:

  • add_media_page(): Esta função é a chave. Ela registra uma nova página dentro do menu “Mídia” com o nome “Arquivos Zip”. Isso cria o submenu que você verá na barra lateral.
  • Query Personalizada: A função busca no banco de dados do WordPress ($wpdb->get_results()) por todos os anexos (post_type = 'attachment') que tenham o tipo MIME (post_mime_type) definido como 'application/zip'. Isso garante que apenas arquivos .zip sejam listados.
  • Integração com o Painel: O layout e o estilo da página são feitos para se parecerem com o restante do painel do WordPress, proporcionando uma experiência de usuário familiar e moderna.

O Código Completo para Você Usar

Você pode copiar e colar o código abaixo diretamente no arquivo functions.php do seu tema. É uma solução completa, com busca, exclusão e um layout moderno, pronta para ser usada.

// Ação para processar a exclusão de arquivos .zip
function meu_submenu_de_zips_processar_acoes() {
    if (isset($_GET['action']) && $_GET['action'] == 'deletar_zip' && isset($_GET['id'])) {
        check_admin_referer('deletar_zip_nonce');
        $post_id = intval($_GET['id']);
        if ($post_id) {
            wp_delete_post($post_id, true);
            wp_safe_redirect(add_query_arg('deletado', 'true', remove_query_arg(['action', 'id'])));
            exit;
        }
    }
}
add_action('admin_init', 'meu_submenu_de_zips_processar_acoes');

// Adiciona o submenu "Arquivos Zip" ao menu de mídia
function meu_submenu_de_zips_completo() {
    add_media_page(
        'Arquivos Zip',
        'Arquivos Zip',
        'manage_options',
        'meu-submenu-de-zips',
        'minha_pagina_de_zips_completa'
    );
}
add_action('admin_menu', 'meu_submenu_de_zips_completo');

function minha_pagina_de_zips_completa() {
    global $wpdb;

    // Lógica de busca
    $search_term = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : '';
    $query_args = "post_type = 'attachment' AND post_mime_type = 'application/zip'";
    
    if (!empty($search_term)) {
        $query_args .= $wpdb->prepare(" AND post_title LIKE %s", '%' . $wpdb->esc_like($search_term) . '%');
    }

    // Obtém os arquivos .zip com base nos critérios de busca
    $zips = $wpdb->get_results(
        "SELECT * FROM {$wpdb->posts} WHERE {$query_args} ORDER BY post_date DESC"
    );

    // CSS para modernizar a página
    echo '<style>
        .meu-submenu-de-zips-wrap {
            padding: 20px;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
        }
        .meu-submenu-de-zips-wrap h1 {
            color: #2c3e50;
            border-bottom: 1px solid #ddd;
            padding-bottom: 10px;
            margin-bottom: 20px;
        }
        .search-form-container {
            display: flex;
            justify-content: flex-end;
            margin-bottom: 20px;
        }
        .search-form-container .search-box {
            padding: 8px 12px;
            border: 1px solid #ccc;
            border-radius: 4px;
            width: 300px;
            font-size: 14px;
        }
        .meu-submenu-de-zips-table {
            background: #fff;
            border-radius: 8px;
            box-shadow: 0 1px 3px rgba(0,0,0,0.1);
            overflow: hidden;
            width: 100%;
        }
        .meu-submenu-de-zips-table th,
        .meu-submenu-de-zips-table td {
            padding: 12px 15px;
            text-align: left;
            border-bottom: 1px solid #eee;
        }
        .meu-submenu-de-zips-table th {
            background: #f7f7f7;
            color: #555;
            font-weight: 600;
        }
        .meu-submenu-de-zips-table tr:hover {
            background: #fcfcfc;
        }
        .meu-submenu-de-zips-table .btn-deletar {
            background: #dc3232;
            color: #fff;
            border: none;
            padding: 6px 10px;
            border-radius: 3px;
            cursor: pointer;
            font-size: 12px;
            text-decoration: none;
            transition: background 0.2s ease;
        }
        .meu-submenu-de-zips-table .btn-deletar:hover {
            background: #c02b2b;
        }
        .notice-success {
            border-left-color: #46b450;
        }
    </style>';

    // Início da página HTML
    ?>
    <div class="meu-submenu-de-zips-wrap">
        <h1>Arquivos Zip</h1>

        <div class="search-form-container">
            <form method="get">
                <input type="hidden" name="page" value="meu-submenu-de-zips" />
                <input type="search" name="s" class="search-box" placeholder="Buscar por título..." value="<?php echo esc_attr($search_term); ?>" />
                <input type="submit" class="button button-primary" value="Buscar" />
            </form>
        </div>

        <?php if (isset($_GET['deletado']) && $_GET['deletado'] == 'true'): ?>
            <div class="notice notice-success is-dismissible">
                <p>O arquivo .zip foi deletado com sucesso!</p>
            </div>
        <?php endif; ?>

        <?php if (!empty($zips)): ?>
            <table class="meu-submenu-de-zips-table">
                <thead>
                    <tr>
                        <th scope="col">Nome do Arquivo</th>
                        <th scope="col">URL do Arquivo</th>
                        <th scope="col">Data</th>
                        <th scope="col">Ações</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($zips as $zip):
                        $delete_nonce_url = wp_nonce_url(
                            add_query_arg(['action' => 'deletar_zip', 'id' => $zip->ID], admin_url('admin.php?page=meu-submenu-de-zips')),
                            'deletar_zip_nonce'
                        );
                    ?>
                        <tr>
                            <td>
                                <strong><a href="<?php echo get_edit_post_link($zip->ID); ?>"><?php echo esc_html($zip->post_title); ?></a></strong>
                            </td>
                            <td>
                                <a href="<?php echo esc_url($zip->guid); ?>" target="_blank"><?php echo esc_url($zip->guid); ?></a>
                            </td>
                            <td>
                                <?php echo date('d/m/Y H:i', strtotime($zip->post_date)); ?>
                            </td>
                            <td>
                                <a href="<?php echo esc_url($delete_nonce_url); ?>" class="btn-deletar" onclick="return confirm('Tem certeza que deseja deletar este arquivo?');">Deletar</a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        <?php else: ?>
            <p>Nenhum arquivo .zip foi encontrado na sua biblioteca de mídia<?php echo !empty($search_term) ? " com o termo \"<strong>" . esc_html($search_term) . "</strong>\"." : "."; ?></p>
        <?php endif; ?>
    </div>
    <?php
}

Para utilizar o código, adicione-o no function de seu tema ou em um plugin de snippet.

Voltar ao Blog