Das Putzlowitsch Test- und SEO-Blog

Die WordPress-Gallery (Galerie) ohne Links, so gehts

Erklärungen überspringen – direkt zur Lösung :-)

Die WordPress-Bildergalerie

Seit WordPress Version 2.5 gibt es eine eingebaute Bilder-Galerie, die mit dem Shortcode [gallery] in einen Beitrag integriert werden kann.

Der ersten Version fehlten ein paar sinnvolle Optionen wie Include und Exclude und auch die Art des Links, mit dem ein Galerie-Bild unterlegt ist, konnte nicht beeinflußt werden. Das Bild verlinkte immer auf die Anhang-Seite.

Da ich aber lieber direkt auf die Bilddatei verlinke, habe ich das Plugin „123 Extended Gallery“ geschrieben, welches die WordPress-eigene Gallery-Funktion ersetzt und erweitert.

Mittlerweile kennt WordPress für die Galerie auch die Parameter exclude und include, um Bilder von der Anzeige auszuschließen oder beliebige Bilder hinzuzzfügen. Mit dem Parameter [gallery link=“file“] kann nun auch auf das Bild direkt verlinkt werden.

Was aber immer noch fehlt ist die Möglichkeit, überhaupt keine Links zu verwenden. Das scheint für den einen oder anderen aber durchaus eine erwünschte Option zu sein.

Mein Plugin hat gewissermaßen ausgedient, denn WordPress kann nun praktisch alles selber, was meine „Extended Gallery“ bisher umgesetzt hat, außer eben keine Links zu verwenden.

Deshalb stelle ich im Folgenden eine eigenständige Lösung dafür vor, die z.B. in die Datei functions.php des Themes intergriert werden kann.

In den Tiefen der WordPress Action- und Filter-Hooks

Erweiterungen und Änderungen für WordPress sollten immer über die definierte Plugin-Schnittstelle erfolgen, direktes Manipulieren der WP-Dateien ist unsauber, fehleranfällig und daher zu vermeiden.

In der Gallery

Die Implementierung der Shortcode-Funktion gallery_shortcode in der Datei media.php hat am Anfang einen Filter-Einstiegspunkt (Hook), mehr aber nicht:

// Allow plugins/themes to override the default gallery template.
$output = apply_filters('post_gallery', '', $attr);
if ( $output != '' )
  return $output;

An der Stelle kann man die gesamte Funktion ersetzen, indem man den selbst erzeugten Gallery-HTML-Code zurück gibt. Genau an der Stelle setzt auch mein altes Gallery-Plugin an, aber ich will ja jetzt nur die Links entfernen.

Die Bilder mit den Links werden weiter unten erzeugt:

foreach ( $attachments as $id => $attachment ) {
  $link = ... ? wp_get_attachment_link($id, $size, false, false) ...

Die Funktion wp_get_attachment_link bietet auch einen Filter-Hook, aber ein dort eingehängtes Filter soll ja nur innerhalb der Galerie-Erzeugung aktiv sein.

Nun kann man zwar mit einer Filterfunktion für ‚post_gallery‘ am Anfang eine passende Funktion bei wp_get_attachment_link einklinken, bekommt sie aber am Ende nicht mehr weg. Dann wirkt sie aber auf alle noch folgenden Attachment-Links auch außerhalb der Galerie, was natürlich nicht erwünscht ist.

Wenn man die Anzahl der Bilder kennen würde, könnte man diese in einer globalen Variable vermerken und im eigenen Attachment-Link-Filter runterzählen. Wenn der letzte Link bearbeitet ist, kann man die Filterfunktion wieder ausklinken.

Die anzuzeigenden Bilder werden in der WP-Gallery mit den WordPress-Funktionen get_posts bzw. get_children ermittelt. Diese Funktionen bieten leider keine Filter- oder Action-Hooks. Sie erzeugen ein neues WP_Query-Objekt und holen sich das Ergebnis mit der Objekt-Funktion query ab.

Im WP_Query-Objekt

In der Funktion query gibt es erfreulicherweise mehrere Action- und Filterhooks. Am besten geeignet erscheint der Filteraufruf für ‚the_posts‘ fast am Ende, da hier alle Daten vorliegen und damit die Anzahl der gefundenen Bilder bekannt ist. Leider wird dieser Hook nur bedingt aufgerufen:

if ( !$q['suppress_filters'] )
  $this->posts = apply_filters_ref_array('the_posts', array( $this->posts, &$this ) );

Man ahnt es schon, genau die Variable suppress_filters wird von get_posts und damit auch get_children gesetzt, um die Ausführugn der meisten Filter zu unterdrücken. Das ist auch wichtig und richtig, denn diese Filter sind oft nur in der WordPress-Loop sinnvoll einsetzbar und würden bei der Abfrage einer kompletten Liste der Bilder möglicherweise unerwünschte Ergebnisse liefern.

Und nun? Der Rettungsanker ist der Action-Hook ganz am Anfang der Funktion query:

do_action_ref_array('pre_get_posts', array(&$this));

Meine erste Idee war es nun, die Variable suppress_filters einfach zu löschen, so daß die Filter aufgerufen werden. Das führt aber wie schon gesagt möglicherweise zu unerwarteten Ergbnissen, weil die Filter für die WordPress-Loop gedacht sind. Keine Gute Idee!

Mein nächster Ansatz war nun, daß ich mir zunächst in der Action-Funktion für pre_get_posts das WP_Query-Objekt global speichere um später wieder darauf zugreifen zu können.

Wenn es eine Funktion nach der eigentlichen Abfrage der Datenbank gibt, die ihrerseits einen Filter- oder Action-Hook enthält, könnte ich diese „mißbrauchen“, um über das gespeicherte Objekt schließlich die Anzahl der Bilder zu ermitteln.

Seit WordPress 2.7 gibt es die Sticky-Posts, also Beiträge, die ganz oben auf der Artikelseite fest getackert werden können. Um diese Sticky-Posts vor allen anderen in die Liste einzufügen, wird in der Funktion query die Option ’sticky_posts‘ abgefragt:

$sticky_posts = get_option('sticky_posts');

Die Funktion get_option enthält netterweise ganz am Anfang den Filterhook für ‚pre_option_‘ . $option. Damit kann ich nun meine Abfrage der Anzahl über das zuvor gespeicherte WP_Query-Objekt „triggern“, die Anzahl der Bilder global speichern und letztendlich das eigentliche Filter für wp_get_attachment_link installieren.

Die Filter- und Action-Kette zusammengefaßt

Ist doch eigentlich alles ganz einfach, oder? :-)
Hier nochmal eine kurze, grafische Zusammenfassung aller Schritte:
Gallery-No-Link PAP
Erstellt mit yEd

Nachtrag 13.02.2012: Es geht auch viel einfacher, wie man hier sehen kann: Gallery with No Image Links-Plugin :-)

Die Zip-Datei gallery_no_link.zip runter laden und auf dem heimischen Rechner entpacken.

Download: 123 Gallery No Link

In der enthaltenen Datei plw123_gallery_no_link.php kann eine Option konfiguriert werden.

define( 'PLW123GOL_NO_LINK', false );

Mögliche Werte:
false: die Links werden durch den Link-Parameter ’none‘ im gallery-shorcode unterdrückt:

[gallery link="none"]

true: die Links werden immer in allen Galerien unterdrückt

Das Modul 123 Gallery No Link kann auf drei unterschiedlichen Arten in WordPress installiert werden.

1. in der functions.php des Themes

Dazu ist die Datei plw123_gallery_no_link.php in das WordPress-Theme-Verzeichnis des aktiven Themes zu kopieren und in der functions.php am Ende folgendes einzufügen:

@include( 'plw123_gallery_no_link.php'

2. als Plugin

Dazu ist die Datei plw123_gallery_no_link.php in das WordPress-Plugin-Verzeichnis (/wp-content/plugins/) zu kopieren und im Backend bei den Plugins zu aktivieren.

3. als MU-Plugin (ab WordPress 2.8)

Dazu ist die Datei plw123_gallery_no_link.php in das MU-Plugin-Verzeichnis (/wp-content/mu-plugins/) zu kopieren. Falls dieses Verzeichnis nicht existiert, muß es neu angelegt werden. Eine Aktivierung des Plugins ist nicht erforderlich, PHP-Dateien in diesem speziellen Verzeichnis werden immer geladen.

Keine Kommentare »

Top-Liste mit Lücken – Google-Doodle Diego Rivera

Google-Doodle: Diego Rivera (nz)

Heute gibt es wieder mal ein Google-Doodle. Dieses ist dem mexikanischen Maler Diego Rivera zu seinem 125. Geburtstag gewidmet.

Wie schon beim Mark-Twain-Doodle wollte ich ja die Top-100 für den jeweiligen Tage mitlaufen lassen. Ich hatte auch gestern abend noch alles eingerichtet, dann aber den Cronjob in einem Anfall geistiger Umnachtung nur bis heute 1:30 Uhr laufen lassen. Der hätte eigentlich bis morgen, also den 9. Dezember 1:30 Uhr aktiv bleiben müssen.

Bis ich das Malheur heute Vormittag bemerkt hatte, waren natürlich einige Daten nicht erfaßt worden und so zeigt das Diagramm eine Lücke zwischen zwei und sieben Uhr.

Diego Rivera Google Doodle - Ranking

Ein weiteres Problem sind die Daten selbst. Sie zeigen nicht immer das tatsächliche Ranking, zumindest nicht das, was ich normal im Browser sehe. Woran das liegt, kann ich noch nicht sagen. Es hat auch nichts mit der Anmeldung bei Google zu tun, denn die Vergleichswerte sehe ich mir im ausgeloggten Zustand an.

Damit mir keine Daten mehr abhanden kommen und ich zu dem nicht immer zu nachtschlafender Zeit meine Skripte konfigurieren muß, habe ich mal einen kleinen Automatismus implementiert. Mal sehen, wann das nächste Doodle kommmt… :-)

Weitere Artikel mit Bezug zu diesem:
2 Kommentare »

Mein Blog Statistik-Tool: Logfile-Auswertung

Mir reicht die Logdatei

Ich habe es ja schon öfter mal kund getan, für meine Blog-Statistik reichen mir die Server-Logdateien. Diese werden ohnehin vom Server erzeugt und mir bereit gestellt. Alle wesentlichen Informationen finde ich (noch) dort. Wie oft wurden welche Seiten aufgerufen, wer kam mit welchen Suchbegeriffen von einer der Suchmaschinen auf mein Blog.

Fall Google mit der https-Geschichte flächendeckend ernst macht, fällt natürlich die Google-Suchwort-Auswertung weg, aber auch andere Webstatistik-Tools haben das gleiche Problem.

Logfile-Auswertung mit PHP-Skript

Logfile-Auswertung: Google-Besucher

Die Logfile-Auswertung habe ich mit PHP selbst programmiert. Angezeigt wird eine einfache Tabelle, wie oben abgebildet.

Ganz links steht der Suchbegriff, in der nächsten Spalte folgt die Anzahl der Besucher, die zu dem Suchbegriff von Google auf eine meiner Seiten gelangten. Danach folgt das Datum des letzten Zugriffs.

Sofern aus dem Referrer ermittelbar, gebe ich daneben die Position in den Suchergebnisseiten aus. Zahlen, die mit .. beginnen, sind nur die Ergebnis-Seite oder bei ..1 war die Position nicht zu ermitteln.

Am Ende folgt dann noch der Suchtyp. Das Fragezeichen ? steht für die Textsuche, der Kasten für die Bildersuche und ein U für Universal-Search.

Wie man sieht, ist OnkelSeosErbe in der normalen Textsuche am gefragtesten, bei der Bildersuche und Universal Search (Images) liegt das Brötchen ganz vorn.

Sachen wie Absprungrate, Verweildauer und Ähnliches interessieren mich nicht. Was soll ich auch mit diesen Werten anfangen?

Webmasterfriday

Webmasterfriday - WMF

Die Blogstatistik ist aktuelles Thema beim Webmasterfriday, was übrigens zum Ende eines Monats ganz passend ist, wie ich finde. Es bietet sich damit auch direkt an, mal wieder eine Monatsstatistik zu veröffentlichen.

2 Kommentare »

Mit der Google-Bildersuche Hotlinks finden

Was ist ein Hotlink?

Wer weiß, was Hotlinks sind, was sie bewirken und was man gegen Hotlinks tun kann, der kann gleich zur Google-Bilder-Hotlinksuche springen.:-)

Hotlink Infografik

Seite A hat einen Artikel zum Thema Blumen erstellt. Dazu wurde auch ein schönes Blumenbild hochgeladen und in den Artikel eingebunden.

Seite B findet das Blumenbild auch ganz toll und bindet es in einem eigenen Artikel direkt von Seite A ein. Jedesmal, wenn Seite B aufgerufen wird, wird dort das Bild von Seite A abgerufen und angezeigt. Das ist ein echter Hotlink.

Seite C schreibt einen Artikel über Blumenvasen und setzt auf das Bild von Seite A einen normalen Link. Das Bild von Seite A wird nur dann abgerufen und angezeigt, wenn ein Leser auf den Link klickt. Das ist ein Link aber eigentlich kein Hotlink.

Was bewirkt ein Hotlink?

Der echte Hotlink durch Seite B hat zur Folge, daß jeder Aufruf der Seite B auch zusätzlichen Datenverkehr bei Seite A erzeugt. Dabei kann je nach Bildgröße und Besucherzahl einiges an Datenvolumen zusammen kommen. Wer in seinem Webhosting-Paket nur einen begrenztes monatliches Transfervolumen hat, für den könnten dadurch zusätzliche Kosten entstehen.

Blumen Bilder SERPsFür die Suchergbnisse von Suchmaschinen bewirkt ein Hotlink unter Umständen, daß nicht mehr die Ursprungsseite, sondern die hotlinkende Seite als Ergebnisseite angezeigt wird.

Bei der Google-Bildersuche würde z.B. zwar das Bild von Seite A angezeigt werden, allerdings führt ein Klick auf das Ergebnis zur hotlinkenden Seite B.

Aber auch der einfache Link auf ein Bild, obwohl er streng genommen kein Hotlink ist, kann in der Bildersuche dieselben Auswirkungen wie ein echter Hotlink haben.

Was kann man gegen Hotlinks tun?

Neben der Möglichkeit den Hotlinker zu bitten das Bild zu entfernen, notfalls auch mit juristischem Nachdruck, gibt es auch technische Mittel gegen Hotlinks.

So eine Hotlinksperre schützt streng genommen nicht vor dem Hotlinking selbst, sondern verhindert nur, daß ein Nutzer die Bilder auf der hotlinkenden Seite sieht. Die Links zu den Bildern bleiben bestehen und die Suchmaschinen-Bots merken nichts von der Sperre. So kann es passieren, daß die Hotlinkseite B trotz Hotlink-Sperre bei Google mit dem ursprünglichen Bild rankt bzw. die Ursprungsseite A ersetzt.

Wie kann man Hotlinks aufspüren?

Bei Hotlinks landen die Zugriffe auf ein Bild durch Seite B im Serverlog der Ursprungsseite A. Eine gute Möglichkeit, Hotlinks aufzuspüren, ist die Auswerteung des Referers in den Server-Logdateien. Da ein einfaches Durchsehen recht aufwändig sein kann, erledigt man das am besten mit Hilfe eines Programms oder z.B. eines PHP-Skripts.

Eine Empfehlung für ein passendes Programm oder PHP-Skript kann ich zwar nicht geben, werde demnächst aber hier mein eigenes, kleines PHP-Tool veröffentlichen.

Auch die Google-Bildersuche bietet die Möglichkeit, Hotlinks zu finden.

Wie kann man Hotlinks mit Google finden

Da die imagesite:-Abfrage leider nicht mehr funktioniert, muß man sich nun mit inurl: behelfen. Die inurl:-Abfrage wird dann mit einer außschließenden site:-Abfrage kombiniert.

Für die Bildersuche ergibt die Kombination

inurl:http://seite-a.de -site:seite-a.de

Treffer mit einem Bild von Seite A, welches nicht auf Seite A zu sehen ist. Das ist bei Hotlinks und Links der Fall. Für putzlowitsch.de sieht das z.B. so aus.

Man kann aber auch gezielt nach Hotlinks von einer bestimmten Seite suchen:

inurl:http://seite-a.de site:seite-b.de

Damit werden Bilder von Seite A angezeigt, die von Seite B gehotlinkt bzw. gelinkt werden. Bei blogspot.com werden z.B. diese Bilder von putzlowitsch.de eingebunden.

Für eine schnellere Übersicht könnte man die Ausgabe auf das alte Layout mit dem Parameter sout=1 erzwingen, zudem liefert die Abfrage in Abhängigkeit von der Sprache und den SafeSearch-Einstellungen bisweilen andere Ergebnisse.

Damit ihr euch die kompliziert Abfrage nicht per Hand zusammenbasteln müßt, habe ich ein Formular mit etwas Javascript drum herum erstellt. Damit kann die Hotlinksuche bequem erstellt werden.

Das Hotlink-Suchformular

Damit das Formular sichtbar ist und funktioniert, muß Javascript aktiviert sein.

In Domain kommt die Ursprungsseite der Bilder, falls es eine Subdomain ist, muß diese mit angegeben werden (z.B. images.seite-a.de).

Bei Weitere Seiten kommen die mit Leerzeichen getrennten Namen von Seiten rein, für die mit (●) ausschließen keine Hotlinks angezeigt werden sollen. Ist (●) einschließen ausgewählt, wird die Logik umgedreht. Es werden dann nur Hotlinks von den angegebenen Seiten angezeigt.

Die Optionen sind selbsterklärend, würde ich sagen.

Auf [Los] gehts los. Es wird ein neues Browserfenster mit der erstellten Google-Suche geöffnet. Falls das Fensteröffnen in den Browsereinstellungen nicht erlaubt ist, kann auch der links eingeblendete Link „Hotlinks finden“ angeklickt werden.

Ich will auch einen wesentlichen Nachteil der inurl:-Suche gegenüber der imagesite:-Suche nicht verschweigen. Die site:– bzw. frühere imagesite:-Abfrage beziehen sich tatsächlich auf den Domainnamen der Seite. Die inurl:-Abfrage ist da, wie der Name auch erwarten läßt, deutlich größzügiger.

Die Abfrage

inurl:http://seite-a.de

findet auch Bilder wie z.B.

http://seite-b.de/screenshot/?s=http://seite-a.de

. Das ist natürlich kein Hotlink oder Link zur Ursprungsseite. Aber solche Treffer muß man dann einfach ignorieren.

6 Kommentare »

Plug and Play

Plugin 123 HTTP TransportDas mit den Plugins für WordPress ist ja wirklich eine feine Sache. Es gibt deren viele und sie leisten teilweise Dinge, von denen man gar nicht wußte, das man sie jemals gebrauchen könnte.

Ja, auch ich verwende Plugins. :-)

Das aktuelle Thema des Wabmasterfridays lautet „Welche WordPress-Plugins habt ihr aktiv im Einsatz?“ und so habe ich hier im Blog-Adminbereich einfach mal nachgeschaut. Es sind derzeit ganze 27 aktive Plugins, die ich jetzt aber nicht alle ausführlich vorstellen werde.

Der Grund ist einfach. Das hier ist mein Test- und Entwicklungsblog und so laufen da viele Sachen zu Testzwecken. Von den 27 Plúgins sind bis auf eines alles Eigenentwicklungen. Man erkennt sie an dem „123 Irgendwas“-Namen.

Fremde Plugins

Das einzige fremde Plugin ist DoFollow. Damit wird des nofollow-Attribut bei Links in Kommentaren entfernt. Das stellt aber keinen Freifahrtschein für jeden Mist dar. Erstkommentare werden moderiert und gegebenfalls Entlinkt oder Entfollowt.

Eigene Plugins

Viele Plugins sind nur kleine Helferlein, teilweise sogar ohne Optionenseite, manche bügeln nur Fehlkonfigurationen der Webhoster aus.

Ein paar haben aber schon einen etwas größeren Umfang und Nutzwert.

  • 123 IntLink
    IntLink zählt zu meinen ältesten Plugins und hat sogar Editor-Buttons. Mit dem Plugin kann man mit der Artikel-ID (bzw. Kommentar-ID) einfach auf bloginterne Artikel, Seiten oder auch Kommentar verlinken. Die Links werden erst zur Laufzeit generiert. Damit passen sie immer, egal ob man mal die Permalinks ändert oder mit dem ganzen Blog umzieht.
  • 123 Shrink Link
    Wer kennt das nicht, im Kommentar hinterläßt jemand einen monstermäßig langen Link, der dann weit nach rechts über den Rand hinausragt und das in mühsamer Arbeit erstellte Design zerstört. Mit Shrink-Link werden solche Links für die Anzeige gekürzt. Mit ein paar Optionen kann man das Kürzungsverhalten steuern.
  • 123 Homelink
    Lange Zeit war es in WordPress nur möglich einen Menüeintrag mit einem Link zur Startseite im Theme zu programmieren. Das Plugin ermöglicht das Hinzufügen des Startseiten Links im Backend, außerdem das Ein- und Ausblenden von Seiten aus dem Menü un das ändern der Menütexte.
    Seit WP 3.0 ist das alles mit den Benutzermenüs ja bereits fest eingebaut.
  • 123 Tools
    Das Plugin ist eine Art Sammelplugin für kleinere Funktionen, für die sich kein eigenes Plugin lohnen würde. Ein Werkzeugkasten halt. :-)

Dann gibt es noch mehrere nicht öffentliche Plugins, die ganz unterschiedliche Funktionen haben. Mit dem „123 Character Mixer“ kann man Buchstaben vertauschen, so daß eigenartig fremdsprachig anmutende Texte entstehen. Sehr wichtig ist mir das „123 Shortlink“-Plugin, damit kann ich per Artikel- oder Attachment-ID eine Weiterleitung auf den Artikel oder direkt auf ein Bild generieren. Das brauche ich z.B., wenn ich die Artikel oder Bilder in Twitter abkippen will. :-)

Apropos in Twitter abkippen, das werde ich jetzt auch gleich tun… :-)

2 Kommentare »