KeyCDN Cache Enabler um wp_is_mobile() Funktion erweitern

Cache Enabler ist ein sehr mächtiges und schlankes Caching Plugin für Wordpress. Leider fehlt ihm der Support für die Funktion wp_is_mobile(). Wie Du diesen nachrüstest und mittels Umgehung von PHP Deinem Blog fast Flügel verleihst zeige ich Dir hier.

KeyCDN Cache Enabler um wp_is_mobile() Funktion erweitern

Als ich mit meinem Projekt guenstig-kochen.at begonnen habe, habe ich mich damals leider für kein aktuelles und schon gar kein Responsive Theme entschieden. War es ja mehr oder weniger nur eine Schnappsidee und somit komplett egal. Erst mit der Zeit wuchs man Anspruch an mein Baby und ich wollte es in ordentliche Kinderschuhe stecken.

Also begann ich das Urspurgs-Template umzuarbeiten und „meinen“ Ansprüchen nach zu verändern. Fröhlich nutzte ich auch die WordPress Funktion wp_is_mobile(), diese erkennt ob die Seite durch ein mobiles Gerät aufgerufen wird, und stand plötzlich, nach dem Umstieg auf KeyCDN’s Cache Enabler, vor einem Problem.

Rief ich meine Seite mit dem Desktop auf, so wurde sie korrekt angezeigt. Ruf ich danach die Seite wieder mit dem smarten Phone auf, so hatte ich dort aber die Desktop-Variante. Also Cache löschen, Seite mit dem Handy wieder neu aufrufen, passt. Zurück zum Desktop grinste mich die mobile Variante an.

Zum durchdrehen sag‘ ich dir. Echt jetzt!

Also hingesetzt und recherchiert. Nichts gefunden. Hersteller angeschrieben zu meinem Problem. Antwort: (ich übersetze frei)

Das Problem ist uns bekannt, wird aber derzeit nicht daran gearbeitet bzw unterstützt. Bitte überdenke den Einsatz eines anderen Themes

Nö, Nö, Nööööööö… so nicht, dachte ich mir. Also recherchierte ich weiter und fand nach Tagen dann mal diese Seite => Diff for cache_enabler_disk.class.php to add wp_is_mobile() support to KeyCDN’s Cache Enabler plugin

Da ich ja hellseherische Fähigkeiten haben muss, wusste ich sofort was der Ersteller dieses Beitrags mir sagen wollte mit seinem Code

Viel Spaß damit ^^ Ok, dann doch anders. Damit Du Dir die Arbeit sparst, poste ich Dir hier den Lösungsweg nochmal

Öffne, im Plugin-Verzeichnis, die Datei cache_enabler_disk.class.php mit einem Editor deiner Wahl und finde

const FILE_HTML = 'index.html';
const FILE_GZIP = 'index.html.gz';
const FILE_WEBP_HTML = 'index-webp.html';
const FILE_WEBP_GZIP = 'index-webp.html.gz';

Ändere diese in

const FILE_HTML = 'index.html';
const FILE_HTML_MOBILE = 'index-mobile.html';
const FILE_GZIP = 'index.html.gz';
const FILE_GZIP_MOBILE = 'index-mobile.html.gz';
const FILE_WEBP_HTML = 'index-webp.html';
const FILE_WEBP_GZIP = 'index-webp.html.gz';

Finde

@unlink($path.self::FILE_HTML);
@unlink($path.self::FILE_GZIP);
@unlink($path.self::FILE_WEBP_HTML);
@unlink($path.self::FILE_WEBP_GZIP);

und ersetze dies durch

@unlink($path.self::FILE_HTML);
@unlink($path.self::FILE_HTML_MOBILE);
@unlink($path.self::FILE_GZIP);
@unlink($path.self::FILE_GZIP_MOBILE);
@unlink($path.self::FILE_WEBP_HTML);
@unlink($path.self::FILE_WEBP_GZIP);

Finde

if ( $http_accept_encoding && ( strpos($http_accept_encoding, 'gzip') !== false ) && is_readable( self::_file_gzip() )  ) {
header('Content-Encoding: gzip');
readfile( self::_file_gzip() );
exit;

und ersetze es mit

               if ( $http_accept_encoding && ( strpos($http_accept_encoding, 'gzip') !== false ) && is_readable( self::_file_gzip() ) ) {
                       if ( wp_is_mobile() ) {
                               header('Content-Encoding: gzip');
                               readfile( self::_file_gzip_mobile() );
                               exit;
                       }
                       else {
                               header('Content-Encoding: gzip');
                               readfile( self::_file_gzip() );
                               exit;
                       }

finde

readfile( self::_file_html() );
exit

und ersetze es durch

               if ( wp_is_mobile() ) {
                       readfile( self::_file_mobile_html() );
                       exit;
               }
               else {
                       readfile( self::_file_html() );
                       exit;
               }

Finde

/**
        * get file path
        *

                return self::_file_path(). self::FILE_HTML;
        }

und füge darunter ein

       /**
       * get mobile file path
       *
       * @since   1.0.0
       * @change  1.0.7
       *
       * @return  string  path to the mobile html file
       */

       private static function _file_mobile_html() {
               return self::_file_path(). self::FILE_HTML_MOBILE;
       }

Find als Letztes

        /**
        * get gzip file path
        *
                return self::_file_path(). self::FILE_GZIP;
        }

und füge darunter ein

       /**
       * get gzip file path
       *
       * @since   1.0.1
       * @change  1.0.7
       *
       * @return  string  path to the gzipped mobile html file
       */

       private static function _file_gzip_mobile() {
               return self::_file_path(). self::FILE_GZIP_MOBILE;
       }

So, jetzt hast Du Cache Enabler wp_is_mobile() fit gemacht. Aber, das ist leider ein großer Nachteil, nur bis zum nächsten Update des Plugins. Dann musst Du leider diesen Weg wieder von neuem beschreiten.

Damit du dir diese Arbeit ersparst, biete ich dir hier die korrigierte cache_enabler_disk.class.php (Aktuell in Version 1.2.2) zum Download an.

DOWNLOAD

Solltest Du meinen Rat befolgt haben und die Ausführung von PHP mittels .htaccess übergangen haben, so musst du diese Anweisung wie folgt abändern.

# BEGIN Cache Enabler
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# set blog sub path
SetEnvIf Request_URI "^(.*)$" SUB_PATH=/wp-content/cache/cache-enabler/

# set Cache Enabler path
SetEnvIf Request_URI "^(.*)$" CE_PATH=$1

<IfModule mod_mime.c>
# gzip mobile HTML file
RewriteCond %{ENV:CE_PATH} /$
RewriteCond %{ENV:CE_PATH} !^/wp-admin/.*
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !(wp-postpass|wordpress_logged_in|comment_author)_
RewriteCond %{HTTP:x-wap-profile}  !^$ [OR]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|kindle|iemobile|ipad|iphone|ipod|mobile safari|opera mobile|palmos|webos|googlebot-mobile" [NC,OR]
RewriteCond %{HTTP:Profile} !^$
RewriteCond %{HTTP:Accept-Encoding} gzip
# auskommentieren, wenn du auf https setzt
# RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}%{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-mobile.html.gz -f
RewriteRule ^(.*) %{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-mobile.html.gz [L]

# webp HTML file
RewriteCond %{ENV:CE_PATH} /$
RewriteCond %{ENV:CE_PATH} !^/wp-admin/.*
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !(wp-postpass|wordpress_logged_in|comment_author)_
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{HTTP:Accept} image/webp
# auskommentieren, wenn du auf https setzt
# RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}%{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-webp.html.gz -f
RewriteRule ^(.*) %{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-webp.html.gz [L]

# gzip HTML file
RewriteCond %{ENV:CE_PATH} /$
RewriteCond %{ENV:CE_PATH} !^/wp-admin/.*
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !(wp-postpass|wordpress_logged_in|comment_author)_
RewriteCond %{HTTP:Accept-Encoding} gzip
# auskommentieren, wenn du auf https setzt
# RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}%{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index.html.gz -f
RewriteRule ^(.*) %{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index.html.gz [L]

AddType text/html .gz
AddEncoding gzip .gz
</IfModule>
# mobile HTML file
RewriteCond %{ENV:CE_PATH} /$
RewriteCond %{ENV:CE_PATH} !^/wp-admin/.*
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !(wp-postpass|wordpress_logged_in|comment_author)_
RewriteCond %{HTTP:x-wap-profile}  !^$ [OR]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|kindle|iemobile|ipad|iphone|ipod|mobile safari|opera mobile|palmos|webos|googlebot-mobile" [NC,OR]
RewriteCond %{HTTP:Profile} !^$
# auskommentieren, wenn du auf https setzt
# RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}%{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-mobile.html -f
RewriteRule ^(.*) %{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-mobile.html [L]

# webp HTML file
RewriteCond %{ENV:CE_PATH} /$
RewriteCond %{ENV:CE_PATH} !^/wp-admin/.*
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !(wp-postpass|wordpress_logged_in|comment_author)_
RewriteCond %{HTTP:Accept} image/webp
# auskommentieren, wenn du auf https setzt
# RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}%{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-webp.html -f
RewriteRule ^(.*) %{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index-webp.html [L]

# default HTML file
RewriteCond %{ENV:CE_PATH} /$
RewriteCond %{ENV:CE_PATH} !^/wp-admin/.*
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !(wp-postpass|wordpress_logged_in|comment_author)_
# auskommentieren, wenn du auf https setzt
# RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}%{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index.html -f
RewriteRule ^(.*) %{ENV:SUB_PATH}%{HTTP_HOST}%{ENV:CE_PATH}index.html [L]
</IfModule>
# END Cache Enabler

Nun hast Du rein faktisch eine mobile Seite deines Blogs mit WordPress, obwohl Du kein eigenes mobiles Theme dafür angelegt hast.