Article image
Marcos Costa
Marcos Costa03/11/2023 18:41
Compartilhe

Wordpress - Filtros a nível de código

  • #Programação para Internet
  • #PHP
  • #API Rest

De maneira simples você não precisa instalar plugins para fazer tudo no Wordpress. Wordpress é um CMS (gerenciador de conteúdo), é o mais utilizado para se criar sites, blogs, portais, etc...

Ao mesmo tempo é um poderoso framework que ainda por cima contém uma robusta API Rest.

Bem, aqui na Prefeitura não estamos alocados em uma nuvem. Uma decisão dos gestores achou por bem concentrar tudo em um ambiente próprio virtualizado, desde os servidores DNS, Webserver, banco de dados e até e-mail. Enfim, cumpro o que me determinam apesar de ter como opinião ser a contramão do que é feito hoje em dia onde tudo está migrando para a nuvem.

Sem rodeios, você pode criar um filtro no final do arquivo functions.php presente na raiz da pasta do seu template. Desta forma não estamos mudando o core e sim acrescentando um comportamento. Tanto que se você ativar outro template irá parar de funcionar.

Basicamente nosso servidor Linux está configurado generosamente para permitir uploads até 32Mb.

Ocorre que ao postar um novo release os jornalistas acabam não tomando certos cuidados. Por mais que você tenha plugins como Smush, não é melhor educar o usuário?

Foi minha abordagem, apesar do limite de 32Mb, implemento um código que limita o upload de fotos nos formatos jpeg, png e gif em 8Mb.

Também bloqueio com ajuda da biblioteca Image Magick subir imagens com mais de 72 dpi, afinal jornalistas se acostumam a trabalhar com fotos de 300dpi que são ideiais para jornais, mas não para sites. Perceba que não é uma limitação de dimensões em pixeis da foto, mas resolução.

Se você confunde dimensão com resolução, saiba que ambos são medidos em pixels. Sem falar que ao salvar fotos em JPEG (há configurações para aumentar ou reduzir o tamanho físico do arquivo), mas foque nos pixels:

Uma imagem com 2500 px x 2000 px com resolução de 72 dpi em JPEG vai ter digamos o tamanho de 500 kb

A mesma imagme com 2500 x 2000 px com resolução de 300 dpi em JPEG vai ter seus 5 Mb por exemplo. Não queremos isso.

Por último notei que estavam mandando fotos sem o nome adequado ao que publicam, a maioria diretamente baixadas do WhatsApp. Então de maneira simples bloqueio nomes que contenham essa String.

function custom_upload_size_limit($file) {
  // Obtém o tipo de arquivo do arquivo carregado
  $filetype = wp_check_filetype($file['name']);

  // Aplica a verificação do nome do arquivo
  $file = check_file_name($file);

  // Define um limite de tamanho personalizado com base no tipo de arquivo
  if ($filetype['ext'] != 'pdf' && $file['size'] > 8388608) { // 8 MB em bytes
      $file['error'] = 'O tamanho do arquivo excede o limite permitido para fotos que é 8Mb. Colabore para que o nosso servidor não fique pesado. Dúvidas: Fale com Marcos Paulo!';
  } elseif ($file['size'] > 33554432) { // 32 MB em bytes
      $file['error'] = 'O tamanho do arquivo excede o limite permitido para PDFs estipulado em 32Mb. Você não precisa enviar um arquivo tão grande!';

  }  
  return $file;
}
//Finalmente adiciono o filtro que passará a tratar o tamanho das imagens
add_filter('wp_handle_upload_prefilter', 'custom_upload_size_limit');

//Função para impedir nomes de arquivo com "WhatsApp Image"
function check_file_name($file) {
  if (stripos($file['name'], 'WhatsApp') !== false) {
      $file['error'] = 'O nome do arquivo não é permitido (contém "WhatsApp"). Renomeie o arquivo antes de enviar com um nome relativo ao release. Dúvidas: Fale com Marcos Paulo!';
  }
  return $file;
}

//Função que utiliza a lib Image Magick para impedir fotos com mais de 72dpi
function custom_dpi_check($file) {
  $filetype = wp_check_filetype($file['name']);
  $allowed_types = array('image/jpeg', 'image/png', 'image/gif');

  if (in_array($file['type'], $allowed_types)) {
      $image_path = $file['tmp_name'];
      $imagick = new Imagick();
      $imagick->readImage($image_path);

      $resolution = $imagick->getImageResolution();
      $xDPI = $resolution['x'];
      $yDPI = $resolution['y'];

      if ($xDPI > 72 || $yDPI > 72) {
          $file['error'] = 'A resolução da imagem excede o limite de 72 DPI, redimensione-a. Nunca use alta resolução como se faz para jornais ou revistas. Dúvidas: Fale com Marcos Paulo!';
      }
  }

  return $file;
}
//Filtro para com ajuda da Lib ImageMagick impedir mais de 72dpi
add_filter('wp_handle_upload_prefilter', 'custom_dpi_check');

Perceba que incluo avisos que surgem a lado da imagem na hora do upload. E que essa foi uma abordagem simples e rápida.

Preparei dois arquivos com problemas, o primeiro tem mais de 8Mb de tamanho.

image

Ele não permite o upload de arquivos com mais de 8Mb

Apesar do PHP permitir uploads de até 32Mb (no meu server), repare que não foi possível subir um arquivo com 9Mb.

image

Resolução acima de 72dpi

Dessa vez ele pegou um arquivo com WhatsApp no nome, mas primeiro ele verifica a resolução da foto e como tem 120 dpi logo barra o upload.

image

Ele detecta "WhatsApp" no nome também barra.

O mesmo aqui após ser ajustado para 72dpi assim mesmo é barrado por ter o nome com uma String que não desejo.

Testado na última versão do Wordpress 6.3.2

No Wordpress você pode criar hooks, filters, functions, plugins, templates e fazer muita coisa legal. Se você quiser aprender mais sobre o framework Wordpress recomendo o seguinte livro (em inglês):

Building web apps with wordpress, 2nd edition (comprei na Amazon)

Compartilhe
Comentários (1)
Raphael Costa
Raphael Costa - 06/11/2023 11:03

Gostei , bem detalhado ajudou d+