Thêm kích thước hình ảnh nếu mẫu trang


13

Tôi đang xây dựng một trang web thành viên với WordPress Multisite. Có thể hạn chế số lượng hình ảnh đang được tạo tùy thuộc vào mẫu đã chọn không?

Tôi đã thử các dòng mã sau để tạo một số hình ảnh nhất định trên mẫu thư viện:

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

Điều này đã không làm việc. Tôi đã thực hiện một số nghiên cứu và dường như không thể tìm thấy bất cứ điều gì về chủ đề này. Nếu bạn có thể chỉ cho tôi đi đúng hướng, tôi thực sự đánh giá cao nó.


1
Ngoài ra còn có Resizer Dynamic Image Resizer cho phép bạn xác định bao nhiêu kích thước hình ảnh bạn muốn, nhưng chỉ tạo ra một hình ảnh ở một kích thước cụ thể khi cần thiết. Vì ví dụ của bạn, hình thu nhỏ của thư viện sẽ chỉ được tạo cho các hình ảnh xuất hiện trên mẫu page-gallery.php.
xe đạp vào

2
Chỉ muốn đề cập đến hai tùy chọn tuyệt vời khác: Thay đổi kích thước hình ảnh động của @ kaiser và dịch vụ Photon trong JetPack.
bạch dương

Câu trả lời:


13

Đây luôn là một lỗi cho tôi - việc thiếu kích thước hình ảnh theo yêu cầu và số lượng tệp tiếp theo bạn có thể kết thúc nếu bạn có nhiều kích cỡ!

Tôi có thể thấy logic đằng sau những nỗ lực của bạn - vấn đề là, add_image_sizechỉ thực sự phát huy tác dụng tại điểm tải lên. Như vậy, is_page_template(..)sẽ luôn luôn như vậy false.

Một google nhanh chóng đào lên Aqua Resizer , một kịch bản được thiết kế để giải quyết vấn đề này. Thay vì sử dụng add_image_size, bạn sử dụng aq_resizetrực tiếp trong chủ đề của mình và nếu kích thước của hình ảnh không tồn tại, nó sẽ được tạo và lưu vào bộ nhớ cache khi đang di chuyển.

Trong thực tế, tôi đã sử dụng một kỹ thuật tương tự, mặc dù khác nhau, trên một số trang web có nhiều kích cỡ hình ảnh. Bạn vẫn tiết kiệm được chi phí của WordPress khi tạo mọi kích thước cho mọi hình ảnh được tải lên - chúng được tạo nhanh chóng (& được lưu trong bộ nhớ cache) như khi chúng được yêu cầu. Khác biệt ở chỗ, là bạn có thể chỉ cần sử dụng tất cả các chức năng hình ảnh và thẻ mẫu tiêu chuẩn của WP như bình thường!

Ngoài ra, như @Waqas đã đề cập, sử dụng Aqua Resizer sẽ để lại các tệp mồ côi khi bạn xóa một hình ảnh khỏi thư viện phương tiện của mình. Với kỹ thuật của tôi, tất cả các tệp sẽ bị xóa, vì chúng được lưu vào cơ sở dữ liệu và được WordPress công nhận.

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

Và trong thực tế:

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

Tôi dự định biến nó thành một plugin sẽ tự động chuyển đổi tất cả các add_image_sizecuộc gọi thành thay đổi kích thước theo yêu cầu, vì vậy hãy xem dung lượng này!


Cảm ơn bạn đã dành thời gian để để lại một câu trả lời tuyệt vời như vậy. Tôi chắc chắn sẽ cho điều này đi. Điều quan trọng là tôi hiểu điều này ngay trước khi mở máy chủ của mình lên tới nhiều người dùng. Tôi sẽ hét lên nếu tôi có thêm câu hỏi nào.
Sam

2
Tôi đã thực hiện điều này với the_post_thumbnail (); và nó hoạt động hoàn hảo. Một vấn đề: Khi tôi xóa hình ảnh, nó sẽ bị bỏ lại phía sau hình ảnh đã được định cỡ lại bởi tập lệnh của bạn. Có ý kiến ​​gì không?
Sam

5


Tuyên bố miễn trừ trách nhiệm:
- Đây thực sự không phải là một câu trả lời.
- Nó được dự định để giúp bạn với nghiên cứu bổ sung của bạn về chủ đề này.
- Hơn nữa, nó đang phản ánh một - ít nhất là cảm thấy - gần đây thường xuyên xảy ra các câu hỏi tương tự liên quan đến các vấn đề tương tự.


Thông tin bổ sung về chủ đề này về Phát triển Wordpress:

Lưu ý: Danh sách này không được sắp xếp và toàn diện bằng mọi cách.


3

Nếu bạn muốn tạo ngón tay cái khi đang di chuyển, bạn có thể sử dụng bộ chỉnh lại hình ảnh Aqua , nhưng có một nhược điểm của tập lệnh mini này. Các ngón tay cái đã tạo sẽ không xóa khi xóa hình ảnh khỏi thư viện. Nhưng nó không phải là một vấn đề lớn. Nếu được yêu cầu, bạn có thể làm như vậy thông qua các lệnh SHH


1
Điểm tốt về các tập tin không bị xóa. Giải pháp của tôi sẽ không phải chịu đựng điều này! (xem câu trả lời cập nhật).
TheDeadMedic

1

Nó không phải là một câu trả lời trực tiếp cho vấn đề của bạn. Nhưng tôi sẽ giúp bạn làm cho hình ảnh theo nhu cầu của bạn.

Khi bạn sử dụng add_image_size, nó không thay đổi kích thước các hình ảnh hiện có. nó chỉ hoạt động đối với các hình ảnh mới sẽ được tải lên sau khi thêm chức năng add_image_size của bạn.

Vì vậy, mã của bạn sẽ không tạo ra hình ảnh mới cho hàm is_page_template.

Nhưng bạn có thể sử dụng một lớp php đơn giản để giải quyết vấn đề của mình .... đó là một lớp php nổi tiếng đang được sử dụng cho rất nhiều chủ đề cao cấp hiện có cho WordPress. Nó được gọi là Aqua-Resizer.

Bạn có thể tìm thêm chi tiết tại đây https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Vấn đề có thể phát sinh:

Hàm này hoạt động theo cách này ....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

Vì vậy, khi nó không thể cắt (đối với hình ảnh nhỏ mà chiều cao hoặc chiều rộng của bạn được xác định), nó sẽ không hiển thị bất cứ điều gì. Bạn có thể khắc phục tình trạng này bằng cách kiểm tra xem liệu bạn có nhận được giá trị null hay không sau khi chuyển url trong hàm này rất dễ dàng như của tôi ở đây ....

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

Bằng cách này, bạn có thể đảm bảo rằng hình ảnh cụ thể sẽ được tạo cho mẫu trang cụ thể và theo cách này, trang web của bạn sẽ sạch sẽ hơn nhiều.

PS: lớp php này sử dụng hệ thống cắt lõi của WordPress nên không có vấn đề bảo mật.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.