Month: August 2016

Die ini_get_all() Warnung in WordPress 4.6 angehen

Gestern Nacht wurde WordPress 4.6 veröffentlicht. Dieses Release glänzt mit “Shiny Updates” sowie der Unterstützung nativer Fonts im Admin, aber vor allem unter der Haupe hat sich wieder Einiges getan. Ein großer Dank gebührt dabei neben anderen Dominik Schilling, der dieses Release in führender Rolle begleitet hat und monatelang daran gearbeitet hat. Auch dem deutschsprachigen Polyglot-Team, welches es wieder einmal geschafft hat, alle neuen Textelemente der Version rechtzeitig zur Veröffentlichung übersetzt zu haben, gebührt viel Dank.

Bisher läuft das Update ziemlich reibungslos. Ich beispielsweise hatte auf diesem Blog keinerlei Probleme. Allerdings hat sich gezeigt, dass es in manchen Server-Konfigurationen zu der Ausgabe einer kleinen Fehlermeldung kommen kann:

Warning: ini_get_all() has been disabled for security reasons in /var/www/html/wp-includes/load.php on line 1020
Die Fehlermeldung
Die ini_get_all() Fehlermeldung auf der Login-Seite. In meinem Fall ist sie etwas umfangreicher, da ich diese in einer speziellen Entwicklungsumgebung ausgebe, die mir noch mehr Informationen ausgibt.

Was bedeutet diese Fehlermeldung

WordPress läuft mit PHP. Dein Hoster kann mit Hilfe der Datei php.ini individuell festlegen, einige Funktionen zu deaktivieren. So blockieren einige Hoster beispielsweise den Befehl system() mit dem man System-Befehle ausführen kann. In der Konfigurationsdatei findet sich dazu die Zeile disable_functions. Hier können Funktionen deaktiviert werden, welche vom Hoster als für nicht sicher erklärt werden. Wenn Du also eine solche Fehlermeldung bekommst, so wurde die Funktion ini_get_all() in diese Liste mit aufgenommen.

Das bedeutet allerdings nicht, dass Dein WordPress nun nicht mehr läuft. Allerdings erhälst Du nun eine Fehlermeldung, die ich – zumindest in meinen Tests – auch nicht unterdrücken konnte, indem ich die WordPress Konstante WP_DEBUG auf false setzte (was bei einer Liveseite automatisch der Fall ist, es sei denn, man hätte dies in der wp-config.php absichtlich geändert).

Ist mein WordPress jetzt unsicher?

Was macht die Funktion ini_get_all() eigentlich und warum wird sie in WordPress benötigt? Mit Hilfe dieser Funktion kann man die Konfigurationseinstellungen der php.ini auslesen. Für ressourcenintensive Prozesse versucht WordPress manchmal das in der php.ini gesetzte Arbeitsspeicherlimit hochzusetzen. Dies passiert beispielsweise um sicherzustellen, dass Bilder die hochgeladen werden auch korrekt verarbeitet werden können. Nun erlaubt allerdings nicht jeder Hoster die Einstellungen der Konfiguration mit Hilfe des Befehls ini_set() zu ändern. Um also für diesen Fall gewappnet zu sein führt WordPress 4.6 die Funktion wp_is_ini_value_changeable() ein. Diese Funktion prüft, ob ein bestimmter Wert der php.ini mit Hilfe von ini_set() geändert werden kann. Nur in diesem Fall wird dann versucht beispielsweise das Arbeitsspeicherlimit zu erhöhen. Eine sinnvolle Aktion also, die ein bisschen Ärger sparen kann. Nur: Um das herauszufinden nutzt wp_is_ini_value_changeable() die Funktion ini_get_all() und handelt sich damit Ärger mit anderen Hostern ein, welche es für ein Sicherheitsrisiko halten, einem PHP-Script die aktuelle Konfiguration mitzuteilen?!

Warum die Funktion als unsicher angesehen werden soll erschließt sich mir nicht ganz, allerdings wird sie im beschriebenen Kontext nicht in irgendeiner Art und Weise eingesetzt die als unsicher einzustufen wäre. Dein WordPress ist nicht unsicher wegen der Verwendung von ini_get_all().

Mittlerweile ist ein Patch unterwegs, welches dieses Problem beheben soll. Es ist also davon auszugehen, dass das Problem mit 4.6.1, welches wahrscheinlich in wenigen Tagen herauskommen wird und die ersten Stolpersteine der Version behebt, auch dieses Problem beheben wird.

Soll ich jetzt nicht updaten?

Wenn Du sicher gehen möchtest, dass Du dieses Problem nicht hast, kannst Du vor dem Update prüfen, ob die Funktion bei Dir deaktiviert wurde. Gehe dabei wie folgt vor:

Erstelle eine Datei mit folgendem Inhalt:

<?php phpinfo(); ?>

Nenne diese Datei beispielsweise phpinfo.php. Lade sie via FTP in Deinen Webspace und rufe sie im Browser unter http://deine-domain.de/phpinfo.php auf. Hier siehst Du nun eine Zusammenfassung Deines PHP-Systems. Suche hier mit der Suchfunktion des Browsers nach ini_get_all. Wenn Du nichts findest kannst Du sicher sein, dass diese Funktion nicht deaktiviert wurde.
Wichtig: Lösche die Datei phpinfo.php wieder, da diese Informationen enthält, welche Du eigentlich nicht öffentlich zugänglich haben möchtest.

Alternativ kannst Du auch auf das WordPress Plugin phpinfo zurückgreifen. Dieses Plugin gibt Dir die Informationen im WordPress Admin unter Einstellungen > WordPress phpinfo() aus.

Und natürlich: Wie bei jedem Update solltest Du auch hier natürlich zunächst ein Backup Deiner Seite angelegt haben.

Ich habe aber schon geupdated und jetzt dieses Problem

Richtig ärgerlich an diesem Problem (daneben, dass es die Seite häßlich macht) ist, dass es den Pfad zu Deiner WordPress Installation ausgibt. Das möchtest Du wirklich nicht. Prüfe bei Deinem Hoster, ob Du eine eigene php.ini für Deinen Webspace erstellen kannst. Üblicherweise findet sich so eine Information in der FAQ zu Deinem Webspace. Wenn dies der Fall ist kannst Du eine php.ini einsetzen, welche diese Funktion nicht deaktiviert. Wie Du dabei vorgehst erfährst Du üblicherweise von Deinem Hoster.

Sollte dies nicht möglich sein, bitte Deinen Hoster, diese Funktion nicht zu deaktivieren. Viele Hoster lassen sich auf so etwas ein, wenn man freundlich fragt.

Sollte auch das nicht möglich sein kannst Du zu guter Schluss folgendes machen: Gehe in die Datei wp-includes/load.php. Dort findest Du in Zeile 1020 das Problem. Dort steht:

$ini_all = ini_get_all();

Setze nun vor die Funktion ini_get_all() ein @-Zeichen:

$ini_all = @ini_get_all();

Dies wird die Fehlermeldung unterdrücken. Normalerweise würde ich niemals empfehlen die System-Dateien von WordPress zu ändern, aber in diesem Fall nimmst Du diese Änderung nur temporär vor. Änderungen in den Systemdateien werden mit dem nächsten Update überschrieben. Da das nächste Update allerdings absehbar dieses Problem angegangen sein wird willst Du ja direkt, dass deine Änderung wieder aus dem System getilgt wird.

Wie konnte es zu einem solchen Fehler kommen

Zunächst einmal, es handelt sich um eine relativ kleine Warnung die zwar ärgerlich ist aber nicht Dein System kaputt macht. Seit fast einem Monat wird WordPress 4.6 von vielen unterschiedlichen freiwilligen Helfern auf den unterschiedlichsten Serverkonfigurationen getestet und getestet. Das sind die sogenannten Release Candidates, welche vor der Veröffentlichung einer neuen Version veröffentlicht werden. Kein einziger dieser Helfer hatte allerdings eine Serverkonfiguration, bei der dieses Problem aufgetaucht wäre. Es ist also ein eher seltenes Problem. Verhindern kann jeder ein solches Problem. Gerade, wenn Du von diesem Problem betroffen bist und weist, dass Du eine eher exotische Serverkonfiguration hast wäre es super, wenn Du Dich beim nächsten WordPress Release einbringst und den Release Candidate testest. Natürlich nicht mit Deiner eigenen Webseite. Aber Du könntest ein Unterverzeichnis erstellen, in welchem Du eine Testversion von WordPress am Laufen hast. Wenn dann der Release Candidate veröffentlicht wird (worüber Du beispielsweise in den WordPress News im Admin informiert wirst) kannst Du diesen dort testen und noch bevor die nächste Version draußen ist, würdest Du sehen, ob Du in Probleme rennst wegen der neuen Version oder Deiner Serverkonfiguration. Nicht nur würdest Du Dir dann Ärger ersparen. Es ist super einfach, bei einem solchen Problem dieses schnell zu melden, so dass es gefixt würde, bevor die Version überhaupt veröffentlicht ist. Dazu gibt es das sogenannte Alpha/Beta-Forum, in welchem man sich melden kann. Je mehr Leute testen, desto weniger Fehler wird es geben! Erfahre hier, wie Du mithelfen kannst, WordPress zu verbessern.

Was ist eigentlich BuddyPress?

Du wolltest schon immer mal eine eigene Community aufmachen? Dein eigenes kleines Facebook betreiben? Dann solltest Du Dir mal das WordPress Plugin BuddyPress anschauen, denn BuddyPress installiert auf Deinem WordPress System eine eigene Community in Sekunden. In diesem Beitrag werden wir Schritt für Schritt durch die Funktionen des Plugins gehen.

Wo wird BuddyPress eingesetzt?

Das bekannteste Beispiel ist wahrscheinlich wordpress.org selbst. Wenn Du dort einen Account erstellst, dann hast Du Dich in einer Community angemeldet, welche durch das BuddyPress Plugin organisiert ist. Es gibt aber auch zahlreiche Universitäten und andere Seiten, welche ihre Communities mit BuddyPress betreiben. Insgesamt werden mehr als 200.000 Communities mit BuddyPress betrieben.

Wo erhalte ich BuddyPress?

BuddyPress ist ein kostenloses Plugin, welches – wie WordPress selbst – unter der GPL Lizenz vertrieben wird. Am besten gehst Du einfach in das Repository von WordPress und lädst es Dir von dort herunter. BuddyPress ist übrigens Dank der tollen Arbeit des deutschen Polyglot-Teams vollständig ins Deutsche übersetzt. Ich nutze für diesen Beitrag allerdings die englischsprachige Version. Im Repository findest Du auch zahlreiche weitere Plugins, welche die Funktionalität von BuddyPress erweitern.

Installation

Der BuddyPress Eröffnungsbildschirm
Der BuddyPress Eröffnungsbildschirm

Nachdem Du das Plugin aktiviert hast kommst Du auf den Eröffnungsbildschirm des Systems. Hier erhält man alle Informationen, um das System an den Start zu bringen. Zunächst werden wir nun die Komponenten aufsetzen.

BuddyPress besteht aus mehreren Komponenten:

Die Komponenten von BuddyPress
Die Komponenten von BuddyPress
  • Extended Profiles:
    Mit Hilfe dieser Komponente kann man selber Felder festlegen, welche die Nutzer ausfüllen können, um die für Deine Community benötigten Informationen über sich zu hinterlegen. Wenn diese Komponente aktiv ist, so kann man unter Benutzer > Profilfelder eigene Felder definieren, welche die Benutzer während der Anmeldung oder danach ausfüllen können. Dabei kann man festlegen, ob das Feld für die Registrierung benötigt wird und um welche Art von Feld (einfaches Textfeld, Selectbox, Datumseingabe und so weiter) es sich handelt.
  • Account Settings:
    Diese Komponente ermöglicht es den Nutzern selbst festlegen zu können, über welche Aktivitäten in Deiner Community sie benachrichtigt werden möchten.
  • Friend Connections:
    Wenn Du diese Komponente aktivierst, so können sich die Nutzer untereinander befreunden und den Aktivitäten ihrer Freunde folgen.
  • Private Messaging:
    Mit Hilfe dieser Komponente können die Nutzer Privatnachrichten austauschen.
  • Activity Stream:
    Erzeugt einen Aktivitätenstream aller Vorgänge von Nutzern, ganz ähnlich wie auch Facebooks Aktivitätenstream.
  • Notifications:
    Mit Hilfe dieser Komponente werden die Nutzer über die Toolbar über wichtige Vorgänge in ihrem Netzwerk informiert.
  • User Groups:
    Nutzer können mit Hilfe dieses Tools selbst öffentliche oder private Gruppen gründen und Gruppen beitreten.
  • Site Tracking:
    Aktivitäten wie neue Beiträge oder Kommentare auf der Seite werden mit Hilfe dieser Komponente aufgezeichnet.
  • BuddyPress Core:
    Das ist die eigentliche Kern-Komponente, welche auf jeden Fall aktiv sein muss.
  • Community Members:
    Auch diese Komponente muss aktiv sein und ermöglicht es erst, dass Nutzer mit dem System interagieren können.

Du siehst auch den zweiten Tab “Seiten”. Hier legt man Seiten fest, die dann für bestimmte Bereiche der Community reserviert werden. So zum Beispiel eine Seite, auf welcher sich ein Mitgliederverzeichnis findet, eine Seite auf welcher sich der Aktivitätenstream befindet und so weiter. Die meisten Seiten wurden schon automatisch von BuddyPress angelegt. Doch zwei Seiten müssen wir selbst noch anlegen: Die Seite auf welcher man sich registrieren kann und die Seite, auf welcher eine Registrierung aktiviert wird. Sobald man dazu zwei Seiten angelegt hat, verknüpft man sie in diesem Tab entsprechend und klickt auf “Speichern”.

Im Tab “Optionen” finden sich noch weitere Optionen. Soll die WordPress Admin Toolbar beispielsweise für Deine Nutzer angezeigt werden? Können Nutzer Profilbilder hochladen und so weiter.

Sobald Du das Plugin aktiviert hast, wirst Du sehen, wie Deine Adminbar, sobald Du über Dein Profilbild hoverst sich schon ganz gewaltigt erweitert hat. Hier sieht man nun die verschiedensten weiteren Links, wie einen Link zum Aktivitätenstream, zu dem eigenen Profil und, den Gruppen und vielem mehr.

Die BuddyPress Toolbar
Die BuddyPress Toolbar erweitert die Admin Toolbar um zahlreiche Features.

Jeder soll sich registrieren können

Wichtig, damit Deine Community auch neue Mitglieder aufnehmen kann musst Du unter Einstellungen > Allgemein noch einen Haken in der Checkbox “Jeder kann sich registrieren” setzen. Erst jetzt kannst Du neue Benutzer in Deiner Community willkommen heißen. Danach können sich Benutzer auf der Registrierungsseite anmelden und dabei die Profilfelder ausfüllen. Im Anschluss erhalten Sie automatisch eine Email mit einem Bestätigungslink und sind nachdem sie diesen geöffnet haben Mitglieder der Community.

Für die Community registrieren
Für die Community registrieren

Wie sieht die Community aus?

Du erhälst ein Mitgliederverzeichnis, in dem alle Mitglieder Deiner Community aufgeführt sind. Jedes Mitglied hat seine eigene Profilseite auf welcher es Neuigkeiten posten kann. Diese Neuigkeiten können kommentiert werden, oder man kann sie auch einfach nur mögen.

Die Profilseite eines Nutzers in BuddyPress
Die Profilseite eines Nutzers in BuddyPress

Wenn man die Gruppen-Komponente aktivert hat kann man auch eine Übersicht aller aktiven Gruppen sehen und Mitglieder können auf “Gruppe erstellen” klicken und selbst eine eigene Gruppe erstellen. Neben dem Namen und einer Beschreibung können in den Einstellungen festgelegt werden, ob diese Gruppen privat oder öffentlich sein sollen, ob sich jedes Community-Mitglied anmelden kann und so weiter. Außerdem kann man ein Profil- und Hintergrundbild zu dieser Gruppe hinzufügen. Im letzten Schritt ist es schließlich möglich dass der Ersteller einer Gruppe seine Freunde einlädt, in der Gruppe teilzunehmen.

So sieht eine Gruppenseite in BP aus
So sieht eine Gruppenseite in BP aus

Emails

Das System schickt (je nach Einstellungen) einige Emails an seine Nutzer. Der Administrator kann diese Emails im Dashboard selbst konfigurieren. Zum einen finden sich in der Sektion “Email” sämtliche Email-Vorlagen, die man hier bearbeiten kann. So kann man den Text sämtlicher Emails selber anpassen. Nützlich sind dabei die zahlreichen Platzhalter wie {{recipient.name}}, welcher später durch den Namen des Email-Empfängers ersetzt wird.

Im Customizeer kann man dazu noch das HTML-Layout der Mail anpassen, und so beispielsweise den Header oder die Hintergrundfarbe anpassen.

Fazit

Schon mit der Aktivierung dieses Plugins hast Du also eine komplette Community aufgesetzt und bist jetzt startklar Betreiber einer eigenen Social Media Plattform zu sein. Das Plugin wird ständig aktualisiert und von einem hervorragenden Team von Entwicklern vorangetrieben. Da wordpress.org selbst auf BuddyPress läuft ist es so gut wie ausgeschlossen, dass dieses Plugin plötzlich einfach nicht mehr weiter gepflegt wird. Derzeit gibt es im Repository darüber hinaus etwa 720 weitere Plugins, welche die Funktionalität von BuddyPress erweitern und im Theme-Verzeichnis finden sich mehr als 30 Themes, welche auf die Darstellung von BuddyPress hin optimiert wurden. Doch man benötigt nicht zwingend ein angepasstes Theme. Prinzipiell läuft BuddyPress mit jedem WordPress Theme. Für die Screenshots dieses Beitrags habe ich beispielsweise einfach das Standard-Theme “Twenty Sixteen” genutzt.

So schaltest Du die WordPress REST API ab.

Die Entwicklung der WordPress REST API ist sicherlich eine der spannendsten Entwicklungen in der derzeitigen WordPress Entwicklung. Sie ermöglicht eine einfach zu erweiternde Schnittstelle für die Kommunikation mit anderen Programmen. Bisher ist im WordPress Core nur die sogenannte “Infrastruktur” vorhanden, auf welche unter anderem die oEmbeds aufsetzen (welche ich an anderer Stelle ausführlich behandelt habe).

Mit Hilfe der Infrastruktur ist es für Entwickler sehr leicht möglich, eigene sogenannte Endpoints zu registrieren. Über diese können dann andere Programme mit dem WordPress system interagieren und nach festgelegten Parametern Informationen ein- oder auslesen. Solche Endpoints sind unter anderem für Plugins interessant, welche Ajax-Anfragen an das System stellen möchten.

Derzeit wird an WordPress spezifischen Endpunkten gearbeitet, welche (irgendwann einmal) ebenfalls über die REST API im Core verfügbar sein sollen. Derzeit kann man sich diese Endpunkte als eigenes Plugin separat installieren.

Wenn man allerdings eine Webseite betreibt, welche die REST API nicht weiter nutzt und diesen Datenkanal lieber schließen möchte, so hilft dabei ein einfaches kleines Snippet, welches man sich in die functions.php des Child Themes packen kann.

Normalerweise erreicht man die REST API über die URL http://meine-seite.de/wp-json/. Dahinter verbirgt sich sozusagen der Ausgangspunkt in die API. Da die API allerdings auch im WordPress Backend mehr und mehr benötigt wird, sollte man die REST API so abstellen, dass eingeloggte Benutzer sie weiterhin verwenden können. Ansonsten würden Funktionen des Admins nicht mehr laufen:

Diesen Ausgangspunkt schreibt die WordPress REST API allerdings auch in den HTML-Quellcode, damit andere Programme diesen finden können. Mit Hilfe des folgenden Befehls kann man dies unterdrücken:

remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );

Da diese Information auch über den Header mit gesandt wird, empfiehlt es sich auch, diese Information nicht zu schicken:

remove_action( 'template_redirect', 'rest_output_link_header', 11 );

Der Vollständigkeit halber kann man diese Information dann auch aus der XMLRPC API (Ja, WordPress verfügt auch über eine XMLRPC-Schnittstelle!) entfernen:
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );

Mit diesen vier Zeilen kannst Du also die WordPress REST API schnell und einfach deaktivieren, falls Du diese auf Deiner Seite nicht möchtest.