Bildgröße hinzufügen, wenn Seitenvorlage


13

Ich baue eine Mitglieder-Website mit WordPress Multisite auf. Ist es möglich, die Anzahl der erzeugten Bilder in Abhängigkeit von der ausgewählten Vorlage zu beschränken?

Ich habe die folgenden Codezeilen ausprobiert, um bestimmte Bilder in der Galerievorlage zu generieren:

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

Das hat nicht funktioniert. Ich habe einige Nachforschungen angestellt und kann anscheinend nichts zu diesem Thema finden. Wenn Sie mich in die richtige Richtung lenken könnten, wäre ich Ihnen sehr dankbar.


1
Es gibt auch Ottos Dynamic Image Resizer, mit dem Sie so viele Bildgrößen definieren können, wie Sie möchten, aber nur dann ein Bild mit einer bestimmten Größe erzeugen, wenn es benötigt wird. In Ihrem Beispiel werden die Miniaturansichten der Galerie nur für die Bilder generiert, die in der page-gallery.php-Vorlage angezeigt werden.
helgatheviking

2
Ich möchte nur zwei weitere großartige Optionen erwähnen: @ kaisers Dynamic Image Resize und den Photon-Dienst in JetPack.
Birgire

Antworten:


13

Das war schon immer ein Problem für mich - das Fehlen von Bildgrößen bei Bedarf und die nachfolgende Anzahl von Dateien, mit denen Sie enden können, wenn Sie viele Größen haben!

Ich kann die Logik hinter Ihren Bemühungen erkennen - das Problem ist, dass Sie add_image_sizeerst beim Hochladen wirklich ins Spiel kommen. Als solches is_page_template(..)wird es immer sein false.

Eine schnelle Google- Version von Aqua Resizer , einem Skript zur Behebung dieses Problems. Anstatt es zu verwenden add_image_size, verwenden Sie es aq_resizedirekt in Ihrem Design. Wenn keine Größe für das Bild vorhanden ist, wird es sofort erstellt und zwischengespeichert.

Tatsächlich habe ich an mehreren Standorten mit vielen Bildgrößen eine ähnliche, wenn auch unterschiedliche Technik angewendet. Sie sparen immer noch den Aufwand für WordPress, indem Sie jede Größe für jedes hochgeladene Bild generieren - sie werden sofort generiert (& zwischengespeichert), wenn sie angefordert werden. Der Unterschied besteht darin, dass Sie einfach alle Standardbildfunktionen und Vorlagen-Tags von WP wie gewohnt verwenden können!

Wie @Waqas bereits erwähnte, hinterlässt die Verwendung von Aqua Resizer verwaiste Dateien, wenn Sie ein Bild aus Ihrer Medienbibliothek löschen. Mit meiner Technik werden alle Dateien gelöscht, da sie in der Datenbank gespeichert und von WordPress erkannt werden.

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

Und in der Praxis:

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!

Ich beabsichtige, dies in ein Plugin umzuwandeln, das automatisch alle add_image_sizeAufrufe in Größenänderungen nach Bedarf umwandelt. Sehen Sie sich also diesen Bereich an!


Vielen Dank, dass Sie sich die Zeit genommen haben, eine so gute Antwort zu hinterlassen. Ich werde es auf jeden Fall versuchen. Es ist wichtig, dass ich dies richtig einstelle, bevor ich meinen Server für mehrere Benutzer öffne. Ich rufe Sie an, wenn ich weitere Fragen habe.
Sam

2
Ich habe es mit the_post_thumbnail () versucht. und es funktioniert perfekt. Ein Problem: Wenn ich das Bild lösche, bleibt das Bild zurück, dessen Größe von Ihrem Skript geändert wurde. Irgendwelche Ideen?
Sam

5


Haftungsausschluss:
- Dies ist eigentlich keine Antwort.
- Es ist dazu gedacht , Ihnen Ihre zusätzliche Forschung zum Thema zu helfen.
- Des weiteren wird sie ist ein reflektierendes - zumindest Filz - in letzter Zeit häufiger Auftreten ähnlicher Fragen zu ähnlichen Problemen.


Weitere Informationen zu diesem Thema in der Wordpress-Entwicklung:

Hinweis: Die Liste ist keinesfalls geordnet und vollständig.


3

Wenn Sie im Handumdrehen Daumen erstellen möchten, können Sie den Aqua Image Resizer verwenden. Dieses Miniskript hat jedoch einen Nachteil. Die erstellten Thumbnails werden beim Löschen des Bildes aus der Bibliothek nicht gelöscht. Aber es ist keine große Sache. Bei Bedarf können Sie dies über SHH-Befehle tun


1
Guter Punkt zu Dateien, die nicht gelöscht werden. Darunter wird meine Lösung nicht leiden! (siehe aktualisierte Antwort).
TheDeadMedic

1

Es ist keine direkte Antwort auf Ihr Problem. Aber ich werde Ihnen helfen, ein Bild nach Ihren Bedürfnissen zu machen.

Wenn Sie add_image_size verwenden, wird die Größe der vorhandenen Bilder nicht geändert. Dies funktioniert nur für die neuen Bilder, die nach dem Hinzufügen Ihrer Funktion add_image_size hochgeladen werden.

Ihr Code generiert also keine neuen Bilder für die Funktion is_page_template.

Aber Sie können eine einfache PHP-Klasse verwenden, um Ihr Problem zu lösen ... es ist eine berühmte PHP-Klasse, die für viele Premium-Themen für WordPress verwendet wird. Es heißt Aqua-Resizer.

Weitere Informationen finden Sie hier: https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Problem, das auftreten kann:

Diese Funktion funktioniert so ....

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

Also, wenn es nicht beschneiden kann (für kleine Bilder, die Ihre Höhe oder Breite definiert haben), wird nichts angezeigt. Sie können diese Situation überwinden, indem Sie überprüfen, ob Sie einen Nullwert erhalten, nachdem Sie die URL in dieser Funktion ganz einfach übergeben haben, wie hier bei mir.

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

Auf diese Weise können Sie sicherstellen, dass das bestimmte Bild für eine bestimmte Seitenvorlage generiert wird, und auf diese Weise wird Ihre Website viel sauberer.

PS: Diese PHP-Klasse verwendet das WordPress-Core-Cropping-System, sodass es keine Sicherheitsprobleme gibt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.