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:
- Organização Eficiente: Em vez de vasculhar a biblioteca de mídia inteira, você tem uma página exclusiva com todos os seus arquivos
.zipem um só lugar. Isso economiza tempo e evita erros. - Busca Rápida: O campo de busca integrado permite que você encontre um arquivo específico em segundos, bastando digitar parte do nome.
- 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.zipsejam 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.
