Cho đến nay, tôi không gặp vấn đề gì với hình thu nhỏ ảnh nền trong chủ đề của mình. Tuy nhiên, bây giờ khi tôi đang cố gắng sử dụng một SVG làm hình ảnh đặc trưng, một cái gì đó đang phá vỡ. Vấn đề dường như liên quan đến chiều rộng của các SVG được trả về bằng 0 wp_get_attachment_image_src()
. Vì vậy, những gì tôi đang cố gắng làm là tìm ra cách trích xuất thông tin chiều rộng và chiều cao từ SVG, sau đó đặt chúng thành các giá trị phù hợp trong các trường cơ sở dữ liệu của SVG, không dễ dàng.
Lưu ý: không có vấn đề chung khi tải lên hoặc hiển thị các Svss, chúng hiển thị tốt trong logo của tôi.
Lỗi và mã: bằng chứng về độ rộng bằng không
Đây là lỗi mà Wordpress ném trên trang:
Warning: Division by zero in /wp-content/themes/tesseract/functions.php on line 771
Đây là mã trong hàm.php trước lỗi (trên dòng 771).
/*759*/ function tesseract_output_featimg_blog() {
/*760*/
/*761*/ global $post;
/*762*/
/*763*/ $thumbnail = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' );
/*764*/ $featImg_display = get_theme_mod('tesseract_blog_display_featimg');
/*765*/ $featImg_pos = get_theme_mod('tesseract_blog_featimg_pos');
/*766*/
/*767*/ $w = $thumbnail[1]; /* supposed to return thumbnail width */
/*768*/ $h = $thumbnail[2]; /* supposed to return thumbnail height */
/*769*/ $bw = 720;
/*770*/ $wr = $w/$bw;
/*771*/ $hr = $h/$wr; /**** this is the line that throws the error ****/
Bạn có thể thấy có một bộ phận với $wr
mẫu số. Dường như nó $wr
đang được tính là 0 vì yếu tố duy nhất không phải là hằng số của $w
nó cũng bằng không (yếu tố khác là 720, vì vậy không thể đổ lỗi). $w
Giá trị được xác định bởi $thumbnail[1]
. $thumbnail[1]
Giá trị của được đặt trên dòng 763 với mã này:
$thumbnail = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' );
Và theo Codex , giá trị thứ hai trong mảng trả về của hàm wp_get_attachment_image_src
(nghĩa là $thumbnail[1]
) thực sự là chiều rộng của hình thu nhỏ. Giá trị đó dường như bằng 0, bởi vì nó có cùng giá trị với $w
, đó thực sự là mẫu số trên dòng 771. :(
Lưu ý quan trọng: Chủ đề của tôi triển khai hình thu nhỏ dưới dạng hình nền
Chủ đề gốc mà tôi đang sử dụng, "Tesseract", đặt các hình ảnh nổi bật làm hình nền của các neo / <a>
phần tử, thay vì đặt chúng làm <img>
các phần tử. Tôi không tin đây là nguyên nhân của vấn đề, nhưng khi đưa ra giải pháp, chúng phải tương thích với ảnh nền chứ không phải <img>
đối tượng.
Không thể điều chỉnh sửa lỗi # 1:
Tôi đã tìm thấy trang web này cung cấp cách khắc phục các sự cố khi sử dụng SVG làm hình ảnh nổi bật. Nó cho thấy vấn đề có liên quan đến tính toán chiều rộng. Tuy nhiên, tôi không thể áp dụng sửa lỗi đó vì nó dành cho một img
phần tử có SVG là a src
, tôi có một <a>
phần tử có vị trí SVG được đặt thành background-image
- url
.
Đây là bản sửa lỗi
function custom_admin_head() {
$css = '';
$css = 'td.media-icon img[src$=".svg"] { width: 100% !important; height: auto !important; }';
echo '<style type="text/css">'.$css.'</style>';
}
add_action('admin_head', 'custom_admin_head');
Khắc phục lỗi số 2 (độ rộng tối thiểu qua CSS) không hoạt động
Dựa trên ý tưởng tôi có được từ trang trên, chiều rộng của vấn đề có thể là vấn đề, tôi đã thử đặt độ rộng tối thiểu 50% chỉ bằng CSS cho <a>
. Đây là mã:
a.entry-post-thumbnail.above {
min-width: 50% !important;
}
Các công cụ dành cho nhà phát triển của tôi cho thấy CSS "đã", độ rộng tối thiểu được đặt thành 50%. Tuy nhiên, WP đã ném cùng một lỗi mà hình ảnh không hiển thị. Có lẽ CSS không thiết lập nó trước khi Hàm.php chạy wp_get_attachment_image_src, vì vậy nó không thành vấn đề?
Bất cứ ai cũng có bất kỳ manh mối nào về cách làm việc xung quanh tính toán bằng không này? Tôi thực sự muốn làm cho nó hoạt động với hình nền, và không phải ghi đè quá nhiều chủ đề gốc.
Khắc phục lỗi số 3 (nối bộ lọc) không hoạt động.
Với sự giúp đỡ của @Milo, @NathanJohnson và @prosti, tôi đã có thể thử một bộ lọc để thay đổi wp_get_attachment_image_src()
. Mã không tạo ra lỗi nhưng nó không xóa lỗi phân chia hoặc hiển thị SVG. Đoạn mã này tôi đặt vào hàm.php. Có lẽ các ưu tiên là sai? :
add_filter( 'wp_get_attachment_image_src', 'fix_wp_get_attachment_image_svg', 10, 4 ); /* the hook */
function fix_wp_get_attachment_image_svg($image, $attachment_id, $size, $icon) {
if (is_array($image) && preg_match('/\.svg$/i', $image[0]) && $image[1] == 1) {
if(is_array($size)) {
$image[1] = $size[0];
$image[2] = $size[1];
} elseif(($xml = simplexml_load_file($image[0])) !== false) {
$attr = $xml->attributes();
$viewbox = explode(' ', $attr->viewBox);
$image[1] = isset($attr->width) && preg_match('/\d+/', $attr->width, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[2] : null);
$image[2] = isset($attr->height) && preg_match('/\d+/', $attr->height, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[3] : null);
} else {
$image[1] = $image[2] = null;
}
}
return $image;
}
Điểm mấu chốt:
Tôi tin rằng tôi cần tìm ra cách trích xuất thông tin chiều rộng từ chính tệp SVG và thêm nó vào cơ sở dữ liệu WP trước khi hàm.php chạy tính toán trên dòng 771. Nếu bạn biết cách, hướng dẫn của bạn sẽ thực sự được đánh giá cao.
Một số tài nguyên có thể hữu ích
- Câu hỏi này dường như có thông tin hữu ích và đoạn trích được cung cấp bởi @Josh ở đó cho phép tôi cuối cùng xem các SVG của mình trong thư viện phương tiện, nhưng hình ảnh đặc trưng vẫn bị hỏng.
- Câu hỏi này dường như có một số giải pháp dựa trên XML nhưng tôi không biết làm thế nào để thích ứng nó với WP.
- Ngoài ra một bình luận dưới đây đã chỉ cho tôi bộ lọc này có vẻ phù hợp.
Tiêu đề của tệp SVG
Đây là tiêu đề SVG:
<?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="475.419px" height="406.005px" viewBox="0 0 475.419 406.005" enable-background="new 0 0 475.419 406.005" xml:space="preserve">
fix_wp_get_attachment_image_svg
chức năng ở đây và nơi bộ lọc được thêm vào đây . Đọc add_filter
trong tài liệu để giải thích về các bộ lọc.
wp_get_attachment_image_src
trong mã nguồn, có một bộ lọc cùng tên. Sử dụng bộ lọc để trả về kích thước chính xác cho hình ảnh svg.