10.7. Plugin-Updates empfangen

Eines der wohl mächtigsten Features ist die Update-Funktion. WordPress ruft von Zeit zu Zeit im Hintergrund die Hauseigene API ab um zu prüfen für welche Ihrer Themes und/oder Plugins ein Update im offiziellen WordPress.org Verzeichnis vorliegt. Und nicht nur das: mit einem Klick lädt es die entsprechenden Dateien herunter und installiert diese vollautomatisch.

All dies geschieht mit Hilfe der HTTP-API. Und genau oben genanntes Szenario ist nicht nur auf Plugins und Themes beschränkt die im wordpress.org Verzeichnis liegen. Oft wollen Sie Ihr Plugin wahrscheinlich gar nicht kostenlos weitergeben und in den Index von WordPress aufnehmen. Trotzdem wollen Sie Ihren Kunden aber eine einfach zu nutzende Update-Möglichkeit geben.

Dazu untersuchen wir den Update-Prozess von WordPress selbst. Zuständig für die Update-Prozedur ist die Funktion wp_update_plugins() in der Datei /wp-includes/update.php.

WordPress sendet eine wp_remote_post() Anfrage an http://api.wordpress.org/plugins/update-check/1.1/ mit folgenden Argumenten:

<?php
$options = array(
	'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3),
	'body' => array(
		'plugins'		=> json_encode( $to_send ),
		'translations'	=> json_encode( $translations ),
		'locale'		=> json_encode( $locales ),
		'all'			=> wp_json_encode( true ),
	),
	'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
);
?>

Wobei gilt:

  • $to_send ist eine Liste von Plugins, die Sie gerade installiert haben.
  • $translations ist eine Liste an Sprachdateien, die separat für Plugins installiert wurden (abgerufen durch die Funktion wp_get_installed_translations( 'plugins' )).
  • $locales ist die gerade gewählte Sprache (also z.B. de_DE).
  • Per all wird der API mitgeteilt ob alle im wordpress.org Verzeichnis liegenden Plugins zurückgegeben werden sollen. Auch wenn es keine Updates dafür gibt.

Als Antwort erhält man folgende Daten zurück:

Array
(
    [plugins] => Array
        (
            [pretty-link/pretty-link.php] => Array
                (
                    [id] => w.org/plugins/pretty-link
                    [slug] => pretty-link
                    [plugin] => pretty-link/pretty-link.php
                    [new_version] => 2.1.1
                    [url] => https://wordpress.org/plugins/pretty-link/
                    [package] => https://downloads.wordpress.org/plugin/pretty-link.2.1.1.zip
                    [tested] => 4.7.5
                    [compatibility] => Array
                        (
                        )

                )

        )

    [translations] => Array
        (
        )

    [no_update] => Array
        (
            [autoptimize/autoptimize.php] => Array
                (
                    [id] => w.org/plugins/autoptimize
                    [slug] => autoptimize
                    [plugin] => autoptimize/autoptimize.php
                    [new_version] => 2.2.2
                    [url] => https://wordpress.org/plugins/autoptimize/
                    [package] => https://downloads.wordpress.org/plugin/autoptimize.2.2.2.zip
                )
)

Daraus lässt sich erkennen, dass ein Update vorliegt. Und zwar für das Plugin pretty-link/pretty-link.php . Die aktuelle Version ist 2.1.1 und der Pfad zur Datei lautet https://downloads.wordpress.org/plugin/pretty-link.2.1.1.zip.

WordPress speichert die empfangenen Daten in der Datenbank und nutzt dabei die Transient API (Sie erfahren im nächsten Kapitel mehr darüber). Sie müssen hier aber nur wissen, dass kurz vor der Speicherung der Filter pre_set_site_transient_update_plugins aufgerufen wird. Ihn können Sie nutzen um eine eigene Abfrage an Ihre eigene Update-API zu senden.

Da Sie nun wissen, wie der eigentliche Update-Prozess läuft können Sie Ihren eigenen programmieren:

You’re not allowed to see this content. Please log in first.

Nun benötigen Sie allerdings noch ein separates Script welches die eigentliche Überprüfung der Version vornimmt. In unserem Beispiel haben wir die Anfrage an http://my-website.com/update.php gesendet. Die update.php könnte so aussehen:

You’re not allowed to see this content. Please log in first.

Nach einem Klick auf „Erneut überprüfen“ wird unsere Funktion mm_update_plugins() ausgeführt. WordPress wird das Update unter „Dashboard“ » „Updates“ zusammen mit anderen Plugins anzeigen:

Abb.: WordPress zeigt Updates an
Abb.: WordPress zeigt Updates an

Allerdings gibt es noch einen kleinen Schönheitsmakel: Durch einen Klick auf “Zeige Details von Version 1.2.0“ zeigt WordPress eine Fehlermeldung an. Und zwar: “Ein unerwarteter Fehler ist aufgetreten. Das könnte an WordPress.org oder der Konfiguration dieses Servers liegen. Solltest du weiterhin Probleme haben, wende dich an das Support Forum (en.).

Abb.: WordPress zeigt eine Fehlermeldung
Abb.: WordPress zeigt eine Fehlermeldung

Dies ist eine Standard-Fehlermeldung und hat eigentlich gar nichts mit WordPress.org an sich zu tun. Denn unser Plugin wurde ja nicht von WordPress.org heruntergeladen oder auf Updates überprüft.

WordPress erzeugt diese Fehlermeldung da noch einige Daten des zu aktualisierenden Plugins fehlen.

Diese Daten werden mit der Funktion plugins_api() abgerufen. Zum Beispiel in der Updates-Übersichtsseite3 oder (wie oben benötigt) in der Plugin Dialog-Box (aufgerufen durch die Funktion install_plugin_information()4).

Natürlich bietet WordPress aber auch hier einen passenden Filter an. Er nennt sich plugins_api und ist in der Datei /includes/plugin-install.php zu finden5.

Nun müssen wir das Plugin um den entsprechenden Filter erweitern:

You’re not allowed to see this content. Please log in first.

Wir ergänzen auch die update.php auf unserem Update-Server wie folgt:

You’re not allowed to see this content. Please log in first.

Beispiel der Angabe von compatibility:

You’re not allowed to see this content. Please log in first.

  1. https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-admin/update-core.php#L241 ↩︎
  2. https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-admin/includes/plugin-install.php#L310 ↩︎
  3. https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-admin/includes/plugin-install.php#L60 ↩︎