Plugins

Plugin-Programmierung - manchmal nötig. Vorher immer suchen, ob es die Funktion nicht schon als Plugin gibt:

Entwicklung mit Docker

Statt die Produktivumgebung zu zerstören, kann man prima ein Plugin mit Docker entwickeln, testen und dann ausliefern.

Ich bin (noch ) nicht der Docker-Anwender, daher kurz die Schritte, die ich gelernt habe:

  1. Docker installieren
  2. Docker-Compose installieren
  3. Docker-Compose-Konfigurationsdatei erstellen
  4. Docker starten
  5. Docker stoppen

Die Schritte 4 und 5 dann immer, wenn entwickelt werden soll.

Docker installieren

Docker-CE nehmen, Installationsanleitung:

Bei mir das deb:

deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable

Dazu den GPG-Key installieren und den Fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 verifizieren:

$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid   Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

Docker-Compose installieren

Binary runterladen, ablegen und ausführbar machen:

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

Die Code-Completion aus Faulheit gleich noch dazu:

$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.17.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

Testen

$ docker-compose --version
docker-compose version 1.17.1, build 6d101fb

Docker-Compose-Konfigurationsdatei erstellen

Einstellungen für die Seite. Eigentlich fast direkt aus Doku kopiert:

Dateiname: docker-compose.yml

Hier sind die Entwicklungsdateien korrekt einzubinden. Dafür wird bei volumes ein Mapping angelegt vom Dateisystem in das Docker-Dateisystem.

Im Beispiel liegen die Entwicklungsdateien des Plugins postpone-posts im Verzeichnis ../postpone-posts/ relativ zur Konfigurationsdatei. Dieses Verzeichnis wird von Docker für Wordpress in das Verzeichnis /var/www/html/wp-content/plugins/postpone-posts gemappt.

Zusätzlich binde ich noch phpmyadmin ein, um die Änderungen an der Datanbank nachverfolgen zu können.

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    volumes:
      - "../postpone-posts/:/var/www/html/wp-content/plugins/postpone-posts"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_USER: wordpress
      PMA_PASSWORD: wordpress
    restart: always
    ports:
      - 8080:80
    volumes:
      - /sessions

volumes:
  db_data:

Docker starten

Der Start erfolgt über Docker-Compose, beim ersten Start werden alle benötigten Dateien heruntergeladen.

$ sudo docker-compose up -d

Die Wordpress-Installation ist danach verfügbar unter

phpmyadmin ist erreichbar unter

Docker stoppen

Auch das Stoppen erledigt Docker-Compose.

$ sudo docker-compose down

Wordpress-Debugging

Für den Test eines Plugins muss man die debug-Variable WP_DEBUG auf true setzen. Dies geschieht über die Datei wp_config.php, die im Root-Verzeichnis der Wordpress-Installation liegt.

Diese Datei muss man aus dem Container extrahieren und dann einbinden oder in den Container zurückkopieren, wie man möchte.

Dazu findet man zuerst die ID oder den Namen des Containers heraus:

$ sudo docker container ls
CONTAINER ID   IMAGE                   ...  NAMES
032d18e6d816   wordpress:latest             dev_wordpress_1
56aabe83c2f2   mysql:5.7                    dev_db_1
49d804195636   phpmyadmin/phpmyadmin        phpmyadmin

Wordpress ist also unter der ID 032d18e6d816 oder dem Namen dev_wordpress_1 ansprechbar. Wir kopieren die Datei in das lokale Verzeichnis:

$ sudo docker cp dev_wordpress_1:/var/www/html/wp-config.php .

Jetzt können wir die Datei editieren und dann zurückspielen.

Ich bevorzuge das Zurückkopieren in den Container nach jeder Änderung, damit Änderungen durch das System erfasst werden (die theoretisch nicht auftreten sollten, aber…)

$ sudo docker cp wp-config.php dev_wordpress_1:/var/www/html/

Dabei muss man “nur” daran denken, vor jeder Änderung wieder eine Kopie aus dem Container zu holen und diese zu modifizieren.

Will man testen, ob der debug-Modus eingeschaltet ist, hilft folgender Code:

if (defined('WP_DEBUG') && true === WP_DEBUG) {
  echo '<p>Debug mode</p>';
}

Plugin: postpone-posts

Das Plugin verschiebt zukünftige (geplante) Posts um eine einstellbare Zeitspanne (in Tagen).

Anwendungsfall ist die Situation, dass man eine Menge an Post schon vorgeschrieben und geplant hat und ein Ereignis dazwischenkommt, zu dem man unbedongt noch etwas schreiben möchte. Dafür sollen alle geplanten Posts einfach nach hinten verschoben werden. Ohne Plugin klickt man jedes Post an und setzt das neue Datum.

Es gibt noch keine Plugin-Seite bei Wordpress. Die Entwicklung erfolgt auf github:

Plugin: bookmarkfile

Das Plugin wandelt eine Bookmark-Datei in HTML um, das angezeigt werden kann, um so schnell Linklisten zu veröffentlichen. Das Plugin ist ein WordPress-Pendant zum Dokuwiki-Plugin gleichen Namens, es gelten die dort angesprochenen Einschränkungen.

Plugin-Seite bei WordPress
WordPress bookmarkfile Plugin

Syntax

[bookmarkfile filename="xyz" /]

Die Datei kann jede beliebige Datei sein, die mit fopen geöffnet werden kann.