#php #wordpress
#php #wordpress
Вопрос:
Только что заметил это после включения режима отладки в Php 7.4. Есть несколько вопросов, связанных с этим, но ни один из них не получил положительного ответа. Хотелось бы получить достойный ответ для тех, кто также столкнется с той же проблемой в 7.4 WP
Эти строки читаются:
// Get image size after cropping.
$dims = image_resize_dimensions( $orig_w, $orig_h, $width, $height, $crop );
$dst_w = $dims[4];
$dst_h = $dims[5];
// Return the original image only if it exactly fits the needed measures.
if ( ! $dims amp;amp; ( ( ( null === $height amp;amp; $orig_w == $width ) xor ( null === $width amp;amp; $orig_h == $height ) ) xor ( $height == $orig_h amp;amp; $width == $orig_w ) ) ) {
$img_url = $url;
$dst_w = $orig_w;
$dst_h = $orig_h;
} else {
// Use this to check if cropped image already exists, so we can return that instead.
$suffix = "{$dst_w}x{$dst_h}";
$dst_rel_path = str_replace( '.' . $ext, '', $rel_path );
$destfilename = "{$upload_dir}{$dst_rel_path}-{$suffix}.{$ext}";
if ( ! $dims || ( true == $crop amp;amp; false == $upscale amp;amp; ( $dst_w < $width || $dst_h < $height ) ) ) {
// Can't resize, so return false saying that the action to do could not be processed as planned.
return false;
}
// Else check if cache exists.
elseif ( file_exists( $destfilename ) amp;amp; getimagesize( $destfilename ) ) {
$img_url = "{$upload_url}{$dst_rel_path}-{$suffix}.{$ext}";
}
// Else, we resize the image and return the new resized image url.
else {
$editor = wp_get_image_editor( $img_path );
if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) )
return false;
$resized_file = $editor->save();
if ( ! is_wp_error( $resized_file ) ) {
$resized_rel_path = str_replace( $upload_dir, '', $resized_file['path'] );
$img_url = $upload_url . $resized_rel_path;
} else {
return false;
}
}
}
Разрешенный код выглядит следующим образом: — Как упоминалось в комментарии к утвержденному ответу, декларации $ dst_w amp; dst_h были помещены в оператор else .
// Get image size after cropping.
$dims = image_resize_dimensions( $orig_w, $orig_h, $width, $height, $crop );
// Return the original image only if it exactly fits the needed measures.
if ( ! $dims amp;amp; ( ( ( null === $height amp;amp; $orig_w == $width ) xor ( null === $width amp;amp; $orig_h == $height ) ) xor ( $height == $orig_h amp;amp; $width == $orig_w ) ) ) {
$img_url = $url;
$dst_w = $orig_w;
$dst_h = $orig_h;
} else {
// Use this to check if cropped image already exists, so we can return that instead.
$suffix = "{$dst_w}x{$dst_h}";
$dst_rel_path = str_replace( '.' . $ext, '', $rel_path );
$destfilename = "{$upload_dir}{$dst_rel_path}-{$suffix}.{$ext}";
$dst_w = $dims[4];
$dst_h = $dims[5];
if ( ! $dims || ( true == $crop amp;amp; false == $upscale amp;amp; ( $dst_w < $width || $dst_h < $height ) ) ) {
// Can't resize, so return false saying that the action to do could not be processed as planned.
return false;
}
// Else check if cache exists.
elseif ( file_exists( $destfilename ) amp;amp; getimagesize( $destfilename ) ) {
$img_url = "{$upload_url}{$dst_rel_path}-{$suffix}.{$ext}";
}
// Else, we resize the image and return the new resized image url.
else {
$editor = wp_get_image_editor( $img_path );
if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) )
return false;
$resized_file = $editor->save();
if ( ! is_wp_error( $resized_file ) ) {
$resized_rel_path = str_replace( $upload_dir, '', $resized_file['path'] );
$img_url = $upload_url . $resized_rel_path;
} else {
return false;
}
}
}
Ответ №1:
Уведомление означает, что $dims — это не массив, а логическое значение, вероятно, потому, что image_resize_dimensions завершается ошибкой и возвращает false .
image_resize_dimensions возвращает false, если
- исходный размер равен 0 или меньше
- оба назначения with и height равны 0 / не указаны
- исходный размер равен целевому размеру (в этом случае изображение не нужно изменять)
Вы должны проверить, что значение $dims не равно false, прежде чем пытаться получить доступ к $dims[4] и $ dims[5] .
Комментарии:
1. Это то, о чем я думал. Но тогда это будет означать, что разрешение требует от меня изменения всех местоположений, в которых вызывается $ dims ? Или есть разрешение, которое мы можем вставить прямо здесь? Кроме того, как 7.4 вызвал это уведомление, поскольку оно бездействовало во всех предыдущих версиях
2. Я бы предположил, что предупреждения просто не регистрировались ранее. Ваш код работает нормально. Ваш оператор if проверяет, если! $ dims ($ dims === false) и просто использует исходный размер в качестве целевого размера. Вам просто нужно переместить $ dst_w = $dims[4]; $ dst_h = $dims[5]; часть внутри тела else, чтобы она не выполнялась, если $ dims не является массивом.
3. Я также предполагаю, что я переборщил с анализом. Это было скорее любопытство, и я видел другие оставшиеся без ответа вопросы по этому поводу; так что спасибо!