Soluções

Permitir Envio de Mídia (e Limitar Tamanho) por Usuários no WordPress

Google+ Pinterest LinkedIn Tumblr
Anúncios Google

Esses dias estive numa enrascada do WordPress: queria ter um blog em que leitores contribuíssem com envio de artigos – e com isso, enviariam também imagens que fizessem parte deles. O problema é que o WordPress, por padrão, não permite o envio de mídia alguma por colaboradores, o que inviabilizava ou pelo menos dificultava a tarefa.

Pesquisei bastante até achar um jeito, primeiro, de permitir que meus colaboradores enviassem mídia. Encontrei respostas em vários lugares, e a origem parece ser este site. O código é bem simples e funciona, mas fiz uma pequena modificação: troquei o current_user_can(‘contributor’), fora do padrão do WordPress (já a função checa o que o usuário pode fazer e não seu papel diretamente), por current_user_can(‘update_core’), código válido e padronizado.

Só precisa ser adicionado à nossa página functions.php:

// libera upload para colaboradores
if ( !current_user_can('update_core') && !current_user_can('upload_files') ) {
add_action('admin_init', 'colaboradores_uploadam');
}
function colaboradores_uploadam() {
$contributor = get_role('contributor');
$contributor->add_cap('upload_files');
}

É fácil decifrar o que o código faz. Primeiro ele checa se o usuário atual não tem direito de atualizar a versão do WordPress (pelo update_core, coisa que só o adminstrador tem acesso). Logo, se ele não tem direito (!) e (&&) se ele não tiver autorização de enviar arquivos, a função segue para a permissão, no segundo bloco (add cap, ou adicionar capacidade ao “contributor” de subir arquivos).

Até aí excelente, mas surgiu uma nova dificuldade: os contribuidores poderiam enviar qualquer tamanho de mídia até o limite do WordPress (que por padrão é 2MB para imagens). Isso é muita coisa para uma simples imagem, eu precisava restringir o tamanho limite para evitar que colegas desavisados e menos experientes mandassem imagens enormes e de lento carregamento.

Eu poderia diminuir o tamanho das mídias no painel Configurações > Mídia, mas a ideia é que o arquivo fosse redimensionado ao enviar.

Como não sou tão experiente em PHP para escrever uma nova função, comecei a caçar um jeito de editar essa, inserindo nela um limitador para o tamanho da imagem, mas não consegui exceto através de um plugin.

O Resize at Upload Plus reduz TODAS as imagens enviadas para uma largura e/ou altura máxima estabelecida; assim, mesmo que alguém mandasse uma imagem de 2MB, na resolução 1500 x 1000, ela seria reduzida para o que eu determinasse assim que fosse feito o upload.

Plugin Resize at Upload WordPress

Bacana… Tudo bem que algum engraçadinho ainda pode mandar uma imagem no tamanho máximo e com excelente qualidade, bem grande em MB, mas a probabilidade já era menor.

MAS ainda tinha um problema: e se eu precisasse enviar imagens mais largas que os 350 pixels em que ajustei o plugin? Não poderia pois ele afeta todos os usuários. Como fazer para o plugin afetar apenas os não-administradores do blog? Havia algumas soluções com plugin, mas usar um plugin para corrigir outro não me agrada muito.

Tentei de várias formas sem ter que mexer nos arquivos do plugin, já que uma atualização estragaria tudo, mas enfim desisti e acabei o editando. É uma gambiarra: se quiser tentar, é por sua conta – adianto que pra mim está funcionando muito bem (desde que eu não esqueça e atualize o plugin por acidente…)

Abra o arquivo “resize-at-upload-plus.php” na pasta do plugin, e procure pelo trecho que mostra:

function hz_uploadresize_resize($array){ 

// $array contains file, url, type

  if ($array['type'] == 'image/jpeg' OR $array['type'] == 'image/gif' OR $array['type'] == 'image/png') {

Mude para:

function hz_uploadresize_resize($array){ 

// $array contains file, url, type

  if ( !current_user_can('update_core') and $array['type'] == 'image/jpeg' OR $array['type'] == 'image/gif' OR $array['type'] == 'image/png') {

A função original é a que faz a detecção do tipo de arquivo que será enviado – se for imagem jpeg, gif ou png, o plugin entra em ação, reduzindo-o. O trecho adicionado (!current_user_can(update_core’) and) acrescenta um reconhecimento do tipo de usuário, como antes: se ele não tiver autorização para atualizar a versão do WordPress, o arquivo é afetado pelo plugin. Se tiver autorização (o que só administradores podem fazer), o plugin não se aplica, e a imagem sobe normalmente.

Essa solução pode não ser (provavelmente não é) a ideal, já que sou quase leigo em PHP, mas está funcionando ok. Se você é desenvolvedor e souber como fazer com uma função que evite editar o arquivo do plugin, fique à vontade para colaborar.

Fundador do Tutoriart em 2010, é ex-instrutor de Photoshop, design web e gráfico. Em quase uma década de redação online, tem cerca de 1500 artigos publicados. Gerencia também o Memória BIT.

2 Comentários

Deixe um Comentário

Pin