Letztes Update: Das Plugin wurde in den WordPress-Kern integriert. Wenn Sie also WordPress 4.4 oder neuer verwenden, haben Sie dies automatisch.
Update: Das in diesem Artikel erstellte Plugin wurde hierher verschoben und verwendet nun das passendere srcset-Attribut. Es ist das offizielle WordPress-Plugin der Responsive Images Community Group und wird vom WordPress Core Team unterstützt. Es ist wahrscheinlich, dass es irgendwann in den WordPress-Kern aufgenommen wird. Ziemlich cool!
Der folgende Beitrag wurde gemeinsam von Tim Evko (@tevko) verfasst. WordPress verfügt über ein integriertes System zum Hochladen von Medien. Wenn Sie ein Bild hochladen, werden automatisch verschiedene Versionen davon erstellt und gespeichert. Tim zeigt uns, wie wir diese Fähigkeit anpassen und nutzen können, um responsive Bilder in Inhalten zu unterstützen.
Wenn Sie wie ich sind und die Aufgabe haben, eine responsive Website zu erstellen, die relativ einfach zu aktualisieren ist, ist WordPress meistens das CMS, auf dem Sie diese Website erstellen werden. Wenn Sie mehr wie ich sind, haben Sie wahrscheinlich eine Lösung für responsive Bilder übersprungen, um es demjenigen, der die Updates durchführt, leichter zu machen. Glücklicherweise können Sie jetzt mit ein paar Zeilen PHP und etwas JavaScript automatische responsive Bildfunktionalität zu Ihrer WordPress-Website hinzufügen.
Hier zeige ich Ihnen, wie Sie Ihrer WordPress-Website Unterstützung für responsive Bilder in Form von einem kleinen WordPress-Plugin hinzufügen können.
Der Markup, den wir letztendlich wollen
Wir verwenden hier die Picturefill-Bibliothek. Vorerst verwenden wir den Markup, den diese Bibliothek vorschlägt und der eng dem ähnelt, was das <picture>-Element bald sein wird.
<picture>-Element wird in Browsern eingeführt, daher wurde das Plugin/der Code in diesem Artikel aktualisiert, um direkt mit dieser Syntax zu arbeiten.<picture>
<source srcset="examples/images/extralarge.jpg" media="(min-width: 1000px)">
<source srcset="examples/images/large.jpg" media="(min-width: 800px)">
<source srcset="examples/images/medium.jpg">
<!-- fallback -->
<img srcset="examples/images/medium.jpg" alt="alt text">
</picture>
Dies ist das grundlegende Markup-Muster, obwohl es etwas komplexer werden kann, um einige Browser-Bugs zu beheben.
Was wir nicht tun werden, ist, diesen Markup direkt in Blogbeiträgen zu verwenden. Wir werden WordPress bitten, uns dabei zu helfen.
Das Theme
Alles, was Sie in Ihrem Theme tun müssen, ist sicherzustellen, dass diese Einzeiler-Zeile in seiner functions.php-Datei vorhanden ist.
add_theme_support('post-thumbnails');
Dies stellt sicher, dass Ihr Theme WordPress die Erlaubnis gibt, die hochgeladenen Bilder zu vergrößern/verkleinern. Ohne sie funktioniert das Plugin nicht.
Das Plugin
Dies ist sinnvoll als WordPress-Plugin, da wir es aktiv halten wollen, unabhängig davon, welches Theme aktiv ist. Wir können es als Ordner mit einer PHP-Datei darin erstellen, um den Plugin-Code selbst zu sein, und eine Kopie der Picturefill-Bibliothek.

Hinzufügen der Bibliothek
Verantwortungsvolles Einreihen
function get_picturefill() {
wp_enqueue_script('picturefill', plugins_url( '/js/picturefill.js', __FILE__ ));
}
add_action('init', 'get_picturefill');
Dies stellt sicher, dass WordPress diese JavaScript-Bibliothek im Frontend lädt.
Größen definieren
Teilen Sie WordPress mit, welche Bildgrößen beim Hochladen erstellt werden sollen.
add_image_size('large-img', 1000, 702);
add_image_size('medium-img', 700, 372);
add_image_size('small-img', 300, 200);
Sie können dies so einrichten, wie Sie möchten. add_image_size hat eine Vielzahl von Parametern, die Sie anpassen können. Im Fall eines 1024×768 Bunny Rabbit JPG, das ich hochgeladen habe, werden viele Versionen erstellt.

Erstellung eines [Shortcodes]
Erweitern wir dieses Plugin und geben ihm echte Funktionalität, indem wir einen Shortcode für responsive Bilder erstellen. So können wir ihn direkt in den Beitragstext einfügen.
[responsive imageid="12" size1="0" size2="500" size3="1000"]
und er gibt den Markup aus, den wir für Picturefill benötigen.
Wir teilen dies in drei Funktionen auf. Eine, um den Shortcode und den auszugebenden HTML-Code zu definieren, eine Hilfsfunktion, um den Alternativtext zurückzugeben, und eine, die speziell zum Durchlaufen und Ausgeben der Bildquellen dient.
function tevkori_get_img_alt( $image ) {
$img_alt = trim( strip_tags( get_post_meta( $image, '_wp_attachment_image_alt', true ) ) );
return $img_alt;
}
function tevkori_get_picture_srcs( $image, $mappings ) {
$arr = array();
foreach ( $mappings as $size => $type ) {
$image_src = wp_get_attachment_image_src( $image, $type );
$arr[] = '<source srcset="'. $image_src[0] . '" media="(min-width: '. $size .'px)">';
}
return implode( array_reverse ( $arr ) );
}
function tevkori_responsive_shortcode( $atts ) {
extract( shortcode_atts( array(
'imageid' => 1,
// You can add more sizes for your shortcodes here
'size1' => 0,
'size2' => 600,
'size3' => 1000,
), $atts ) );
$mappings = array(
$size1 => 'small-img',
$size2 => 'medium-img',
$size3 => 'large-img'
);
return
'<picture>
<!--[if IE 9]><video style="display: none;"><![endif]-->'
. tevkori_get_picture_srcs( $imageid, $mappings ) .
'<!--[if IE 9]></video><![endif]-->
<img srcset="' . wp_get_attachment_image_src( $imageid[0] ) . '" alt="' . tevkori_get_img_alt( $imageid ) . '">
<noscript>' . wp_get_attachment_image( $imageid, $mappings[0] ) . ' </noscript>
</picture>';
}
Dann aktivieren Sie den Shortcode.
add_shortcode( 'responsive', 'tevkori_responsive_shortcode' );
Idealerweise definieren Sie Ihre Breakpoints hier im Plugin und übergeben sie dann überhaupt nicht, wenn Sie den Shortcode verwenden, wie z. B.:
[responsive imageid="12"]
Verwenden Sie dann die Shortcode-Attribute nur in den seltenen Fällen, in denen Sie die Breakpoints überschreiben müssen.
Ändern der Ausgabe des Media-Uploaders
Dieser Shortcode wird von unschätzbarem Wert sein (denken Sie daran, dass wir den Markup in Zukunft programmatisch an das korrekte <picture> anpassen können). Aber woher wissen wir, welche Bild-ID wir verwenden sollen? Die Benutzeroberfläche des Media-Uploaders stellt diese Information nicht zur Verfügung. Sie kennt diese ID jedoch, und mit einem einfachen Filter können wir ändern, was an den Editor gesendet wird.
function responsive_insert_image($html, $id, $caption, $title, $align, $url) {
return "[responsive imageid='$id' size1='0' size2='600' size3='1000']";
}
add_filter('image_send_to_editor', 'responsive_insert_image', 10, 9);
Nun funktioniert die Auswahl und das Einfügen eines Bildes aus dem Editor so:

Das war's! Hier können Sie sehen, wie es funktioniert.

Mehr, was Sie tun können
- Wenn Sie eine breitere Unterstützung wünschen, sollten Sie auch Matchmedia.js installieren. Es lässt @media-Abfragen auch in älteren Browsern funktionieren, was dann automatisch Picturefill funktionieren lässt.
- Anstatt Shortcodes zu verwenden oder die Ausgabe des Media-Uploaders zu ändern, könnten Sie dies mit einem speziellen Bildfeld über Advanced Custom Fields realisieren.
- Sie könnten den Markup so anpassen, dass align-* wie bei WordPress möglich ist. Oder mit
<figure>und<figcaption>-Elementen. Auch Alt-Tags. - Sie könnten die Einstellungen für die Breakpoints über eine Benutzeroberfläche einstellbar machen, die das Plugin erstellt, anstatt sie fest im Plugin zu kodieren.
- Hier ist ein alternativer Ansatz, der Picturefill 2 verwendet und keine Shortcodes.
Hier ist das GitHub-Repo, wenn Sie beitragen möchten.
Ich wünschte, es gäbe etwas Vergleichbares für Joomla!
Interessant. Ich frage mich, wie der Benutzer im visuellen Editor das sieht?
Ich habe das Problem immer gelöst, indem ich Bilder im Inhaltsbereich mit max-width von 100% mittels Media Queries eingestellt habe. Das hat immer 99% der Fälle abgedeckt.
Das ist keine schlechte Praxis. Bilder, die sich ihren Containern anpassen, sind großartig. Aber hier geht es darum, verschiedene Bildgrößen auszuliefern, was mit der Leistung zu tun hat.
Ja, daran habe ich gedacht. Ich kann mir definitiv ein paar Situationen vorstellen, in denen man so etwas tun muss, nur aufgrund der Situation. Wie alles andere ist es eine großartige Lösung für die richtigen Anwendungen.
Ich verwende dieselbe Idee, Josh, aber das ist entscheidend!
Das ist ziemlich interessant, aber die Zahlen würden Kunden, Durchschnittsverbraucher und Faulen völlig abschrecken. Ich denke, anstatt Breakpoints zu definieren, die sowieso immer gleich wären (und wenn nicht, muss man Zeit damit verbringen, die Zahlen perfekt anzupassen), sollte man einfach
article img{max-width: 100%}einstellen und stattdessen die sizeX verwenden, um ganz andere Bilder zu laden.Manche Bilder sehen geschrumpft hässlich aus, wie Branding/Pixelart/Bilder meiner Freundin, also denke ich, dass die Möglichkeit, völlig andere Renderings dieses Bildes auszutauschen, eine bessere Nutzung von Zeit und Bandbreite wäre.
Hallo Oz, glücklicherweise hat dieses Plugin Standardoptionen. Wenn der Benutzer etwas leer lässt (außer der Bild-ID) oder ein Bild aus dem WordPress-Uploader auswählt, greifen die Standardgrößen und der notwendige Markup wird immer noch generiert. Hoffentlich kümmert sich das um die meisten Faulen!
Ich habe etwas sehr Ähnliches vor einer Weile geschrieben – der einzige Unterschied ist, dass ich anstatt eines Shortcodes direkt die Ausgabe jedes Bildes (außer Smileys) ändere, das in the_content() ist. Ich kann dringend empfehlen, es in Verbindung mit dem Manual Image Crop Plugin zu verwenden. Auf diese Weise haben Sie auch die Möglichkeit, jede Bildgröße individuell zuzuschneiden – und ermöglichen so ein etwas höheres Maß an Art Direction (ich sage etwas höher, weil es Ihnen immer noch nicht die Möglichkeit gibt, völlig unterschiedliche Bilder für jede Größe zu verwenden).
Schnelle Frage: Wenn ich den Bildschirm durch die Ausrichtung des Bildschirms ändere, wird dann ständig das kleinere und größere Bild geladen? Gibt es eine Möglichkeit, dass es erkennt, dass das größere Bild bereits geladen wurde und stattdessen dieses mit CSS anpasst?
Das erzielt gute Ergebnisse für responsive Seiten, aber es ist kein responsive Bild. Ich denke, es wird mehr Zeit für das Laden der Seite beanspruchen.
Nicht wahr. Darum geht es ja. Es lädt nur das eine Bild, das für die Media Query geeignet ist. Es gibt zusätzliches JavaScript, aber die Einsparungen bei einem Bild gleichen das wahrscheinlich aus.
Das gefällt mir sehr gut, aber alle typischen Einstellungen für die Anzeige von Anhängen funktionieren nicht mehr, was meine Kunden wünschen werden. Danke fürs Teilen.
Ich verwende ein ähnliches, aber komplexeres System. Im Grunde habe ich eine Option im Media-Uploader, die es mir erlaubt, den 'Kontext' festzulegen, in dem das Bild erscheinen wird, sodass es zum Beispiel enthalten könnte: Sidebar Normal, Sidebar Vollbreite, Hauptinhalt Klein, Hauptinhalt Normal, Hauptinhalt Vollbreite und so weiter.
Jeder dieser Kontexte hat dann ein Array von Bildgrößen, die sich auf bestimmte Breakpoints beziehen, was es mir ermöglicht, die passenden Bildgrößen für ziemlich komplexe Layouts zu haben.
Man muss jedoch ein wenig vorsichtig sein, sonst enden Sie mit einer Menge Knoten im Markup und zu vielen Bildgrößen, die erstellt und gespeichert werden.
Ich verwende keine Shortcodes als Ausgabe (habe nicht daran gedacht!), aber da ich Jetpack-Abonnements nutze, würde das bedeuten, dass keine Bilder in den von Jetpack gesendeten E-Mails wären und stattdessen die Shortcodes angezeigt würden. Ich bin mir nicht sicher, ob es einen Ausweg gibt.
Hoffentlich machen wir das auch in jQuery! Tolle Arbeit!
Das ist großartig. Ich habe nicht einmal daran gedacht, so etwas zu tun. Ich bleibe normalerweise bei der Methode, ein großes Bild einzufügen und max-width auf 100% und Höhe automatisch zu setzen. Ich werde dies bei einem bevorstehenden Kundenprojekt ausprobieren und sehen, wie es ihnen gefällt.
Pingeligkeit: Sie sollten das Skript auf der 'wp_enqueue_scripts'-Aktion anstelle der 'init'-Aktion registrieren. Siehe http://wordpress.stackexchange.com/questions/55924/when-to-use-add-actioninit-vs-add-actionwp-enqueue-scripts
Sie haben Recht! Danke für den Hinweis! Können Sie ein Problem auf GitHub melden?
Vielen Dank für das Teilen dieser großartigen Lösung. Ein Fehler, auf den ich gestoßen bin, ist, dass Sie
<?php wp_head(); ?>in Ihrer header.php und<?php wp_footer(); ?>in Ihrer footer.php verwenden müssen. Wenn<?php wp_head(); ?>nicht verwendet wird, wurden die Bilder nicht angezeigt.Jonas, diese Einbindungen in Ihren Header- und Footer-Dateien sind notwendig und sollten in Ihrem Theme vorhanden sein. Ohne sie können Sie nicht auf viele WordPress-Funktionen zugreifen.
Tim, das sieht in der Tat nach einer guten Lösung aus. Werden Sie es im Repository einreichen? Ich bin immer etwas zögerlich, so etwas auf einer Live-Website auszuprobieren, ohne dass es den Überprüfungsprozess durchlaufen hat.
Becky, ich erwäge, dies möglicherweise im WordPress-Repository einzureichen. Bevor ich das tue, möchte ich einige Funktionen und möglicherweise eine Benutzeroberfläche hinzufügen. Wenn Sie sehen möchten, wie dieses Plugin funktioniert, empfehle ich, es auf einer Entwicklungs-/lokalen/Sandbox-Version von WP zu installieren und dort zu testen.
Das klingt nach einem Plan. Ich werde damit in einer Entwicklungsumgebung experimentieren, aber lassen Sie es uns wissen, wenn Sie es veröffentlichen!
Danke Tim, toller Beitrag. Ich suche jedoch nach CSS-Tricks für Hintergrundbilder. Wenn ich ein Hintergrundbild für einen Wrapper habe, verwende ich „background-size: cover“ und auch etwas wie center center im background-Tag. Was wäre der richtige Weg, dies zu tun?
Danke
Ziemlich interessante Idee, habe nie in diese Richtung gedacht. Der einzige Nachteil ist, dass man das Bild nicht im WYSIWYG sehen kann, nur einen Shortcode (und das ist ein Problem für Content-Editoren). Und noch eins – vor-Shortcode-Bilder sind nicht responsiv (Sie müssen Ihre Beiträge manuell bearbeiten) und wenn Sie das Plugin ausschalten – erhalten Sie überhaupt keine Bilder. Ich werde versuchen, den Standard-img-Tag zu verwenden und ihn mit einem Filter für die Ausgabe von the_content() zu ändern. Sieht so aus, als würde das die erwähnten Probleme beheben.
Das ist eine wirklich interessante Idee, den Bild-Tag mit the_content zu filtern. Und wenn Sie einen Kontext möchten, können Sie eine passende Klasse oder ein Data-Attribut am Bild-Tag haben, das Sie filtern können. Ich wäre interessiert zu sehen, was Sie sich einfallen lassen.
Teilen Sie es mit, wenn Sie es herausfinden! :P
Ich dachte schon an den Content-Filter für img, bevor ich Ihren Beitrag sah. Mit dem 'image_send_to_editor'-Filter sollte es möglich sein, die benötigten Variablen wie image-id in den img-String einzufügen, damit man das Bild leichter finden und die ID erhalten kann. Von da an ist es ein Kinderspiel. ;-)
Wie würden Sie das machen? Ich habe es versucht, aber völlig versagt.
Das ist großartig für feste Breiten, aber wie Draz kommentiert hat, scheint ein Mechanismus erforderlich zu sein, um zuerst zu prüfen, ob eine größere Version bereits geladen wurde, und auf einen max-width-Wert zurückzufallen, anstatt die nächstleichtere Version zu laden.
D.h. das Drehen eines Tablets führt zu Folgendem:
Querformat – js lädt 980px Bildversion
Hochformat – js lädt 480px Bildversion (wenn Querformat bereits geladen wurde, haben wir jetzt beide Bilder angefordert, was unnötig ist)
Bearbeiten von festen Breiten – ich meinte, wenn ein Gerät seine Breite nach dem Laden des DOM nicht ändert.
Ich denke, es wäre besser, wenn das Skript das Bildschirmverhältnis erkennt und das passende Bild mit der nächstgelegenen passenden Größe lädt.
Immer noch werden einige Auflösungen und Bildschirmverhältnisse ignoriert (Hersteller experimentieren viel), daher sollte das Skript in diesem Fall nach dem nächstgelegenen Bild suchen und max-width: 100% CSS darauf anwenden.
Sie könnten auch das Plugin von Noel Tock Hammy verwenden.
Hallo, ich habe das gut am Laufen, aber in IE8-9 tut es nichts?
Ich dachte, die Picturefill-Bibliothek würde ein Fallback bieten. Auf der Github-Seite heißt es, man solle etwas Shviv-Zeug machen, um das Picture-Element usw. hinzuzufügen, aber für diese Version verwenden wir das nicht. Könnte es sein, dass es mit diesem Code einfach nicht funktioniert?
Was fehlt mir?
Vielen Dank im Voraus! :)
Ich drucke manchmal Bilder aus, ich lege die Bilder auf meinen Computermonitor mit Kleber, wenn das Bild zu klein ist, bemale ich den umgebenden Com-Monitor mit schwarzer Farbe.
Es ist ein langsamer Prozess, aber während die Farbe trocknet, gehe ich mit meinem Hund spazieren.
Ein nützlicher und günstiger Tipp, um Ihren Freunden (wenn Sie mehr als einen haben) Ihre Bilder zu zeigen, ist, sie in einen Umschlag zu legen und per Post zu senden, und es ist etwas schneller als das Abkratzen der schwarzen Farbe vom Bildschirm, besonders wenn Sie Ihren Hund nicht finden können.
Ich bin ziemlich neu in WordPress und PHP.
Wie verwende ich das mit Advanced Custom Fields?
Hallo Lily,
Es gibt wahrscheinlich einen besseren Weg, es zu tun als diesen, aber so habe ich es mit meinem erweiterten benutzerdefinierten Bildfeld verwendet.
In meiner .php-Datei.
https://gist.github.com/funzeye/f48f7363ac9aeaa1e618
In diesem Fall ist es aus meiner front-page.php-Datei und ich habe das Bild in einem Figure-Tag – aber das kann ignoriert werden.
Denken Sie auch daran, in Ihren 'Custom Fields'-Einstellungen zu gehen und den Rückgabewert Ihrer Bilder auf Image ID zu ändern, falls er noch nicht gesetzt ist…
Schauen Sie sich die Beispiele für responsive Websites an – http://designmodo.com/responsive-design-examples/ sehr gute Praktiken.
Ich frage mich, ob es eine Möglichkeit gibt, Thumbnails in diesen Größen für bereits vorhandene Bilder auf meiner Website zu erstellen? Oder wird WordPress sie dynamisch erstellen, wenn Sie versuchen, das Bild in einer bestimmten Größe zu verwenden? Wahrscheinlich nicht, aber es wäre schön!
Tatsächlich habe ich gerade ein paar Plugins gefunden, von denen ich glaube, dass sie die Arbeit für mich erledigen sollten.
http://wordpress.org/plugins/ajax-thumbnail-rebuild/
http://wordpress.org/plugins/regenerate-thumbnails/
Gibt es eine Möglichkeit, dass das Bild immer noch im Editor geladen wird, aber der Shortcode im Hintergrund ist? Kunden möchten diesen Shortcode nicht sehen. Gruselige Zahlen! Wo ist mein Bild hin?!
Habe es noch nicht ausprobiert, aber theoretisch müssten Sie nur den Code „Altering the Media Uploader“ aus der function.php entfernen.
Dann müssten Sie die Bild-ID stattdessen in Ihrer PHP-Seite abrufen.
Dieser Ausschnitt könnte dabei helfen: https://gist.github.com/funzeye/f48f7363ac9aeaa1e618
Eigentlich streichen Sie das zurück,
ich denke, Sie werden wahrscheinlich nur „the_content“ in Ihrem PHP verwenden, also ist es unwahrscheinlich, dass Sie jedes Bild separat aus dem Editor abrufen können. Dies wird also wahrscheinlich nicht funktionieren.
Ich würde auch gerne eine gute Lösung dafür finden…