Inhaltsverzeichnis
Aus anderen Websites kopierte Inhalte zu veröffentlichen, ist mit WordPress denkbar einfach. Ändern sich die betreffenden Inhalte aber regelmäßig, sind ein Shortcode und das dynamische Laden eine erheblich weniger aufwendige Methode. Lesen Sie in der heutigen Ausgabe von Werbe-Markt.de ❤ WordPress, wie Sie mit wenigen Codezeilen via cURL bezogenen Content in Ihre WordPress-Seite einfügen.
Szenario: Tippspiel-Rankings in WordPress
Im konkreten Fall geht es darum, Rankings aus dem Tippspiel-Script von Werbe-Markt.de innerhalb von WordPress-Beiträgen und -Seiten verfügbar zu machen. Bei den Ranglisten handelt es sich um etwa wöchentlich vom Script automatisch aktualisierte Tabellen. Während der Fußball-Weltmeisterschaft ist das Aktualisierungsintervall noch erheblich kürzer.
Der vorliegende Fall ist also ein Paradebeispiel für unzumutbaren Aufwand bei der händischen Übertragung geänderter Inhalte. Stattdessen muss eine automatisierte Lösung her, die den aktuellen Webseiten-Inhalt lädt und ausgibt.
Warum kein iframe?
Das seamless-Attribut für iframes ermöglichte genau das, was die cURL-Lösung überflüssig gemacht hätte. Die Browserhersteller taten jedoch gut daran, Sicherheitsaspekten den Vorrang einzuräumen.
Webseiten verfügen üblicherweise über Logos, Menüleisten und einen Fußbereich. All das haben Sie in Ihrer WordPress-Seite vermutlich schon und möchten nicht innerhalb des iframes selbiges des Quell-Dokuments ebenfalls anzeigen. Das Ausblenden oder Entfernen von DOM-Elementen aus dem Eltern-Dokument können Sie dank Cross Origin Policy praktisch vergessen, sofern der iframe von einer anderen Domain als die aufrufende Seite geladen wird.
PHP-Code für Shortcode und cURL
Der im Rahmen eines Plugins oder in die functions.php
Ihres Themes einzufügende PHP-Code ist ganz einfach dieser:
add_shortcode('get_curl_content', function ($args) { $ret = ''; if (!empty($args['url']) && filter_var($args['url'], FILTER_VALIDATE_URL)) { $ch = curl_init($args['url']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $html = curl_exec($ch); curl_close($ch); $ret = preg_replace('/.*<select[^>]+name="rankingauswahl"[^>]+>.*(<table.*<\/table>).*<select[^>]+name="seite"[^>]+>.*/s', '$1', $html); } return $ret; });
Spezifisch für das Auslesen des Tippspiel-Rankings ist dabei lediglich die an preg_replace()
übergebene Regular Expression. Das ist also die Zeile, in der für jeden anderen Anwendungsfall als den beispielhaften Änderungen erforderlich sind.
Da bekanntermaßen nur Chuck Norris RegEx-Funktionen zur DOM-Manipulation oder Extraktion anwenden kann, unterstellen wir weiterhin, dass Sie Kontrolle über den Quellcode der einzulesenden Seite haben. Und wenn wir schon beim Thema sind: Das kleine Code-Schnipsel sollte natürlich nicht zum unerlaubten Scrapen anderer Websites verwendet werden.
Shortcode verwenden
Als WordPress-Nutzer wird Ihnen die Verwendung von Shortcodes in Seiten und Beiträgen geläufig sein. Zur Veranschaulichung binden wir nachfolgend das Abschluss-Ranking des DFB-Pokal-Tippspiels in der Saison 2011/12 aus der Demo-Seite des Tippspiel-Scripts ein. Der Shortcode dafür lautet wie folgt:
[get_curl_content url=“https://www.tippspiel-portal.de/dfb-pokal-2011-12-rankings.html“]
Zu guter Letzt noch der Hinweis auf WordPress und seinen grandiosen WYSIWYG-Editor: Der Shortcode erwartet als einzigen Parameter eine URL. Da WordPress diese gerne ohne Ihre explizite Absichtserklärung in HTML-Code für einen Hyperlink umwandelt, ist es ggf. erforderlich, die Quelltext-Bearbeitungsoption des Editors zu verwenden.
Ergänzung: Variante mit wp_remote_post
Man braucht es so selten – da habe ich doch wp_remote_post
ganz vergessen. Das Ergebnis sollte zwar im besten Fall dasselbe sein. Aber da wir uns in einer WordPress-Umgebung befinden, möchte ich Ihnen auch den WordPressigeren Stil nicht vorenthalten. Damit sieht der Code wie folgt aus. Shortcode bleibt der aus obigem Beispiel.
add_shortcode('get_curl_content', function ($args) { $ret = ''; if (!empty($args['url']) && filter_var($args['url'], FILTER_VALIDATE_URL)) { $remote = wp_remote_post($args['url']); if (is_array($remote) && isset($remote['body'])) { $ret = preg_replace('/.*<select[^>]+name="rankingauswahl"[^>]+>.*(<table.*<\/table>).*<select[^>]+name="seite"[^>]+>.*/s', '$1', $remote['body']); } } return $ret; });