เพิ่มขนาดรูปภาพถ้าเทมเพลทของเพจ


13

ฉันกำลังสร้างเว็บไซต์สมาชิกด้วย WordPress Multisite เป็นไปได้ไหมที่จะ จำกัด จำนวนภาพที่ถูกสร้างขึ้นโดยขึ้นกับเทมเพลตที่เลือก?

ฉันได้ลองใช้บรรทัดของรหัสต่อไปนี้เพื่อสร้างภาพบางภาพในแม่แบบแกลเลอรี่:

// 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 );
}

สิ่งนี้ไม่ทำงาน ฉันได้ทำการวิจัยแล้วและดูเหมือนจะไม่พบสิ่งใดในหัวเรื่อง หากคุณสามารถชี้ให้ฉันในทิศทางที่ถูกต้องฉันจะขอบคุณมันจริงๆ


1
นอกจากนี้ยังมีDynamic Image Resizerของ Otto ที่ให้คุณกำหนดขนาดภาพได้มากเท่าที่คุณต้องการ แต่จะสร้างเฉพาะภาพที่มีขนาดเฉพาะเมื่อจำเป็นเท่านั้น ดังนั้นสำหรับตัวอย่างของคุณรูปขนาดย่อของคลังภาพจะถูกสร้างขึ้นสำหรับรูปภาพที่ปรากฏบนเทมเพลต page-gallery.php เท่านั้น
helgatheviking

2
เพียงแค่พูดถึงตัวเลือกที่ยอดเยี่ยมอีกสองตัวเลือก: @ ImageSize Dynamic Image Resizeและบริการ Photonใน JetPack
Birgire

คำตอบ:


13

นี่เป็นข้อผิดพลาดสำหรับฉันมาตลอด - การขาดการปรับขนาดภาพตามต้องการและจำนวนไฟล์ที่ตามมาคุณสามารถจบลงด้วยหากคุณมีขนาดมาก!

ฉันเห็นตรรกะเบื้องหลังความพยายามของคุณ - ปัญหาคือมีadd_image_sizeเพียงการเล่นที่จุดอัปโหลดเท่านั้น เช่นนี้จะเป็นis_page_template(..)false

Googleขุดขึ้นมาอย่างรวดเร็วAqua Resizerสคริปต์ที่ออกแบบมาเพื่อแก้ไขปัญหานี้ แทนที่จะใช้add_image_sizeคุณใช้aq_resizeโดยตรงในธีมของคุณและหากขนาดของรูปภาพไม่มีอยู่มันจะถูกสร้างและเก็บไว้ในทันที

ในความเป็นจริงฉันใช้เทคนิคที่คล้ายกันถึงแม้ว่าจะแตกต่างกันในหลาย ๆ ไซต์ที่มีขนาดรูปภาพจำนวนมาก คุณยังคงบันทึกค่าใช้จ่ายของ WordPress ที่สร้างทุกขนาดสำหรับทุกภาพที่อัปโหลด - พวกเขาสร้างขึ้นทันที (& แคช) เป็นและเมื่อพวกเขาร้องขอ สิ่งที่แตกต่างก็คือคุณสามารถใช้ฟังก์ชั่นภาพมาตรฐานทั้งหมดของ WP และเทมเพลตแท็กตามปกติ!

นอกจากนี้ตามที่ @Waqas กล่าวถึงการใช้ Aqua Resizer จะทำให้ไฟล์กำพร้าเมื่อคุณลบภาพจากไลบรารีสื่อของคุณ ด้วยเทคนิคของฉันไฟล์ทั้งหมดจะถูกลบเนื่องจากมันถูกบันทึกลงในฐานข้อมูลและรู้จักโดย WordPress

/**
 * 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 );

และในทางปฏิบัติ:

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!

ฉันตั้งใจจะเปลี่ยนให้เป็นปลั๊กอินที่จะแปลงการadd_image_sizeโทรทั้งหมดเป็นการปรับขนาดตามความต้องการโดยอัตโนมัติดังนั้นดูพื้นที่นี้!


ขอบคุณที่สละเวลาเพื่อตอบคำถามที่ยอดเยี่ยม แน่นอนฉันจะให้มันไป เป็นสิ่งสำคัญที่ฉันจะได้รับสิทธิ์นี้ก่อนที่จะเปิดเซิร์ฟเวอร์ของฉันได้ถึงผู้ใช้หลายคน ฉันจะให้คุณตะโกนถ้าฉันมีคำถามเพิ่มเติม
Sam

2
ฉันให้สิ่งนี้กับ the_post_thumbnail (); และมันทำงานได้อย่างสมบูรณ์แบบ ปัญหาหนึ่ง: เมื่อฉันลบภาพมันจะทิ้งขนาดที่สคริปต์ของคุณได้รับการปรับขนาดใหม่ ความคิดใด ๆ
แซม

5


คำเตือน:
- นี่ไม่ใช่คำตอบที่แท้จริง
- มีวัตถุประสงค์เพื่อช่วยคุณในการวิจัยเพิ่มเติมในหัวข้อ
- นอกจากมันจะสะท้อนให้เห็นถึง - อย่างน้อยรู้สึก - ที่เกิดขึ้นเมื่อเร็ว ๆ นี้บ่อยมากขึ้นของคำถามที่คล้ายกันเกี่ยวกับปัญหาที่คล้ายกัน


ข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ในการพัฒนา Wordpress:

หมายเหตุ:รายการไม่ได้เรียงลำดับและครอบคลุมโดยวิธีการใด ๆ


3

หากคุณต้องการสร้างนิ้วหัวแม่มือในทันทีคุณสามารถใช้ตัวปรับขนาดรูปภาพ Aquaแต่มีข้อเสียของมินิสคริปต์นี้ นิ้วหัวแม่มือที่สร้างขึ้นจะไม่ลบเมื่อลบภาพออกจากห้องสมุด แต่มันไม่ใช่เรื่องใหญ่ หากจำเป็นคุณสามารถทำได้ผ่านคำสั่ง SHH


1
จุดดีเกี่ยวกับไฟล์ที่ไม่ถูกลบ ทางออกของฉันจะไม่ประสบปัญหานี้! (ดูคำตอบล่าสุด)
TheDeadMedic

1

มันไม่ใช่คำตอบสำหรับปัญหาของคุณโดยตรง แต่ฉันจะช่วยคุณสร้างภาพตามที่คุณต้องการ

เมื่อคุณใช้ add_image_size มันไม่ได้ปรับขนาดภาพที่มีอยู่ ใช้งานได้เฉพาะกับภาพใหม่ที่จะอัปโหลดหลังจากเพิ่มฟังก์ชั่น add_image_size ของคุณ

ดังนั้นรหัสของคุณจะไม่สร้างภาพใหม่สำหรับฟังก์ชั่น is_page_template

แต่คุณสามารถใช้คลาส php ง่าย ๆ ในการแก้ปัญหาของคุณ .... มันเป็นคลาส php ที่มีชื่อเสียงที่ใช้สำหรับธีมพรีเมี่ยมมากมายสำหรับ WordPress เรียกว่า Aqua-Resizer

คุณสามารถหารายละเอียดเพิ่มเติมได้ที่นี่https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

ปัญหาที่อาจเกิดขึ้น:

ฟังก์ชั่นนี้ทำงานด้วยวิธีนี้ ....

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

ดังนั้นเมื่อมันไม่สามารถครอบตัด (สำหรับภาพขนาดเล็กที่กำหนดความสูงหรือความกว้าง) มันจะไม่แสดงอะไรเลย คุณสามารถเอาชนะสถานการณ์นี้ได้โดยตรวจสอบว่าคุณได้รับค่า Null หลังจากผ่าน url ภายในฟังก์ชั่นนี้ได้อย่างง่ายดายเหมือนของฉันที่นี่ ....

<?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'; } 
?>

ด้วยวิธีนี้คุณสามารถมั่นใจได้ว่าภาพจะถูกสร้างขึ้นสำหรับเทมเพลตหน้าเฉพาะและวิธีที่เว็บไซต์ของคุณจะสะอาดกว่านี้มากขึ้น

PS: คลาส php นี้ใช้ระบบการปลูกพืชหลักของ WordPress ดังนั้นจึงไม่มีปัญหาด้านความปลอดภัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.