Mail Benachrichtigung bei neuem Update

  • Mit der Version 2.3 ist ja eine Funktion in WordPress integriert worden, welche anzeigt, ob für WordPress oder ein Plugin eine aktuellere Version vorliegt (sofern das Plugin im WordPress Verzeichnis ist). Damit man nicht immer in die Liste der Plugins schauen muss, gibt es das Global Plugin Update Notice, dass eine entsprechende Benachrichtigung auf jeder WordPress-Admin-Seite anzeigt. Allerdings muss auch dafür seine WordPress Installation aufrufen, um von einer Aktualisierung zu erfahren. Deshalb kam mir heute die Idee, ein Plugin zu schreiben, welches in regelmäßigen Abständen per WP-Cron prüft, ob eine neue Plugin-Version vorliegt und den Benutzer per E-Mail benachrichtigt. Das Plugin war schnell geschrieben, allerdings gab es bei der Ausführung ein recht großes Problem. Die Funktion, welche die Plugins auf neue Versionen prüft (wp_update_plugins), ist nur im Kontext des Admin-Bereiches verfügbar, und kann dementsprechend per WP-Cron nicht ausgeführt werden.

    Das Plugin ist soweit fertig, scheitert aber an dieser besagten Funktion. Vielleicht hat ja jemand diesbezüglich noch einen heißen Tipp, denn ich glaube, gerade wenn man mehrere Blogs betreibt, in denen man nicht regelmäßig schreibt, könnte diese Möglichkeit der Benachrichtigung von Vorteil sein.

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Den Cron rufe ich wie folgt auf

    PHP
    //check if checking of updates is due
    if (!wp_next_scheduled('scheduledCheckUpdates'))
                wp_schedule_event( time(), 'hourly', 'scheduledCheckUpdates' );
            
    add_action('scheduledCheckUpdates', array(&$this, 'checkPluginUpdates'));

    Das Problem ist, dass im Kontext des Cron, die Funktion wp_update_plugins() nicht zur Verfügung steht. Sie liegt in der Datei wp-admin/includes/update.php und ist anscheinend nur im Admin-Bereich verfügbar.

  • Was macht deine Funktion checkPluginUpdates, die du über

    PHP
    add_action('scheduledCheckUpdates', array(&$this, 'checkPluginUpdates'));


    aufrufst? Ruft diese einfach die Funktion wp_update_plugins() auf?

    wpseek.com - Die WordPress-Code-Suchmaschine

  • Hmm, dann würde ich die Funktion grundlegend nachbauen, und das ganze Filesystem-Gedöns weglassen, da du das ja nicht brauchst. Dann kannst du deine eigene Funktion per WP-Cron auch außerhalb des Admin-Scopes aufrufen, und die Mail(s) verschickekn...

    wpseek.com - Die WordPress-Code-Suchmaschine

  • Das sollte dann IMO egal sein. Sobald deine eigene "externe und freie" Funktion steht, hast du darüber Zugriff auf alle WP-Funktionen, die es gibt. Einziges Problem wird sein, ob du dich dann über Filter und Hooks in diese Funktionen einklinken kannst, um an die entsprechenden Daten zu kommen, die an diese Funktionen übergeben werden..

    wpseek.com - Die WordPress-Code-Suchmaschine

  • Hast Du schon mal versucht die Datei wp-admin/includes/update.php per include oder require in Dein Plugin zu integrieren?

    VG Elke

    Ja, hab ich. Das funktioniert auch, nur erscheint mir das nicht ganz sauber.

    Ich habe gerade die Update-Funktion aus der update.php 1:1 ins Plugin kopiert. Für den redundanten Code gibt es zwar 3 Jahre Programmier-Hölle, aber es funktioniert :-D

    Ich frage mich nur grade, ob es eine Zugriffsbeschränkung auf die WordPress API gibt. Nicht das man mit aktiviertem Plugin auf einer Blacklist landet, wenn man stündlich auf Aktualisierungen prüft.

  • Ich habe gerade die Update-Funktion aus der update.php 1:1 ins Plugin kopiert. Für den redundanten Code gibt es zwar 3 Jahre Programmier-Hölle, aber es funktioniert :-D


    Ach, die Jungs vom CakePHP-Projekt scheinen auch fleißig Teile von Ruby on Rails zu übernehmen, und leben auch noch auf der Erde. :mrgreen: ;)

    Und ich denke nicht, dass es derzeit Beschränkungen gibt. Aber da könntest du entweder mal nachfrragen, oder warten bis die API dokumentiert ist..

    edit. Ich würde höchstens den 'User-Agent', den dein Plugin dann an api.wordpress.org sendet, abändern, damit man sieht, dass der Zugriff von deinem Plugin kommt.

    Kann man das Plugin irgendwoher bekommen? :)

    wpseek.com - Die WordPress-Code-Suchmaschine

    Einmal editiert, zuletzt von Alphawolf (24. April 2008 um 15:53)

  • Kann man :-D Teste aber gerade noch ein bisschen. Habe es schon im Plugin Verzeichnis angemeldet und warte noch auf Freigabe.


    Ah, okay. Wenn du noch einen Tester suchst, meld dich (aber nur wenn ich das Rezensionsexemplar behalten darf. :)).

    wpseek.com - Die WordPress-Code-Suchmaschine

  • Irgendwie will der Cron nicht laufen. Beim ersten Start macht er einmal was, aber danach kommt nichts mehr. Hatte für Testzwecke einfach mal an den Anfang von checkPluginUpdates() einen E-Mail-Versand gesetzt und darberhinaus div. Plugins auf niedrigere Versionen runter gestellt.

    Zwei Anmerkungen:
    - Die Update-Plugins Funktion ist noch nicht anonymisiert
    - Die Empfänger E-Mail-Adresse wird über die Konstante RECIPIENT am Anfang gesetzt.
    Hier mal der komplette Code. Vielleicht hat jemand noch eine Idee :confused:

  • Wenn ich Dein Script richtig verstehe, dann prüfst Du, ob und wenn ja wann das letzte Mal ein update-Check vorgenommen wurde.
    Da es beim ersten Mal funktioniert hat:
    Kann es sein, dass Du diese Zeit nicht hast verstreichen lassen bzw. vergessen hast, das erstellte File zu löschen bzw. zu manipulieren?
    Vielleicht liegt es auch daran, dass eine Variable nicht richtig entleert wurde und deswegen beim 2. Mal Schwierigkeiten macht.
    Um das herauszufinden, ob es daran scheitert, übergebe allen Variablen einen leeren String. (Beispiel: $meinevariable='';)

    Auch wenn das Problem eigentlich gelöst ist:
    Warum empfindest Du es als unsauber, wenn Du die Datei per require_once einbindest?
    Es hätte nicht nur den Vorteil, dass Du keinen redundanten Code hast, sondern auch künftige Änderungen, die in der Datei update.php von WP vorgenommen wurden, nicht selbst vornehmen musst (Faulheit siegt, gel? ;-))

    VG Elke

    Es gibt keine dummen Fragen, es gibt nur dumme Antworten...
    http://u-portal.de/

  • An Zeit habe ich fast 24 Stunden verstreichen lassen, von daher sollte zumindest einmal die checkUpdatePlugins vom Cron aufgerufen worden sein. :-D

    Ich hatte ja direkt an die erste Zeile der Funktion eine zusätzliche Mail-Benachrichtigung eingebaut. D.h., unabhängig von der ganzen Prüfroutine der Updates hätte ich bei stündlicher Cron Ausführung zumindest ein paar E-Mails bekommen müssen. Ich sage jetzt einfach mal, dass mein Blog so frequentiert ist, dass die Crons ungefähr stündlich aufgerufen werden :mrgreen:

    Das mit dem "unsauber" meinte ich in Bezug auf Admin-Code außerhalb des Admin-Scope. Vielleicht haben sich die WP-Entwickler was dabei gedacht, weiß ich nur nicht :)

  • squizeer, schau dir mal das Il Filosofo » WordPress Database Backup Plugin an... das nutzt auch die WP-Cron Klasse und sendet mir zuverlässig die Backups, auch wenn ich nicht im wp-admin bin. :)

    Btw, statt

    PHP
    define('RECIPIENT','MAIL AT DOMAIN PUNKT DE');


    wäre

    PHP
    define('RECIPIENT', bloginfo('admin_email') );


    besser, dann muss man das nicht manuell eintragen, sondern das Script nimmt die angegebene Emailadresse des Admins. :)

    wpseek.com - Die WordPress-Code-Suchmaschine

  • Die Fragen, die sich mir zunächst stellen sind:
    1. Wurde überhaupt ein Cron-Job erstellt, der stündlich durchgeführt wird?
    2. Gibt es die Funktion [COLOR=#000000][COLOR=#CC0000]scheduledCheckUpdates[/COLOR][/COLOR] überhaupt oder heißt sie vielleicht scheduleCheckUpdates (o.ä.).

    Vielleicht ist es nicht relevant, aber...
    die class heißt [COLOR=#000000][COLOR=#0000CC]MailOnUpdate[/COLOR][/COLOR]. Die Funktion darunter hat den selben Namen. Allerdings werden bei ihr keine Großbuchstaben verwendet. Ist das so gewollt?

    VG Elke

    P.S. Was heißt eigentlich Admin-Scope?

    Es gibt keine dummen Fragen, es gibt nur dumme Antworten...
    http://u-portal.de/


  • 1. Wurde überhaupt ein Cron-Job erstellt, der stündlich durchgeführt wird?

    Ja, hab ich in der Datenbank überprüft.


    2. Gibt es die Funktion [COLOR=#000000][COLOR=#cc0000]scheduledCheckUpdates[/COLOR][/COLOR] überhaupt oder heißt sie vielleicht scheduleCheckUpdates (o.ä.).

    Das könnte ich in der tat nochmal genauer überpfüen :mrgreen:


    Vielleicht ist es nicht relevant, aber...
    die class heißt [COLOR=#000000][COLOR=#0000cc]MailOnUpdate[/COLOR][/COLOR]. Die Funktion darunter hat den selben Namen. Allerdings werden bei ihr keine Großbuchstaben verwendet. Ist das so gewollt?

    Ja, in PHP 4 ist eine Methode mit dem gleichen Namen wie die Klasse der Konstruktoren. In PHP 5 verwendet man __construct().


    P.S. Was heißt eigentlich Admin-Scope?

    Alles, was im Admin-Bereich angesiedelt ist ... würde ich mal so sagen :-D

    Alphawolf
    Die Konstante ist erstmal nur zum testen drin. In der finalen Version hatte ich vor, alle Admins auflisten zu lassen und dann den Nutzer auswählen zu lassen an wenn die Benachrichtigung versendet wird.

  • Wahrscheinlich kennst Du die Seite schon auswendig, aber schau Dir mal das Beispiel genau an.
    Dort findest Du u.a. die Funktion
    register_activation_hook(__FILE__, 'my_activation');

    Außerdem würde ich es statt

    PHP
    add_action('scheduledCheckUpdates', array(&$this, 'checkPluginUpdates'));

    mal mit:

    PHP
    add_action('scheduledCheckUpdates', 'checkPluginUpdates');

    VG Elke

    Es gibt keine dummen Fragen, es gibt nur dumme Antworten...
    http://u-portal.de/

    Einmal editiert, zuletzt von redcat63 (26. April 2008 um 16:49)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!