Sebastian
Schmuttermaier.

DIVI Bildgrößen

DIVI Bildgrößen

Elegantthemes hat mit Divi wirklich eines der besten WordPress Themes, wenn nicht sogar das beste Theme überhaupt erschaffen. Es bietet unglaublich viele Möglichkeiten, ist Retina fähig und Responsive. ABER: Wie bei vielen anderen Theme Herstellern auch, erkauft man sich diese Funktionen durch viel zu große Bilddaten.

Ich verwende Bilder mit einer Kantenlänge von 2000 Pixel. Aus diesen Bildern werden aber leider keine kleineren Auflösungen generiert, beispielsweise für die Previewdaten in der Blogübersicht. Wenn nun also in der Übersicht bzw. auf der Startseite 6 Beiträge mit Vorschaubildern liegen, dann kommen hier insgesamt locker 10MB zusammen. Diese Seite dann in der U-Bahn über ein Mobilfunknetz zu laden dauert dann nicht nur bei O2 lange.

Dabei bietet doch WordPress selbst schon einige Funktionen an um mit untrschiedlichen Bildgrößen umzugehen. Diese werden aber von Elegantthemes durch eigene Funktionen ersetzt. Eine elegante Lösung habe ich dazu bei FLDTrace gefunden. Dieser Codeschnipsel erweitert die Functions.php um einige Funktionen damit wieder angepasste Bildgrößen geladen werden können. Ich habe das bei mir implementiert und konnte die Ladezeit der Startseite deutlich verbessern.

Der Code muss in die functions.php, am Besten macht ihr euch auch ein Child Theme zu Divi und legt dort eure eigenen Änderungen und Modifikationen ab.

Happy Coding 😀

Code auf GitHub
Beitrag auf FLDTrace

PHP Code für die functions.php

// enable divi functions add_action( 'wp_enqueue_scripts', 'my_enqueue_assets' ); function my_enqueue_assets() { wp_enqueue_style( 'parent-style', get_template_directory_uri().'/style.css' ); }

//add 1440px image size add_image_size('image_1440', 1440, 9999, false);

//move the 'wp_make_content_images_responsive' filter to run last remove_filter( 'the_content', 'wp_make_content_images_responsive', 10); add_filter( 'the_content', 'wp_make_content_images_responsive', 1600, 1);

add_filter( 'the_content', 'hb_add_id_to_images', 1599, 1); //filter the content and add wp-image-$id class to the images, allowing responsive feature to work function hb_add_id_to_images( $content ) { global $wpdb; if ( ! preg_match_all( '/<img [^>]+>/', $content, $matches ) ) { return $content; }

foreach( $matches[0] as $image ) { if ( !preg_match( '/wp-image-([0-9]+)/i', $image ) ) { $dom = new DOMDocument(); $dom->loadHTML($image); $img_element = $dom->getElementsByTagName('img')->item(0);

$wp_upload_dir = wp_upload_dir(); $image_path = str_replace(trailingslashit(preg_replace("(^https?://)", "", $wp_upload_dir['baseurl'])), '', preg_replace("(^https?://)", "", $img_element->getAttribute('src') ));

$attachment = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_wp_attached_file' AND BINARY meta_value='%s';", $image_path ));

if ($attachment) { $img_element->setAttribute("class", "wp-image-".$attachment[0]); $new_image = $img_element->ownerDocument->saveHTML($img_element);

$content = str_replace ( $image , $new_image , $content); } } }

return $content; }

//lower image max-width to 1080px everywhere (retina compatible) function hb_content_image_sizes_attr( $sizes, $size ) { $width = $size[0];

if ($width >= 1080) $sizes = '(max-width: 1080px) 100vw, 1080px';

return $sizes; } add_filter( 'wp_calculate_image_sizes', 'hb_content_image_sizes_attr', 10 , 2 );

//override Divi 'et_pb_maybe_add_advanced_styles' function to fix the problem of browser downloading overridden background image function hb_pb_maybe_add_advanced_styles() { $styles = array();

// do not output advanced css if Frontend Builder is active if ( ! et_fb_is_enabled() ) { $styles['et-builder-advanced-style'] = ET_Builder_Element::get_style();

if ( preg_match_all('/\.[_a-z0-9]+\.et_pb_fullwidth_header \{.*background-image.*\}/', $styles['et-builder-advanced-style'], $matches ) ) { foreach( $matches[0] as $bg_css ) { $styles['et-builder-advanced-style'] = preg_replace('/url\(.*\)/', 'none', $styles['et-builder-advanced-style']); } }

$styles['et-builder-page-custom-style'] = et_pb_get_page_custom_css(); }

foreach( $styles as $id => $style_data ) { if ( ! $style_data ) { continue; }

printf( '<style type="text/css" id="%2$s"> %1$s </style>', $style_data, esc_attr( $id ) ); }

remove_action( 'wp_footer', 'et_pb_maybe_add_advanced_styles' ); } add_action( 'wp_footer', 'hb_pb_maybe_add_advanced_styles', 9 );

add_action('wp_footer', 'hb_responsive_bg_image', 10); //add responsiveness for background images function hb_responsive_bg_image() { global $wpdb;

$css = ET_Builder_Element::get_style();

//find the background-image css in the inline css if ( preg_match_all('/\.[_a-z0-9]+\.et_pb_fullwidth_header \{.*background-image.*\}/', $css, $matches ) ) { foreach( $matches[0] as $bg_css ) { if (preg_match('/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $bg_css, $url_matches)) { $url = $url_matches[0];

$wp_upload_dir = wp_upload_dir();

$image_path = str_replace(trailingslashit(preg_replace("(^https?://)", "", $wp_upload_dir['baseurl'])), '', preg_replace("(^https?://)", "", $url ));

$attachment = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_wp_attached_file' AND BINARY meta_value='%s';", $image_path ));

$bg_css = preg_replace('/background-color([^;]*);/', '', $bg_css, 1);

if ($attachment) { $image_meta = wp_get_attachment_metadata($attachment[0]);

$extra_css = '';

//add fullsize background image style, fixing the problem of browser downloading overridden background image $extra_css .= ' @media only screen and ( min-width: 1441px ) { ' . $bg_css . ' }';

//add responsive background image for (non-retina) screen with max-width 1440px (use 1440px image), 1080px (use 1080px image), 768px (use 768px image) if ($image_meta['sizes']['image_1440']) { $extra_css .= ' @media only screen and ( max-width: 1440px ) { ' . str_replace(basename($url), $image_meta['sizes']['image_1440']['file'], $bg_css) . ' }'; }

if ($image_meta['sizes']['et-pb-portfolio-image-single']) { $extra_css .= ' @media only screen and ( max-width: 1080px ) { ' . str_replace(basename($url), $image_meta['sizes']['et-pb-portfolio-image-single']['file'], $bg_css) . ' }'; }

if ($image_meta['sizes']['medium_large']) { $extra_css .= ' @media only screen and ( max-width: 768px ) { ' . str_replace(basename($url), $image_meta['sizes']['medium_large']['file'], $bg_css) . ' }'; }

//add responsive background image for retina screen with max-width 1440px (use fullsize image), 768px (use 1440px image), 540px (use 1080px image), 384px (use 768px image) $extra_css .= ' @media only screen and ( max-width: 1440px ) and (-webkit-min-device-pixel-ratio: 2), only screen and ( max-width: 1440px ) and ( min--moz-device-pixel-ratio: 2), only screen and ( max-width: 1440px ) and ( -o-min-device-pixel-ratio: 2/1), only screen and ( max-width: 1440px ) and ( min-device-pixel-ratio: 2), only screen and ( max-width: 1440px ) and ( min-resolution: 192dpi), only screen and ( max-width: 1440px ) and ( min-resolution: 2dppx) { ' . $bg_css . ' }';

if ($image_meta['sizes']['image_1440']) { $extra_css .= ' @media only screen and ( max-width: 768px ) and (-webkit-min-device-pixel-ratio: 2), only screen and ( max-width: 768px ) and ( min--moz-device-pixel-ratio: 2), only screen and ( max-width: 768px ) and ( -o-min-device-pixel-ratio: 2/1), only screen and ( max-width: 768px ) and ( min-device-pixel-ratio: 2), only screen and ( max-width: 768px ) and ( min-resolution: 192dpi), only screen and ( max-width: 768px ) and ( min-resolution: 2dppx) { ' . str_replace(basename($url), $image_meta['sizes']['image_1440']['file'], $bg_css) . ' }'; }

if ($image_meta['sizes']['et-pb-portfolio-image-single']) { $extra_css .= ' @media only screen and ( max-width: 540px ) and (-webkit-min-device-pixel-ratio: 2), only screen and ( max-width: 540px ) and ( min--moz-device-pixel-ratio: 2), only screen and ( max-width: 540px ) and ( -o-min-device-pixel-ratio: 2/1), only screen and ( max-width: 540px ) and ( min-device-pixel-ratio: 2), only screen and ( max-width: 540px ) and ( min-resolution: 192dpi), only screen and ( max-width: 540px ) and ( min-resolution: 2dppx) { ' . str_replace(basename($url), $image_meta['sizes']['et-pb-portfolio-image-single']['file'], $bg_css) . ' }'; }

if ($image_meta['sizes']['medium_large']) { $extra_css .= ' @media only screen and ( max-width: 384px ) and (-webkit-min-device-pixel-ratio: 2), only screen and ( max-width: 384px ) and ( min--moz-device-pixel-ratio: 2), only screen and ( max-width: 384px ) and ( -o-min-device-pixel-ratio: 2/1), only screen and ( max-width: 384px ) and ( min-device-pixel-ratio: 2), only screen and ( max-width: 384px ) and ( min-resolution: 192dpi), only screen and ( max-width: 384px ) and ( min-resolution: 2dppx) { ' . str_replace(basename($url), $image_meta['sizes']['medium_large']['file'], $bg_css) . ' }'; }

?> <style type="text/css" id="responsive-bg-image-style"> <?php echo $extra_css;?> </style> <?php } } } } } // **********End Faster, Better Divi images******

WordPress Backup erstellen

WordPress Backup erstellen

Nachdem ich hier bereits einen kurzen Artikel über die Sicherheit des Adminbereichs von WordPress geschrieben habe folgt nun noch ein Artikel über das Backup der WordPress Installation.

Nicht nur Steve Jobs wusste, das die einfachsten und simplesten Dingen oftmals die Besten sind. Getreu diesem Grundsatz stelle ich euch mein WordPress Backup vor. Keep it simple, stupid (das KISS Prinzip)  😀

Backup Strategie entwickeln!

Am Anfang steht man auf der grünen Wiese und weiss nicht so recht wie und wo man anfangen soll. Das Plugin ist installiert und nun geht es an dessen Einrichtung. Wichtig ist das man Überblick über die eigenen Dateien behält. Auch sollte man Grundwissen über WordPress und dessen Datenhaltung haben.

Was muss / sollte alles gesichert werden?

Zunächst muss man sich darüber klar werden was eigentlich alles gesichert werden soll. Bei WordPress handelt es sich schon um zwei verschiedene Quellen. Zunächst brauchen wir alle Dateien aus dem WordPress Verzeichnis. Das ist aber nur die Hälfte der Miete! WordPress speichert alle Beiträge, Seiten und Kommentare sowie seine eigenen Einstellungen in einer MySQL Datenbank. Ohne diese Datenbank ist ein Restore (Wiederherstellung) unmöglich!

Wohin werden die Daten gespeichert?

Ein Backup macht nur so lange Sinn wie es die gesicherten Daten „ortsfremd“ sichert. Das heist das die Backupdaten nicht auf dem gleichen Systemen aufbewahrt werden wie die Nutzdaten. Im Fall von WordPress heist das, das die Backupdaten entweder in die Cloud (Dropbox, Amazon S3, etc.) oder auf einem anderen Server (rSync, Samba, etc.) gesichert werden. Nur dann ist im Falle eines Komplettverlustes auch eine Wiederherstellung möglich.

Wie lange bewahre ich die Daten auf, wie oft werden diese überschrieben?

Bei dieser Überlegung geht es um die sogenannte Retention Time. Dahinter steht die Überlegung wie lange man historische Backups aufhebt bevor diese gelöscht bzw. überschrieben werden. Da sich auf meiner Seite nicht täglich etwas ändert habe ich mich für 14 Tage als Zeitrahmen entschieden. Somit erstelle ich wöchentlich ein volles Backup und hebe dieses 2 Wochen auf. Somit befinden sich immer zwei komplette Vollsicherung auf meinen Festplatten (bzw. Dropbox). Sollte sich die Webseite aus einem Satz nicht wiederherstellen lassen, bleibt mir immer noch ein zweiter Satz.

Der doppelte Boden

Der Einsatz des Backup Plugins ist schon ein großer Schritt in Richtung Datensicherheit. Allerdings muss ich mich dabei auf automatische Systeme verlassen. Und auch wenn mich diese per Mail benachrichtigen bleibt doch ein Gefühl der Unsicherheit. Daher habe ich mich entschieden zusätzlich zum automatischen Backup noch eines per Hand zu erstellen. Das ist zwar zeitaufwändig, aber den Job muss der Rechner erledigen – und nicht ich. Das Backup „doppelter Boden“ ist eine flache 1:1 Kopie des gesamten Webroots per FTP auf meinen Rechner bzw. eine externe Festplatte. Somit habe ich zwar alle Nutzdaten wie Bilder, Panoramen und WordPress. Aber es fehlt das Herz jeder WordPress Installation: die Datenbank. Diese exportiere ich mit phpMyAdmin und sichere sie mit auf die USB Festplatte. Der phpMyAdmin ist genauso verhasst wie vergöttert, aber das ist ein anderes Thema. Für mein Backup tut er genau seine Dienste, und eine Wiederherstellung ist kein Problem.

Meine Lösung des Problems

Ich hab das Plugin UpdraftPlus installiert. Das Plugin lässt sich super konfigurieren und automatisieren. Das heist man kann hervorragend auswählen welche Dateien, auch zusätzlich zur WordPress Installation, ausgewählt und gesichert werden sollen. Auch ist es bereits in der kostenlosen Ausgabe möglich entfernte Ziele wie z.B. Dropbox als Sicherungsziel festzulegen.

Wordpress Plugin Updraft Plus

WordPress Plugin Updraft Plus

Zudem hat man die Möglichkeit sich über alle Aktivitäten des Systems per Mail benachrichtigen zu lassen. Auch gibt es eine gute Übersicht über bereits bestehende Sicherungen:

Wordpress Updraft Plus Backup

WordPress Updraft Plus Backup

WordPress Login absichern

WordPress Login absichern

Wie sichere ich den Adminbereich von WordPress ab?

Schon von Berufs wegen als ITler ist sind mir zwei Dinge schon immer sehr wichtig:

  • Backup, Restore oder allgemein die Sicherheit meiner Daten gegen Beschädigung und Verlust
  • Sicherheit der Anwendungen gegen Diebstahl und unbefugtes Eindringen bzw. Veränderung

Diese beiden Themen treiben mich natürlich auch auf meiner Webseite um. Das Backup und Restore Thema habe ich schon vor einigen Monaten recht gut lösen können, dazu in einem weiteren Beitrag gerne mehr.

Das Sicherheitsthema in WordPress ist schon auf so viele Webseiten durchgekaut worden. Ich möchte euch nur ein meiner Meinung nach geniales Plugin hinweisen das euch hilft den Adminbereich von WordPress zu schützen. Die Sicherheit in WordPress basiert auf vielen kleinen Faktoren. Je mehr ihr von diesen kleinen Faktoren beachtet desto sicherer wird das Gesamtkonzept der Seite. Hier eine kleine Tabelle die euch sicherlich hilft:

  • Tabellenpräfix anpassen. In einer Standardinstallation lautet der Präfix wp_ und sollte auf einen Fantasiewert angepasst werden.
  • Benutzernamen anpassen. Nehmt für die Administrativen Arbeiten nicht den Redakteurszugang mit dem ihr auch Beiträge verfasst. Und nennt den Administrator nicht Administrator. „Administrator“ ist ein Zustand, kein Name!
  • Passwörter möglichst komplex halten. Jaja, da mag ich gar nichts mehr dazu schreiben. Macht bitte vernünftige Passwörter, und bewahrt diese dann nicht unter der Tastatur auf.
  • Aktualisierungen sofort bzw. zeitnah einspielen. Und zwar nicht nur vom WordPress Kernsystem, sondern auch von allen PLugins und Themes. Dass kann man automatisieren – und muss sich dann nur noch prüfend darum kümmern.
  • Keine Dateien aus unklaren Quellen verwenden. Sprich ich würde nur Plugins und Themes verwenden deren Herkunft ich kenne.

Den WordPress Administrator Login Bereich absichern

Als einen weitern Baustein empfiehlt es sich den Login Bereich von WordPress zu sichern. Der Grund und die Vorgehensweise ist recht simpel.

Standardmäßig ist der Login Bereich immer unter der URL http://Domäne.tld/wp-admin zu erreichen. Nun ist es ein leichtes zu versuchen hier eine funktionierende Benutzername:Passwort Kombination zu testen. Gerade wenn der Administrator auch noch Administrator heist steigt die Chance auf 50% das korrekte Passwort zu erraten.

Abhilfe kann hier das Plugin WPS Hide Login schaffen.

WPS-Hide-Login

WPS-Hide-Login

Es verändert die Adresse zum Adminbereich auf einen frei zu wählenden Wert. Dieser kann nach der Installation und Aktivierung von im Adminbereich unter der Rubrik Einstellungen gewählt werden.

WPS-Hide-Login Konfiguration im WordPress Administrator Bereich

WPS-Hide-Login

Nun laufen alle Angriffe auf die Adresse /wp-admin ins Leere.

Besonders gefällt mir die Einfachheit mit der Wirkungsvoll die WordPress Installation geschützt wird, Daumen hoch!

all-inkl.de führt PHP7 ein

all-inkl.de führt PHP7 ein

Mein neuer Provider überrascht mich immer wieder. Seitdem ich Anfang Dezember 2015 über die Fertigstellung von Heise Developer gelesen habe war mein Interesse geweckt. Haben doch die Entwickler doch unter der Haube sehr viel gedreht und verbessert. Besonders die Performance stand wohl im Mittelpunkt. Und das kommt direkt WordPress zu Gute, einzelne Test ergaben eine Steigerung von bis zu 50%.

All-inkl.de hat, ohne groß auf der Webseite dafür zu werben, bereits PHP7 eingeführt und bietet seinen Kunden im KAS (Kunden Administrations System) die Möglichkeit mittels diesen Eintrages in der .htaccess

AddHandler php70-cgi.php

bereits jetzt schon auf die neue PHP Version umzusteigen. Natürlich hab ich das sofort ausprobiert und bin bisher begeistert. Probleme mit meiner WordPress Installation konnte ich bisher keine fest stellen. Und die Performance? Ist deutlich schneller! Sehr fein, Daumen hoch für all-inkl!

Providerwechsel

Providerwechsel

Nach einigen Jahren des Webhostings bei Hetzner, mit denen ich sehr zufrieden war, wurde es einfach mal Zeit für etwas Neues. Und so wechselte ich vor zwei Jahren den Hoster und bin bei Strato gelandet. Für den gleichen Preis bekam ich dort wesentlich mehr Webspace, sehr gut dachte ich, das brauche ich für meine Panoramen. Doch dann gingen die Probleme los: In meinem Mailpostfach sammelte sich der vom Spamfilter nicht aussortierte Werbungsmüll. Ein Blick in meine Maileinstellungen zeigte mir aber, das ich bei Strato alle Viren- und Spamscanner aktiviert hatte. Nach vielen Anrufen in der Hotline und ellenlangen Supportmails habe ich dann irgendwann aufgegeben und es akzeptiert. Was ich aber nie wirklich akzeptiert habe ist die wahrlich schlechte Performance meiner WordPress Installation. Dabei handelt es sich doch um ein allerwelts CMS, mit einer Handvoll Plugins an meine Bedürfnisse angepasst. So etwas sollte doch im 21. Jahrhundert (hey wir fliegen bis zum Mars!) kein Problem sein?

(mehr …)