Freies Let’s Encrypt Zertifikart bei All-Inkl einrichten

Es ist endlich soweit All-Inkl unterstützt jetzt auch die Einrichtung von kostenlosen Let‘ Encrypt Zertifikaten direkt aus dem KAS (Backend) heraus.

Die Verbindung zur Webseite läuft dann über SSL (https://) und alle Daten sowie Passwörter werden Verschlüsselt übertragen.
Außerdem wird hierdurch auch das Google Ranking positiv beeinflusst. Zudem gibt es seitens Google auch Pläne in Chrome unverschlüsselte Webseiten mit einer roten Kennzeichnung zu versehen, was Besucher abschrecken könnte.
Bei All-Inkl wird man für die Einrichtung mindestens das Private Plus Packt haben müssen, da dort die SSL Option inklusive ist oder bei den kleiner Packen SSL hinzubuchen müssen.
Die Let’s Encrypt Zertifikate sind aus Sicherheitsgründen nur 90 Tage gültig und werden 30 Tage vor Ablauf automatisch verlängert.
Die Einrichtung ist deutlich einfacher und komfortabler als ich in dem Artikel Freies Zertifikat mit StartSSL einrichten beschrieben habe.

Aber jetzt zur Einrichtung. Als beispiel habe ich die Webseite meines Schwagers genommen da ich meine schon umgestellt hatte.

1. Im KAS anmelden und Dort unter Domain oder Subdomain die Domain auswählen und bearbeiten klicken.

all-inkl_ssl_1

2. Bei SSL Schutz auf bearbeiten klicken.

all-inkl_ssl_2

3. Den Reiter Lets‘ Encrypt auswählen und die Check box für den Haftungsausschluss setzen und den unteren Butten anklicken.

all-inkl_ssl_3
Fertig.

Jetzt kann man die Webseite über https:// aufrufen.

Bei der Einrichtung hatte ich bei einigen Domains eine Fehlermeldung die besagte, das die Domain nicht erreicht werden konnte und man die Einstellungen überprüfen sollte. Die Einstellungen sind bei mir allerdings richtig gewesen. Meistens funktionierte es nach ein paar weiteren versuchen die man allerdings erst mit einer Verzögerung von ca 10 min. durchführen kann.

Den Haftungsausschluss muss man bestätigen weil Let‘ Encrypt immer noch im Beta status ist.

Einfacher PHP Objekt Cache – APCu einrichtung

Viele kennen vielleicht den APC Cache von PHP noch. Dieser wurde zum Cachen von PHP Skripten und als Objekt Cache genutzt. Heute übernimmt allerdings der Opcode Cache die Aufgabe des Cachens von PHP Skripten und würde sich daher mit APC in Gehege kommen. Daher wurde der Objekt Cache (Userland Cache) aus APC herausgelöst und als APCu herausgebracht.

Ich verwende APCu gerne als Objekt Cache da es sich so leicht einrichten lässt und kein extra Dienst notwendig ist.

Für die Einrichtung benötigt man die zu seiner PHP Version passende dll. Diese findet man hier. Aus dem ZIP Archiv benötigen wir nur die php_apcu.dll, diese Kopiere ich mir in dem „extras“ Ordner der sich im PHP Verzeichnis befindet.

Dan müssen wir die php.ini bearbeiten und die dll als Extension in der [PHP] Section hinzufügen:

extension=C:/php/extras/php_apcu.dll

Dann müssen wir noch eine Section wie folgt erstellen:

[apcu]
apc.enable_cli = on
apc.enabled = on
apc.writable = "C:/Temp/"

Dies reicht um APCu zu aktivieren. Der Webserver sollte einmal neu gestartet werden.

Damit man den Cache überhaut nutzen kann muss man ihn im CMS aktivieren. Das geht in WordPress indem man eine object-cache.php Datei im wp-content ablegt. In WordPress kann man direkt einen Geschwindigkeitsunterschied merken auch wenn noch nicht viel im Blog ist.

Um zu sehen was im Cache ist kann man sich die Datei auf dem Webserver ablegen und Aufrufen.

Den APCu Cache wird man bei Standard Shard Hosting nicht finden da der Cache immer für alle auf dem Server gilt und es somit ein Sicherheitsrisiko darstellt. Bei Mittwald kann man allerdings APCu in den Managet Server Paketen bekommen.

Xdebug unter Windows einrichten

Xdebug verwende ich jetzt schon seit einiger Zeit, um PHP unter Windows zu Debuggen mit PHPStorm. Da ich schon einigen Leuten geholfen haben Xdebug einzurichten und zur Dokumentation meiner Einstellungen, schreibe ich dieses kleine Tutorial.

Voraussetzung ist hierfür ein lokal installierter Webserver mit PHP. Die Xdebug Konfiguration sollte nicht nur mit PHPStorm funktionieren (Dafür muss der „idekey“ entsprechend angepasst werden).

Für die Einrichtung benötigen wir die php_xdebug.dll die man hier passend zu seiner PHP Version herunterladen kann. Meistens wird dies die TS (ThradSafe) Version sein (Kann man auch daran erkennen wenn man PHP als Apache Module läuft). Die dll habe ich bei mir in das PHP Unterverzeichnis „extras“ entpackt.

Jetzt muss noch die „php.ini“ bearbeitet werden und um folgenden block ergänzt werden:

[XDebug]
zend_extension = "C:/php/extras/php_xdebug.dll"
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_connect_back = 0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_enable = 0
xdebug.profiler_output_dir = "C:/Temp/profiler"
xdebug.idekey = PHPSTORM
xdebug.default_enable = 0
xdebug.scream = 1

Die Beschreibungen zu den Einstellungen findet man hier im Prinzip ist aber alles so eingestellt das Xdebug nur ausgeführt wird wenn es durch einen Cookie oder URL Parameter aktiviert wird. Ich benutze dazu in Chrome den Xdebug Helper. Dort wählt man in den Optionen auch nur Die IDEKey aus und kann dann noch einstellen bei welchen Domains das Tool in der Adressliste des Browsers angezeigt werden soll.

Wenn man PHP Scripte auf Kommandozeile Debuggen will muss man einen Eintrag in den Umgebungsvariablen von Windows hinzufügen. Dieser lautet:

Name: XDEBUG_CONFIG
Wert: remote_enable=1 remote_mode=req idekey=PHPSTORM

In PHPStorm muss man bevor man mit dem Debuggen beginnt nur noch den Knopf für „Start Listening for PHP Debug Connections“ drücken und seine Breakpoints setzen.

Happy Debugging

WordCamp Europe 2015 Sevilla – Spanien

 

IMG_0371

 

Mein Besuch auf dem WordCamp Europe 2015 in Sevilla – Spanien war fantastisch! Zusammen mit Detlef Heese und Annette Völckner  sind wir schon am Dienstag vor dem Start des WordCamps angereist, um auch ein paar Tage Sevilla genießen zu können.

Dienstag:

Über Frankfurt ging es nach Sevilla. Die erste Überraschung erlebten wir als wir ins Hotel eincheckten. Dort wollte uns die Managerin vom Barceló Sevilla Renacimiento Hotel sprechen. Sie hat uns persönlich in dem 5 Sterne Hotel willkommen geheißen. Nachdem wir die Zimmer bezogen hatten, haben wir uns erstmal bei Temperaturen von 31°C am Hotelpool getroffen, um uns von der Reise zu erholen.

Abends sind wird dann in die Stadt zum Tapas essen gegangen und haben den Abend mit ein paar Guinness ausklingen lassen.

 

Mittwoch:

Dieser Tag war der totalen Entspannung gewidmet. Außerdem sind noch einige Leute aus der deutschen Community eingeflogen.  Am frühen Abend wurden erst noch ein paar Runden mit Dominik Schilling durch den Pool gedreht bevor es dann weiter zum Tapas essen in der Innenstadt ging. Dabei sind dann noch diese wunderbaren Bilder von Detlef entstanden.

Donnerstag:

Auch an diesem Tag bin ich tagsüber die meiste Zeit am Pool gewesen. Während Detlef noch mit ein paar weiteren Leuten zum Expo Gelände aufgebrochen ist, um sich dieses anzusehen. Abends ging es natürlich wieder in die Stadt zum Tapas essen. An diesem Tag wurde es allerdings nicht so spät, da ja am nächsten Morgen das WordCamp startete.

Freitag:

Tag eins des WordCamp Europe: Erstmal registrieren. Danach ging der Ansturm auf die Sponsoren los, die ein paar Geschenke zu verteilen hatten. Da das Camp ja direkt in unserem Hotel stattfand, konnte ich die Give-aways dann direkt auf Zimmer bringen und musste sie nicht mit mir herumtragen. Danach ging es dann mit den Vorträgen los. Am schönsten fand ich den von Zeev Suraski über die Geschichte von PHP 7. Natürlich waren auch alle anderen Vorträge sehr gut. Abends ging es natürlich wieder …

Samstag:

Tag zwei des WordCamp Europe: Heute ging es mit Vorträgen weiter. Am besten haben mir der über die WordPress REST-API gefallen und einige short Talks. Die Vorträge hatte ich nicht geschafft mir auf dem WordCamp in Köln anzusehen. Aber auch alle anderen Vorträge an diesem Tag waren sehr gut. Abends ging es dann zur After Party in einer Disco in Sevilla. Dort wurde sehr ausgiebig gefeiert. Da dort allerdings auch einheimische Gäste zur selben Zeit Zutritt hatten, wurde es sehr voll. Deshalb ging ich mit einigen Leuten noch weiter ….

FullSizeRender

Sehr gefreut habe ich mich dann noch als Gino Cremer mir sein WordPress Praxishandbuch mit persönlicher Signierung überreichte als Dankeschön für die Entwicklung von BackWPup.

Sonntag:

Contributor Tag: Leider für uns der Tag der Abreise, da Detlef und ich am Montag wieder arbeiten mussten. Mittlerweile sind es in Sevilla tagsüber 42°. Viel trinken war die Devise auf dem WordCamp. Gott sei Dank waren die Konferenzräume klimatisiert.

Fazit:

Für mich war es ein wunderbares WordCamp Europe. Ich durfte so viele Leute aus der deutschsprachigen Community näher kennenlernen und alte Bekanntschaften auffrischen. Das war für mich das allerbeste an diesem WordCamp; nur dass ich dafür extra nach Sevilla fliegen musste.

Das nächste WordCamp Europe ist übrigens in Wien.

 

An dieser Stelle möchte ich mich nochmal bei meiner Frau bedanken, die leider zu Hause bleiben musste, um sich um unsere Kinder zu kümmern.

Freies StartSSL Zertifikat bei All-Inkl einrichten

Mittlerweile kann man bei All-Inkl auch Zertifikate direkt über das Kunden Interface einbinden. Dies gilt nur für Pakete ab PrivatPlus. Dort kann man auch selbst signierte Zertifikate erstellen, allerdings will ich keine Browser Meldung haben, die besagt, dass das Zertifikat nicht gültig ist. Daher nehme ich ein kostenfreies Zertifikat von StartSSL.com. Die Einrichtung beschreibe ich hier.

Als erstes muss man eine E-Mail Adresse mit webmaster@domain.tld  für die Domain einrichten für die man das Zertifikat beantragt. Diese benötigen wir zur Verifizierung der Domain und ich nutze sie auch für das persönliche Zertifikat, das erstellt wird.

Am besten öffnet man sich die Einstellungen von All-Inkl in einem eigenen Tab. Zu finden ist es in der Domain Verwaltung im KAS.

domain_setting

 

Danach geht es auf die Internetseite von StartSSL. Am besten auch in einem extra Tab öffnen. Dort oben auf den Button zum Anmelden klickenLoginStartssl

dann auf Sign-upsignup

danach muss man seine persönlichen Daten eingeben auf die das Zertifikat ausgestellt wird.
registerstartsslHier verwende ich die E-Mail-Adresse, die ich vorhin angelegt habe. Dann auf „Continue“ klicken und die nachfolgende Popup Meldung bestätigen.
Danach wird wahrscheinlich diese Meldung erscheinen.

We were not able to verify your email address! Please provide us with a real email address!

Please note: Sometimes mail servers are down for maintenance or are otherwise unreachable from our location. Some mail servers also implement Grey listing. If you are sure, that you are the owner of this email address, please try it again later.

If you feel that this is a mistake from our side, please contact the CertMaster and report this incident.

Jetzt einfach fünf Minuten warten und nochmal absenden (Telefonnummer muss nochmal eingetragen werden). Dieses Mal sollte dann dieser Dialog erscheinen:completewenn die Meldung von oben wieder erscheint, wart ihr zu schnell. Dann einfach nochmal durchführen.

Jetzt kann es nochmal bis zu 15 Minuten dauern bis man die E-Mail mit dem Bestätigungscode erhält, der dann in das Feld eingetragen wird und mit „Continue“ bestätigt wird.

Jetzt muss man erst das private Zertifikat für die E-Mail-Adresse erstellen und installieren.

private_key_generateinstall

Das installierte Zertifikat sollte man sich sichern! Damit man es wieder installieren kann und Zugriff auf seinen StartSLL Account bekommt, wenn der PC mal nicht mehr gehen sollte.

Danach muss man die Domain verifizieren. Dazu den Validation Wizard aufrufen.

domain_validation

„Domain Name Validation“ wählen

val_domain

Die Domain eingeben

val_email

Die webmaster@ E-Mail-Adresse auswählen

val_code

Und den „Validation Code“ aus der E-Mail eingeben.

finish

Jetzt geht es daran, das eigentliche Zertifikat für die Webseite zu erstellen und bei All-Inkl einzurichten. Dies kann man direkt per Copy&Paste machen

create_web_cert

domain_1

Den „Certificarts Wizard“ aufrufen und einen Key hinterlegen. Dieser wird zum entschlüsseln bei All-Inkl wieder benötigt. Also gut merken!

Jetzt kommt eine Box mit dem Private Key für das Domain Zertifikat. Die bitte bei All-Inkl in das KEY Feld kopieren und darunter in das „KEY passphrase“ Feld das Passwort von eben eintragen.

all_inkel_insert

Den Key am besten auch noch mal in eine Text Datei speichern.

domain_3

Die Domain auswählen, für die das Zertifikat erstellt wird.

domain_4

Die Subdomain, für die das Zertifikat erstellt wird, eingeben. In meinem Fall www., da die Domain mit und ohne www. erreicht werden soll.

domain_5

domain_6

Jetzt hat man das Zertifikat für die Webseite, welches in das „CRT“ Feld bei All-Inkl kopiert werden muss. Auch diese speichere ich mir in eine extra Text Datei. Zur Sicherheit.

Jetzt brauchen wir noch die „Brückenzertifikate“ für All-Inkl. Dies bekommen wir entweder in der Dialogbox von eben (Links unter dem Feld) oder aus der „Tool Box“. Einfach mit einem Editor öffnen und bei All-Inkl eintragen.
bruecken_cert

Danach können wir bei All-Inkl auf Änderungen speichern drücken und das Zertifikat sollte für die Domain nach einem kurzen Moment aktiv sein. Natürlich sollte man auch drauf achten, dass SSL auch aktiv ist bei All-Inkl (ganz oben auf der Seite).

WordPress Sicherheit erhöhen ohne Plugins

Ich bin der Meinung, dass man die Sicherheit von WordPress auch ohne Plugins erhöhen kann. Oder andersherum: Hackern und automatisierten Angriffen das Leben schwerer machen. Wie das geht, werde ich hier beschreiben.

Eins vorweg: Wenn man keine sicheren Passwörter verwendet, nützt einem auch die beste Absicherung nichts. Und das gilt nicht nur für deinen WordPress Zugang, sonder für alle Zugangsmöglichkeiten zu Webspace (FTP, SSH, MySQL, …). Außerdem bietet heute nahezu jeder Hoster die Möglichkeit Daten verschlüsselt zu übertragen. Insbesondere bei E-Mail oder FTP.

Die Installation:

Ich habe WordPress in einem unter Ordner installiert.  Ich bin der Meinung, wenn man diese Art der Installation wählt, hat ein automatisierter Angriff es zumindest etwas schwerer den WordPress Ordner zu finden. Außerdem finde ich es etwas aufgeräumter, da ich in dem Root Ordner noch weitere Dienste installiert habe, damit ich sie alle mit einem https Zertifikat nutzen kann. Dazu kommt noch, dass ich den „wp-content“ Ordner umbenannt habe.FTP-Ordner-wp-subfolder-install

Um den „wp-content“ Ordner umzuebnen, bedarf es zwei Einträge in der „wp-config.php“.

define( 'WP_CONTENT_DIR', realpath( dirname(__FILE__) . '/../content' ) );
define( 'WP_CONTENT_URL', 'https://dhue.de/content' );

Dies sollten heute alle Plugins unterstützen.

Zusätzliche Absicherungen:

.htaccess im Root (Haupt) Ordner.

<FilesMatch "(.htaccess|readme.html|liesmich.html|license.txt|license.md|readme.txt|readme.md|wp-config.php)"> Deny from all </FilesMatch> php_flag display_errors off

Der „FilesMatch“ Eintrag sorgt dafür, dass auf die Dateien in der Liste nicht direkt über eine URL zugegriffen werden kann. Hier sind auch die Readme Dateien enthalten, damit man darüber nicht erkennen kann, ob etwas vorhanden ist oder sogar die Version herausbekommt.

Die letzte Zeile sorgt dafür, dass PHP keine Fehlermeldungen ausgibt und man somit den Server Pfad nicht in Erfahrung bringen kann.

Im neuen „Content“ Ordner habe ich eine zusätzliche .htaccess liegen mit folgenden Einträgen.

<Files *.php>
 order allow,deny
 deny from all
</Files>
<Files debug.log>
 Order allow,deny
 Deny from all
</Files>

Das sorgt dafür, dass keine .php Dateien mehr direkt im „Content“ Ordner aufgerufen werden können. Allerdings muss hier getestet werden, ob auch alle Plugins und Themes damit funktionieren. Gute Plugins und Themes sollten aber kein Problem damit haben. Alle anderen Dateiformate können weiterhin direkt aufgerufen werden.

WordPress verschleiern:

Mit diesem Stück Code kann man noch einiges im HTML Kopf der Website verbergen oder dekatieren. Dieser kann in die funktions.php eures Child Themes geschrieben werden oder eben doch in ein Kleins Plugin. Hier bitte selber entscheiden, was ihr braucht oder nicht. Der wichtigste Punkt ist hier der „wp_generator“ da dieser auf jeder Seite im HTML  folgendes im Kopf hinzufügt <meta name="generator" content="WordPress 4.1" />.

// Head cleanup
function dh2015_head_cleanup() {
   // category feeds
   //remove_action( 'wp_head', 'feed_links_extra', 3 );
   // post and comment feeds
   //remove_action( 'wp_head', 'feed_links', 2 );
   // EditURI link
   remove_action( 'wp_head', 'rsd_link' );
   // windows live writer
   remove_action( 'wp_head', 'wlwmanifest_link' );
   // index link
   remove_action( 'wp_head', 'index_rel_link' );
   // previous link
   remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
   // start link
   remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
   // links for adjacent posts
   remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
   // WP version
   remove_action( 'wp_head', 'wp_generator' );
}
add_action( 'init', 'dh2015_head_cleanup' );

Anmerkung:

Darüber hinaus sollten natürlich auch das nicht benutzen des Standard DB Präfixes und das Rechte setzen der Ordner Berechtigungen nicht fehlen. Es gibt einen Artikel auf WordPress.org über das abhärten von WordPress der auch durchgegangen werden sollte.

Git für Windows installieren und SSH Keys nutzen

Ich benutze für die Installation die Aktuelle Preview Version von msysgit (Git-1.8.3-preview20130601.exe).

Da ich nur die Kommandozeilen Komponenten benötige, habe ich die „Windows Explorer integration“ abgewählt.

Setup1

Hier verwende ich extra „Run Git and included Unix tools form Windows Command Promt“, damit ich Git in der Kommandozeile laufen lassen kann ohne den Pfad der Git Datei angeben zu müssen. Außerdem ist das der einzige Punkt, bei dem dann die SSH Authentifizierung vernünftig funktioniert.
Setup2

Ich benutze das von Git mitgelieferte OpenSSH.Setup3

Wir verwenden immer die „Unix-style line endings“. Dies kann man aber auch projektweise mit Hilfe einer .gitattributes definieren.

Setup4Danach wird Git installiert und man kann es in der Windows cmd nutzen. Ich nutze es direkt in der IDE PHPStorm.

Um Git jetzt noch mit SSH Zertifikaten laufen zu lassen, müssen wir nur noch der Anleitung folgen, die ich hier nochmal kurz durchgehe.

Punkt 1: Überprüfen, ob schon SSH Keys exisitieren. Diese sollten unter C:\Users\<Benutzername>\.ssh zu finden sein und im Normalfall id_rsa und id_rsa.pub heißen.

Wenn schon welche existieren, kann Punkt 2 übersprungen werden.

Punkt 2: SSH Key erstellen, indem man in der Kommandozeile folgenden Befehl eingibt.

ssh-keygen -t rsa -C "your_email@example.com

Es sollte diese Meldung erscheinen:

Enter file in which to save the key (/c/Users/<Benutzername>/.ssh/id_rsa):

Diese mit Enter bestätigen. außer dort ist nicht der oben angegebene Pfad angegeben, dann diesen ändern in „C:\Users\<Benutzername>\.ssh\id_rsa“ und mit Enter bestätigen.

Dann wird noch nach einer „passphrase“ gefragt; hier bestätige ich einfach 2 mal.

Zum Schluss muss eine Meldung erscheinen, die lautet „The key fingerprint is: …“ dann sollte das Erstellen geklappt haben, wenn keine Fehlermeldung aufgetaucht ist.

Hier noch ein Screenshot mit der cmd:Setup5

Punkt 3: Jetzt muss man noch den erstellten Key bei Github oder anderem Git dienst eintragen.

Dazu öffnet man die eben erstellte „C:\Users\<Benutzername>\.ssh\id_rsa.bup“ mit dem Winows Editor und kopiert den Inhalt der Datei eins zu eins bei Github in das Key Feld, welches erscheint, wenn man auf Add Keys klickt. Den Namen kann man leer lassen, da dieser automatisch eingetragen wird.

Punkt 4: Testen, ob der Key akzeptiert wird, macht man indem man nochmal die cmd öffnet und folgenden Befehl eingibt: ssh -T git@github.com

Wenn die Meldung „The authenticity of host ‚github.com (207.97.227.239)‘ can’t be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)?“ erscheint einfach yes eingeben und bestätigen.

Setup6

Wenn alles geklappt hat, sollte eine Meldung wie im Screenshot erscheinen.

Damit kann mit Git mit SSH ohne Passworteingabe nutzen. Wichtig ist natürlich, dass man die Repros per SSH cloned und nicht per http.

Update 13.04.2015: Ich muss neuerdings die Umgebungsvariable set HOME=%HOMEDRIVE%%HOMEPATH% setzen damit ich mich über ssh authentifizieren kann. Die habe ich in den Windows Umgebungsvariablen bei meinem Benutzer gesetzt.

WordPress Links Menü Walker

Hier eine kleine Walker Klasse für WordPress, um sich ein Menü in der Form “ Link1 | Link2 | Link3 “ zu erstellen.

Einfach die Klasse in die functions.php des Themes und den Menü Eintrag dort im Template platzieren, wo er hin soll.

<?php
wp_nav_menu(
   array(
      'container'      => FALSE,
      'menu'           => 'The Footer Links',
      'menu_class'     => 'nav',
      'theme_location' => 'footer-nav',
      'items_wrap'     => '<nav id="%1$s" class="%2$s" role="navigation">%3$s</nav>',
      'depth'          => 1,
      'walker'         => new Links_Walker_Nav_Menu()
   )
);

class Links_Walker_Nav_Menu extends Walker_Nav_Menu {

   function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

      //Add attributes to link element.
      $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) . '"' : '';
      $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) . '"' : '';
      $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) . '"' : '';
      $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) . '"' : '';
      $attributes .= ( $item->current ) ? ' class="active"' : '';

      $output .= ( $item->menu_order > 1 ) ? ' | ' : '';
      $output .= '<a' . $attributes . '>';
      $output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
      $output .= '</a>';

   }

   function end_el( &$output, $item, $depth = 0, $args = array() ) {

      $output .= '';
   }

}

Standard WordPress Plugin Funktionen

Zwei der Funktionen/Methoden, die man in Zukunft wohl in allen meinen Plugins finden wird, sind:
Voraussetzung ist PHP 5.1.2 für die Autoload Funktion.

1. Zum Ermitteln von Plugin Daten, damit nicht immer alles per Constante definiert wird, um Namensraum freizuhalten:

<?php
public static function get_plugin_data( $get_data = FALSE ) {

	$plugin_data = wp_cache_get( 'plugin_data', 'pluginname' );
	if ( $plugin_data === FALSE || empty( $plugin_data[ 'Version' ] ) ) {
		$plugin_data               = get_file_data(
			__FILE__, array(
				'Name'        => 'Plugin Name',
				'PluginURI'   => 'Plugin URI',
				'Version'     => 'Version',
				'Description' => 'Description',
				'Author'      => 'Author',
				'AuthorURI'   => 'Author URI',
				'TextDomain'  => 'Text Domain',
				'DomainPath'  => 'Domain Path'
			), 'plugin'
		);
		$plugin_data[ 'BaseName' ] = plugin_basename( __FILE__ );
		$plugin_data[ 'Folder' ]   = dirname( plugin_basename( __FILE__ ) );
		$plugin_data[ 'URL' ]      = plugins_url( '', __FILE__ );
		if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
			$plugin_data[ 'JSVersion' ] = time();
		} else {
			$plugin_data[ 'JSVersion' ] = $plugin_data[ 'Version' ];
		}
		wp_cache_add( 'plugin_data', $plugin_data, 'pluginname' );
	}

	if ( ! $get_data ) {
		return $plugin_data;
	}

	return $plugin_data[ $get_data ];
}

2. Die Autoload Funktion von PHP zum automatischen Laden von Klassen, damit sie nur dann geladen werden, wenn sie auch benötigt werden. Das heißt, verwendet man ein „add_action“ wird die Klasse erst geladen, wenn wirklich ein „do_action“ erfolgt oder die Seitenklasse für einen Menüeintrag erst geladen wird, wenn der Menüpunkt tatsächlich aufgerufen wird. Voraussetzung ist, dass man das ganze Plugin klassenbasierend aufbaut. Das kann dann nicht nur Ressourcen sparen.

<?php
public function __construct() {
	//register autoloader
	spl_autoload_register( array( $this, 'autoloader' ) );
}

public static function autoloader( $class_name ) {
	//WordPress classes loader
	$wpclass='/class-'.strtolower(str_replace('_','-',$class_name)).'.php';
	if ( is_file(ABSPATH .'wp-admin'.DIRECTORY_SEPARATOR.'includes'.$wpclass) ) {
		require(ABSPATH .'wp-admin'.DIRECTORY_SEPARATOR.'includes'.$wpclass);
		return true;
	}
	if ( is_file(ABSPATH . WPINC . $wpclass) ) {
		require(ABSPATH . WPINC . $wpclass);
		return true;
	}

	//Plugin classes to load
	if ( strpos( $class_name,'PluginClass_') !== false ) {
		$class_load = dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'inc'.DIRECTORY_SEPARATOR.'class-' . strtolower( str_replace( array( 'PluginClass_', '_' ), array( '', '-' ), $class_name ) ) . '.php';
		if ( is_file( $class_load ) ) {
			require($class_load);
			return true;
		}

	}
	return false;
}

Diese sollten sich innerhalb der Haupt Plugin Datei in einer Klasse befinden.

PHP Verzeichnis Übergabe prüfen

Ich muss in meinem Plugin für WordPress den ABSPATH übergeben, um eine eigene Ajax Behandlung zu haben.
Was meint ihr ist der Codeschnipsel dafür geeignet, um es möglicht sicher gegen Angriffe zu machen?

<?php
if ( is_file( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/wp-load.php' ) ) {
	require_once( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/wp-load.php' );
} else {
	$abspath = filter_input( INPUT_POST, 'ABSPATH', FILTER_SANITIZE_URL );
	$abspath = rtrim( realpath( $abspath ), '/' );
	if ( ! empty( $abspath ) && is_dir( $abspath . '/' ) && is_file( realpath( $abspath . '/wp-load.php' ) ) ) {
		require_once( $abspath . '/wp-load.php' );
	} else {
		die();
	}
}

Erläuterung:
Wenn der Plugins Ordner im Standard Verzeichnis ist oder zumindest in der selben Verzeichnis Tiefe muss die Übergabe nicht genutzt werden.
Sonst.
Das übergebene Verzeichnis vorfiltern (nur in URLs erlaubte Zeichen werden zugelassen)
mit ‚realpath()‘ alle ‚../‘,‘./‘ entfernen und prüfen, ob das Verzeichnis existiert.
Da ‚realpath()‘ auch das aktuelle Verzeichnis ausgibt nochmal Verzeichnis und Datei auf Existenz prüfen.
WP-load.php laden.