Redimensionando imagens programaticamente no WordPress
Se você já teve que trabalhar com redimensionamento de imagens programaticamente no WordPress, pode ter se deparado com a função image_resize.
Além disso, você pode saber que foi descontinuado (já que isso aparece na parte superior da tela):
Esta função foi preterida. Use wp_get_image_editor() em vez disso.
E com sua depreciação, como acontece com todos aqueles que fazem um bom trabalho depreciando a funcionalidade, não é sem sua substituição.
Neste caso, estamos falando do WP Image Editor. Esta é uma classe no WordPress que podemos usar para realizar as mesmas operações para redimensionar imagens programaticamente que antes com a função original.
Para ser claro, este post em particular não é um tutorial completo sobre como usar o WP_Image_Editor.
Em vez disso, é um guia simples de como usá-lo para redimensionar imagens no lugar de uma função obsoleta, juntamente com algumas explicações ao longo do caminho sobre como lidar com casos em que pode haver erros.
Encontrando a imagem a ser usada
Dependendo do que estiver fazendo, você poderá recuperar o nome do arquivo da imagem do próprio WordPress; no entanto, para este exemplo, vou simplesmente codificar o caminho para um arquivo.
Essa é a maneira mais fácil de explicar como usar a classe versus sair pela tangente de como recuperar uma imagem programaticamente, obter seu caminho, enviá-la para a classe do editor e assim por diante.
Então, vamos supor que o caminho fornecido para a imagem seja algo assim:
<?php
$filename = '/Users/tommcfarlin/Projects/acme/wp-content/uploads/2018/06/original-image.jpg';
if (!file_exists($filename)) {
return;
}
Usando isso, vamos armazená-lo em uma variável que podemos passar para outra função caso queiramos operar várias vezes no arquivo original.
Obtendo uma instância do editor de imagens
Em seguida, você deve obter uma instância da classe do editor de imagens para poder operar na imagem localizada no caminho acima. Em sua forma mais básica, nada mais é do que passar um nome de arquivo para uma função e depois um array de argumentos.
Neste post, não estou preocupado com a matriz de argumentos – apenas em obter uma instância do editor com a qual posso usar para redimensionar uma imagem.
Para pegar uma instância do referido editor, basta fazer isso:
<?php
// Grab the editor for the filename of the image.
$filename = '/Users/tommcfarlin/Projects/acme/wp-content/uploads/2018/06/original-image.jpg';
if (!file_exists($filename)) {
return;
}
$editor = wp_get_image_editor( $filename, array() );
Isso retornará uma instância do editor de uma instância de **[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)**(junto com uma mensagem de erro e outras informações que você pode usar para determinar o problema). É sempre bom verificar se o valor retornado é um erro e interromper qualquer operação futura.
<?php
// Grab the editor for the file and the size of the original image.
$filename = '/Users/tommcfarlin/Projects/acme/wp-content/uploads/2018/06/original-image.jpg';
if (!file_exists($filename)) {
return;
}
$editor = wp_get_image_editor( $filename, array() );
if (is_wp_error($editor)) {
// handle the problem however you deem necessary.
}
Supondo que não haja nenhum erro, porém, você pode começar a trabalhar para redimensionar a imagem.
Redimensionando a imagem
Felizmente, isso é algo fácil de fazer. Você precisa de três informações:
- largura,
- altura,
- e se você deseja ou não cortar a imagem.
Na minha experiência, cortar a imagem é quase sempre melhor do que não, porque evita qualquer alongamento estranho ou distorção em proporções estranhas.
Ao redimensionar a imagem, sempre gosto de obter o tamanho atual da imagem e depois usar um multiplicador para criar as novas dimensões pelas quais quero redimensionar a imagem.
Por exemplo, digamos que eu tenha uma imagem e queira redimensionar a largura em 40% e a altura em 30%. Para fazer isso, eu preciso:
- obter o tamanho da imagem atual,
- use a nova largura e altura para redimensionar a imagem.
Programaticamente, é assim que você faria:
<?php
// Grab the editor for the file and the size of the original image.
$filename = '/Users/tommcfarlin/Projects/acme/wp-content/uploads/2018/06/original-image.jpg';
if (!file_exists($filename)) {
return;
}
$editor = wp_get_image_editor( $filename, array() );
if (is_wp_error($editor)) {
// Handle the problem however you deem necessary.
}
// Get the dimensions for the size of the current image.
$dimensions = $editor->get_size();
$width = $dimensions['width'];
$height = $dimensions['height'];
// Calculate the new dimensions for the image.
$newWidth = 0.4 * $width;
$newHeight = 0.3 * $height;
// Resize the image.
$result = $editor->resize($newWidth, $newHeight, true);
Fácil o suficiente de seguir, não é?
Salvando a imagem
Finalmente, tudo o que resta é salvar a imagem. Nesse caso, a imagem será gravada no diretório de uploads (e geralmente o ano e o mês que o WordPress fornece).
<?php
// Grab the editor for the file and the size of the original image.
$filename = '/Users/tommcfarlin/Projects/acme/wp-content/uploads/2018/06/original-image.jpg';
if (!file_exists($filename)) {
return;
}
$editor = wp_get_image_editor( $filename, array() );
if (is_wp_error($editor)) {
// handle the problem however you deem necessary.
}
// Get the dimensions for the size of the current image.
$dimensions = $editor->get_size();
$width = $dimensions['width'];
$height = $dimensions['height'];
// Calculate the new dimensions for the image.
$newWidth = 0.4 * $width;
$newHeight = 0.3 * $height;
// Resize the image.
$result = $editor->resize($newWidth, $newHeight, true);
// If there's no problem, save it; otherwise, print the problem.
if (!is_wp_error($result)) {
$editor->save($editor->generate_filename());
} else {
// Handle the problem however you deem necessary.
}
Você pode então ver a versão final redimensionada (e nomeada apropriadamente) com base em sua saída.