Den Nutzer informieren

Plugins unterliegen einem mehr oder weniger regelmäßigen und zügigen Updatezyklus und das ist auch gut so, denn nur ein Plugin welches immer weiter entwickelt wird, wird auch von den Nutzern gerne angenommen. Wie diese Entwicklungen aussehen, spielt hier erst mal keine Rolle, sondern es geht schlichtweg darum, aufzuzeigen, wie der Nutzer die Neuerungen im Plugin gleich auf den ersten Blick sieht und nicht erst lange nach einem Changelog suchen muss. Dies ist meiner Meinung nach ein recht wichtiger Bestandteil eines Plugins.

The Magic

Eigentlich ist es keine Magie, sondern etwas simples PHP. Eine Funktion innerhalb des Plugins, welche mittels add_action an WordPress kommuniziert wird. Zunächst muss man erst einmal wissen, wo im WordPress SVN die readme.txt des Plugins liegt, denn genau diese wird dabei ausgelesen.

Beispiel (an Hand meines 2-Click Socialmedia Buttons Plugins):

1
$url_readme = 'http://plugins.trac.wordpress.org/browser/2-click-socialmedia-buttons/trunk/readme.txt?format=txt';

Hier ist schon zu erkennen, wie diese URL grundsätzlich aufgebaut ist. Ersetzen müsst ihr nur noch den teil, welcher den Namen des jeweiligen Plugins beinhaltet. Aber nun, ohne hier lange und große Reden schwingen zu wollen, die PHP-Funktion, welche das Changelog in das WordPress Backend zaubert.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* Changelog bei Pluginupdate ausgeben.
*/

if(!function_exists('plugin_update_notice')) {
    function plugin_update_notice() {
        $array_PluginData = get_plugin_data(__FILE__);
        $var_sUserAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0';
        $url_readme = 'http://plugins.trac.wordpress.org/browser/2-click-socialmedia-buttons/trunk/readme.txt?format=txt';
        $data = '';

        /**
        * Check if we have to use file_get_contents or cURL
        */

        if(ini_get('allow_url_fopen')) {
            $data = file_get_contents($url_readme);
        } else {
            if(function_exists('curl_init')) {
                $cUrl_Channel = curl_init();
                curl_setopt($cUrl_Channel, CURLOPT_URL, $url_readme);
                curl_setopt($cUrl_Channel, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($cUrl_Channel, CURLOPT_USERAGENT, $var_sUserAgent);

                $data = curl_exec($cUrl_Channel);

                curl_close($cUrl_Channel);
            } // END if(function_exists('curl_init'))
        } // END if(ini_get('allow_url_fopen'))

        if($data) {
            $matches = null;
            $regexp = '~==\s*Changelog\s*==\s*=\s*[0-9.]+\s*=(.*)(=\s*' . preg_quote($array_PluginData['Version']) . '\s*=|$)~Uis';

            if(preg_match($regexp, $data, $matches)) {
                $changelog = (array) preg_split('~[\r\n]+~', trim($matches[1]));

                echo '</div><div class="update-message" style="font-weight: normal;"><strong>What\'s new:</strong>';
                $ul = false;
                $version = 99;

                foreach($changelog as $index => $line) {
                    if(version_compare($version, $array_PluginData['Version'], ">")) {
                        if(preg_match('~^\s*\*\s*~', $line)) {
                            if(!$ul) {
                                echo '<ul style="list-style: disc; margin-left: 20px;">';
                                $ul = true;
                            } // END if(!$ul)

                            $line = preg_replace('~^\s*\*\s*~', '', $line);
                            echo '<li>' . $line . '</li>';
                        } else {
                            if($ul) {
                                echo '</ul>';
                                $ul = false;
                            } // END if($ul)

                            $version = trim($line, " =");
                            echo '<p style="margin: 5px 0;">' . htmlspecialchars($line) . '</p>';
                        } // END if(preg_match('~^\s*\*\s*~', $line))
                    } // END if(version_compare($version, $array_PluginData['Version'],">"))
                } // END foreach($changelog as $index => $line)

                if($ul) {
                    echo '</ul><div style="clear: left;"></div>';
                } // END if($ul)

                echo '</div>';
            } // END if(preg_match($regexp, $data, $matches))
        } else {
            /**
            * Returning if we can't use file_get_contents or cURL
            */

            return;
        } // END if($data)
    } // END function plugin_update_notice()
} // END if(!function_exists('plugin_update_notice'))

Eingebunden wird das nun alles – ich erwähnte es weiter oben schon – via add_action.

1
2
3
4
5
6
if(is_admin()) {
    // Updatemeldung
    if(ini_get('allow_url_fopen') || function_exists('curl_init')) {
        add_action('in_plugin_update_message-' . plugin_basename(__FILE__), 'plugin_update_notice');
    }
}

Randnotiz

Da diese Funktion auf Techniken wie file_get_content oder cURL setzt, um eine externe Datei zu lesen, kann es durchaus sein, dass dies nicht auf allen Systemen funktioniert. Aber diese Fälle werden innerhalb der Funktion abgefangen.

Ich hoffe die Herren Mühlwitz und Feller können nun etwas ruhiger schlafen :-)

Artikel / Seite weiterempfehlen

5 Meinungen zu “Changelog bei Pluginupdates ausgeben

  1. Den meisten Nutzern wird dies zu viel Info sein; eher was für Kenner. Aus der Erfahrung her habe ich damit in der Masse schlechte Erfahrungen, da man damit aus dem Blog telefonieren muss und es die wenigsten Anwender interessiert. Wer es braucht sollt sich das Changelogger Plugin von Oliver ansehen, dass macht genau dies zu jedem Plugin.

    • […] da man damit aus dem Blog telefonieren muss […]

      Was WordPress ja so oder so macht um auf Updates zu prüfen, also kein wirklicher Unterschied, wenn man da dann noch gleich die readme.txt “abholt” um das Changelog auszugeben.

      Ja, Du magst Recht haben, viele Interessiert es nicht, was geändert wurde, aber für mich ist es nicht ganz uninteressant. Ich persönlich bin jemand, der wissen möchte, was sich bei einer neuen Version ändert und ich finde es da halt eher lästig erst nach dem Changelog suchen zu müssen. Auch habe ich schon von anderen Seiten dafür eher positive Resonanz bekommen. Aber so hat wohl jeder seine eigenen Erfahrungen damit gemacht. Ich persönlich würde es begrüßen, wenn dies in anderen Plugins ebenfalls so gehandhabt würde. Das von Dir empfohlene Plugin ist natürlich eine sehr geniale Sache, aber es ist wieder ein Plugin mehr, was nichts anderes macht, als eine simple Funktion, die es in den schon vorhandenen Plugins geben könnte.

Hinterlasse eine Antwort

Ihre Email-Adresse wird nicht veröffentlicht. Pflichtfelder sind durch * markiert.

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>