Das Putzlowitsch Test- und SEO-Blog

Strato aktualisiert endlich den WebDatabaseManager

Vor etwa 4½ Jahren hatte ich mal ein größeres Problem mit einer Datenbank bei Strato. Die technische Ursache war eine damals schon drei Jahre alte Version (2.6.4-pl3) der MySQL-Verwaltungssoftware phpMyAdmin.

Als ich nun heute mal wieder den WebDatabaseManager, der übrigens auch unter „Profi-Features“ in der Beschreibung der Webhostingpakete aufgeführt ist, für eine meiner Datenbanken startete, war ich doch positiv überrascht.

Strato WebDatabaseManager (phpMyAdmin 3.5.3)

Strato hat es nach nunmehr fast 7 Jahren geschafft, den Hosting-Kunden eine halbwegs aktuelle Version (3.5.3 vom Oktober 2012) von phpMyAdmin als WebDatabaseManager bereitzustellen.

Nun hängt nur noch 1&1 hinterher, da läuft immer noch das uralte phpMyAdmin 2.6.4-pl3.

Keine Kommentare »

Bilder in der WordPress-Mediathek neu verknüpfen

Bilder und Artikel

Lädt man in WordPress Bilder direkt im Editor hoch, werden sie automatisch mit dem aktuell bearbeiteten Artikel bzw. der Seite verknüpft. Diese Bilder werden dann z.B. in der Worpdress-Galerie zu diesem Artikel angezeigt. Die Zuordnung eines Bildes zu einem Artikel ist normalerweise nicht änderbar. Auch wenn man ein Bild in einem oder mehreren anderen Artikeln verwendet bleibt die Eltern (Artikel) – Kind (Bild) – Beziehung bestehen.

Elternlose Bilder

Wird ein Bild in der Mediathek hochgeladen, ist es zunächst elternlos. In der Bilderliste steht dann in der Spalte „Verwendet in“ wie bei den Aprikosen nur „(Nirgendwo verwendet)“.

Wordpress-Mediathek: Funktionen für Bilder

Mit einem Klick auf „Verknüpfen“ kann man das Bild dann einem Artikel oder einer Seite zuweisen. Das Bild bekommt seine Eltern auch zugeteilt, wenn es erstmalig in einem Artikel oder einer Seite verwendet wird.

Bilder-Adoption

Manchmal kann es wünschenswert sein, ein Bild einem anderen Artikel zuzuordnen. Ein Weg ist, dieses direkt in der Datenbank zu erledigen. Dazu muß im Feld post_parent des Bildes die ID des gewünschten Artikels eintragen.

Einfacher ist es natürlich, wenn man die Zuweisung in der WordPress-Mediathek durchführen kann. Eine entsprechende Funtkion kann mit ein paar Zeilen PHP-Code nachgerüstet werden:

function plw123_add_attach( $actions, $post, $detached )
{
  if ( current_user_can( 'edit_post', $post->ID ) )
    $actions['attach'] = '<a href="#the-list" onclick="findPosts.open( \'media[]\',\''.$post->ID.'\' );return false;" class="hide-if-no-js">'.__( 'Attach' ).'</a>';
  return $actions;	
}
add_filter( 'media_row_actions', 'plw123_add_attach', 10, 3 );

Der PHP-Code kann z.B. in die Datei functions.php des Themes eingetragen werden.

Der Link „Verknüpfen“ wird dann für jedes Bild bei den Funktionen angezeigt, die beim Überfahren einer Mediathekzeile mit der Maus eingeblendet werden (Beispiel Kamera):

Wordpress-Mediathek: Funktion "Verknüpfen" bei jedem Bild

Die vorgestellte Lösung habe ich mit WordPress 3.2.x und 3.3.x getestet.

25 Kommentare »

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 »

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 »

Revierphone-Chart und Image-Map mit Shortcode

Von einigen Nutzern meiner Revierphone-Charts tauchte auch die Frage auf, wie man die URLs der Grafik anklickbar machen kann. Das ist im Prinzip ganz einfach, mit einer image-map. :-)

Eine zum jeweils aktuellen Chart passende Map liegt im selben Verzeichnis wie die Grafik und hat den Namen top-10-map.txt. Dies Datei für Revierphone kann man ganz normal aufrufen und hineinsehen. Es steht ein Imagemap drin. Wichtig ist dabei der Mapname, hier z.B. ‚gcmap-27‘, mit dem die Map von der Grafik referenziert wird.

Revierphone-Map mit WordPress Shortcode

Seit Wordperess Version 2.5 gibt es die Shortcodes mit denen man spezielle Funktionen direkt in den Inhalt einer Seite oder eines Artikels einbinden kann. Ein Beispiel ist der seitdem existierende gallery-Shortcode, mit dem man die Bilder zu einem Beitrag als kleine Galerie im Artikel anzeigen kann.

Aber auch für eigene Erweiterungen ist die Shorcode-API wunderbar und vorallem einfach einsetzbar. Für das Einlesen der Revierphone-Image-Map sind nur wenige Zeilen PHP-Code in der functions.php-Datei des Themes erforderlich:

function plw_get_chart_map( $atts, $content = null ) {
	extract( shortcode_atts( array(
		'name' => null,
	), $atts ) );
	
	if( is_null( $name ) )
		return '';

	$url = "http://chart.hbgf.de/$name/top-10-map.txt";
	$response = wp_remote_get( $url );
	if( is_wp_error( $response ) )
		return '';
	if( 200 != $response['response']['code'] )
		return '';

	return $response['body'];
}
add_shortcode( 'chartmap', 'plw_get_chart_map');

Der Shortcode erwartet den Namen der Map als Parameter name. In diesem Fall ist es ‚revierphone‘, alles klein geschrieben. Falls kein Name übergeben wurde, wird ein Leerstring zurück gegeben.

Dann wird die URL zusammengesetzt und die Map mit der WordPress-Funktion wp_remote_get eingelesen. Die Funktion gibt es erst seit WordPress 2.7, deshalb funktioniert meine Funktion erst ab dieser WordPress-Version. Man vermeidet durch Nutzung das Jonglieren mit den diversen Netzwerkfunktionen wie cURL, Streams und fsockopen. Wenn die Konfiguration stimmt, funktioniert das auch sehr gut, schließlich verwendet WordPress die Funktion selbst für alle HTTP-Requests. :-)

Nach ein wenig gegebenenfalls erforderlicher Fehlerbehandlung wird vom Shortcode-Handler die eingelesene Map zurück gegeben.

Revierphone-Chart mit klickbaren URLs

Um die Image-Map im WordPress-Artikel zu verwenden, muß an der gewünschen Stelle einfach der Shortcode mit dem map-Parameter eingegegen werden. Am besten dirket vor der Revierphone-Chart-Grafik selbst:

[chartmap name='revierphone']
<img src="http://chart.hbgf.de/revierphone/top-10.png" alt="reVierphone Top-10" usemap="#gcmap-27"/>

Wichtig ist, damit es überhaupt funktioniert, beim img-Tag das Attribut usemap. Hier ist der Name der Map so wie im map-Tag angegeben mit einem vorangestellten Doppelkreuz einzutragen, also usemap=“#gcmap-27″.

Und so sieht das dann aus:
[chartmap name=’revierphone‘]
reVierphone Top-10

Viel Spaß :-)

5 Kommentare »