Posts mit Tag: WordPress

WordPress Update 3.0.4 – Ohne Probleme

Das Update von WordPress auf 3.0.4 ist bei mir ohne Probleme verlaufen. Es funktionieren weiterhin alle Plugins – auch mein eigenes.
Das nachfolgende Update aller Plugins hat dann auch geklappt. So sollte das immer sein!

Das neue Admin-Interface ist allerdings sehr grau für meinen Geschmack:

Die blauen Tabs sind vom Firefox:

Grau-blau:

Grau.

‘Aktualisieren’ ist zum Glück noch blau.

Unten auch Grau.

Alles in allem ein gelungenes graues Update.

Zoomimage & jQuery: Schönes kann so einfach sein.

Zoomimage ist ein Plugin für jQuery mit dem verlinkte Bilder vergrößert werden können.
Die Einbindung ist denkbar einfach und auf der Zoomimage Homepage auch ausreichend beschrieben.

Um Zoomimage vollständig in WordPress einzubinden habe ich mein Post Functions Plugin erweitert.

View Code PLAIN
1
[zoomimage:src=screenshots/lueckentext-mit-hilfe.png, w=400, zw=800, float=right, alt=Lückentext zu den unregelmäßigen Verben]

Obiger Code resultiert in einem 400px breiten Bild, das bei Klick auf 800px verbreitert wird. Zusätzlich wird unter dem Bild der alt-Text angezeigt.

Die Resultate können dann in absehbarer Zeit auf compulearnenglisch.de/information besichtigt werden.

WordPress: Virtuelle Seiten erstellen – Von .htaccess zu Hooks

Worpress ist praktisch, wenn man manuell Seiten (Pages) erstellt und diese im Admin Bereich editieren möchte. Allerdings gibt es keine (mitgelieferte) Möglichkeit “virtuelle Seiten” unterzubringen.

Virtuelle Seiten?!
Nun rede ich hier von virtuellen Seiten, aber was verstehe ich darunter?
Im Prinzip ist die Idee ganz einfach: Der Webseitenbesucher soll keinen Unterschied zwischen einer virtuellen und einer “realen” Seite sehen – allerdings ist die virtuelle Seite nicht in der WordPress Datenbank abgelegt.

Die Probleme
Aus dieser Aufgabenstellung ergeben sich folgende Probleme:

  1. Umleitung der Anfrage auf ein eigenes php-Skript
  2. Einbinden des WordPress Layouts
  3. Erweitern der Navigation um die Virtuellen Seiten

Umleitung der Anfrage auf ein eigenes php-Skript
Auszug aus der .htaccess

View Code PLAIN
1
2
3
4
RewriteEngine On
RewriteBase /pfad/zu/meinem/blog/
RewriteRule ^uebung/([\w,=;\-]+)\.html$ ce_exercise.php?id=$1 [L]
RewriteRule ^uebung/?$ ce_exercise.php [L]

In diesem Beispiel werden alle Anfragen auf /uebung, /uebung/, /uebung/xyz-abc-etc.html auf ce_exercise.php umgeleitet. ce_exercise.php bindet dann WordPress ein und lädt die angeforderte Seite aus der (eigenen) Datenbank.

Einbinden des WordPress Layouts
Mit

1
2
3
4
5
6
define ( 'WP_USE_THEMES', false );
 
/** hier fehlt noch was! Siehe unten */
 
/** Loads the WordPress Environment and Template */
require ('./wp-blog-header.php');

wird WordPress eingebunden (angenommen, dass wp-blog-header.php im selben Verzeichnis liegt).
define ( ‘WP_USE_THEMES’, false ); verhindert, dass WordPress selbstständig wird und Theme Dateien lädt – Das wollen wir ja selbst machen!

Dies alleine reicht allerdings nicht aus, da WordPress die url analysiert und trotzdem versucht den Inhalt der Seite zu laden. Da die angeforderte Seite virtuell ist wird WordPress immer davon ausgehen, dass ein 404 (Seite nicht gefunden) vorliegt.

Dies lässt sich wie folgt lösen:

1
2
3
/* confuse wordpress: make it think the url is something else */
preg_match ( '#(.*)/uebung/#', $_SERVER ['REQUEST_URI'], $treffer );
$_SERVER ['REQUEST_URI'] = $treffer [1] . "/uebung/";

Ich gebe zu, diese Lösung ist weder schön noch Zukunftssicher – aber sie funktioniert.

Wichtige Hinweise zu dieser Lösung:

  • Ich verwende “schöne” permalinks mit mod_rewrite
  • Es muss eine Seite angelegt werden, die auf die umgeschriebene url passt. Hier: /uebung/
  • Der Code muss vor require (‘./wp-blog-header.php’); stehen!

Der Anfang des php-Skriptes sieht dann so aus:

1
2
3
4
5
6
7
8
9
10
11
error_reporting ( E_ALL );
define ( 'WP_USE_THEMES', false );
 
/* confuse wordpress: make it think the url is something else */
preg_match ( '#(.*)/uebung/#', $_SERVER ['REQUEST_URI'], $treffer );
$_SERVER ['REQUEST_URI'] = $treffer [1] . "/uebung/";
 
$requested_page = isset ( $_GET ['id'] ) ? $_GET ['id'] : "main";
 
/** Loads the WordPress Environment and Template */
require ('./wp-blog-header.php');

Nun können die WordPress-Funktionen get_header (); get_sidebar (); und get_footer (); aufgerufen werden.

Damit ist das Problem des Layouts gelöst – bleibt noch:

Erweitern der Navigation um die Virtuellen Seiten
Wordpress stellt viele sogenannter “hooks” zur Verfügung, um die Ausgabe von WordPress Funktionen zu beeinflussen. Diese Hooks werden auf den Resultaten der WordPress Funktionen ausgeführt, nachdem die WordPress Funktion fertig ist.

Vereinfacht kann man sich das so vorstellen:

1
2
$reslut = wp_some_funtion();
$result = my_hook( $result );

Die Kunst besteht darin die richtige WordPress Funktion auszuwählen. Ich hab hier auch einen unschönen aber schnellen und effektiven Weg gewhält: Ich modifiziere die Navigation, nachdem diese als HTML generiert wurde. Konkret: Ich verwende einen Hook auf wp_list_pages.

In meinem Fall möchte ich nur die Navigation der Sidebar beeinflussen und nicht die des Headers. Deshalb wird der Hook erst nach Ausgabe des Headers aufgerufen.

Jetzt bleibt nur noch das Hinzufügen der zusätzlichen Navigationselemente im Hook. Ich suche dazu nach dem Navigationseintrag, der “uebung” enthält und füge danach die virtuellen Seiten ein.

Der gesamte (auf das Wesentliche reduzierte) Code:

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
 
error_reporting ( E_ALL );
/* verhindern, dass WP selbständig Themes lädt */
define ( 'WP_USE_THEMES', false );
 
/* confuse wordpress: make it think the url is something else */
preg_match ( '#(.*)/uebung/#', $_SERVER ['REQUEST_URI'], $treffer );
$_SERVER ['REQUEST_URI'] = $treffer [1] . "/uebung/";
 
$requested_page = isset ( $_GET ['id'] ) ? $_GET ['id'] : "main";
 
/** Loads the WordPress Environment and Template */
require ('./wp-blog-header.php');
 
 
get_header ();
 
// hier den eigentlichen Seiteninhalt ausgeben
 
// hier $added_pages_str mit den virtuellen Seiten füllen
 
add_filter ( 'wp_list_pages', 'ce_mod_pages_list', 1, 2 );
 
get_sidebar ();
 
get_footer ();
 
function ce_mod_pages_list($pages_str, $opt) {
	global $added_pages_str, $requested_page;
	$parts = preg_split ( "#</li>#", $pages_str );
	foreach ( $parts as $key => $value ) {
		if (strpos ( $value, "uebung" ) !== false) {
			if ($requested_page != "main") {
				$parts [$key] = str_replace ( "current_page_item", "", $parts [$key] );
			}
			$parts [$key] .= $added_pages_str;
			break;
		}
	}
	return implode ( "</li>", $parts );
}

Schlussbemerkungen

  • ce_ steht für CompuLearn Englisch
  • Das Deutsch / Englisch Chaos in Code und Kommentaren ist ärgerlich aber nicht zu vermeiden.
  • Oje, das ist ja ganz schön viel geworden – Ich hoffe jemand liest das und findet Anwendung dafür.
  • Die Resultate können auf compulearnenglisch.de/uebung besichtigt werden.
  • Fragen und Kommentare wie immer erwünscht.
  • Listen machen alles übersichtlicher ;-)

WordPress: XML-Sitemap: Zusätzliche Seiten hinzufügen

Auf compulearnenglisch.de/uebung finden sich viele generierte Seiten, die nicht in der WordPress Datenbank gespeichert sind. Demnach werden diese Seiten nicht automatisch in der Xml-Sitemap aufgenommen.

Ein Blick in die Dokumentation genügt allerdings um das Problem zu lösen:

Adding other pages to the sitemap via other plugins

This plugin uses the action system of WordPress to allow other plugins to add urls to the sitemap. Simply add your function with add_action to the list and the plugin will execute yours every time the sitemap is build. Use the static method “GetInstance” to get the generator and AddUrl method to add your content.

1
2
3
4
5
function your_pages() {
  $generatorObject = &GoogleSitemapGenerator::GetInstance(); //Please note the "&" sign for PHP4!
  if($generatorObject!=null) $generatorObject->AddUrl("http://blog.uri/tags/hello/",time(),"daily",0.5);
}
add_action("sm_buildmap","your_pages");

Fehler im WordPress Plugin All in “One SEO Pack 1.6.7″ – Rollback Anleitung / Wiederherstellung

wp-logoNach der Installation von All in One SEO Pack 1.6.7 ist es nicht mehr möglich die Konfiguration von “All in One SEO Pack” zu speichern.
Den zugehörigen Thread gibt es hier

Falls die fehlerhafte Version schon installiert wurde empfiehlt sich ein “Rollback” auf die Version 1.6.6.2:

1
2
3
4
5
6
cd wp-content/plugins
wget http://downloads.wordpress.org/plugin/all-in-one-seo-pack.1.6.6.2.zip
rm -r all-in-one-seo-pack
unzip all-in-one-seo-pack.1.6.6.2.zip
rm all-in-one-seo-pack.1.6.6.2.zip
chown -R www-data:www-data all-in-one-seo-pack

Wenn man keinen ssh Zugriff hat einfach per ftp den Ordner “all-in-one-seo-pack” in “wp-content/plugins” löschen. Dann downloads.wordpress.org/…/all-in-one-seo-pack.1.6.6.2.zip lokal entpacken und “all-in-one-seo-pack” hochladen.

Nun noch einmal auf die Plugin-Seite und das Plugin aktivieren. Nun sollte es wieder einwandfrei funktionieren.

WordPress 2.8 Update Problem: Leere Seite nach Update

wp-logoNachdem die letzte WordPress Aktualisierung auf 2.7 problemlos verlief habe ich nun versucht auf die 2.8 zu aktualisieren. Das Ergebnis war eine leere Seite sowohl auf dem Blog als auch im Admin Menü.

Mir hat bei der Problemlösung vor allem Fixing Blank, Empty or White WordPress Pages after Upgrade geholfen.

Der Trick war, zunächst alle Plugins durch umbenennen des Plugin Ordners zu deaktivieren und danach einzeln wieder zu aktivieren. Das problematische Plugin ist bei mir der “wp-options-manager”.

Außerdem scheint die 2.8 nicht vollständig übersetzt worden zu sein:
wp-2-8-uebersetzung

Das Upgrade kann also durchaus holprig verlaufen… Ein Datenbank-Backup mit mysqldump und ein Seiten-Backup mit “tar -czf” ist – wenn möglich – auf jeden Fall zu empfehlen.

Neue “Post Functions”: jslink, fold, printfile

wp-logoEs gibt nun 3 neue Funktionen: jslink, printfile, fold.
jslink und fold benötigen jQuery

Funktion jslink

jslink ermöglicht es JavaScript Links im Text zu platzieren. Außerdem ist jslink mit Link Indication kompatibel. (Siehe dazu JavaScript Links und Link Indication).
<, >, ‘ und ” werden automatisch als HTML-Entity dargestellt.

Beispiel
[jslink:klick mich]alert(‘:)’)[/jslink]
Resultat: klick mich

Funktion fold

Mit fold können Textpassagen ausklappbar dargestellt werden.

Beispiel
[fold:ausklappen]mein Text[/fold]
Resultat: ausklappen

Funktion printfile

printfile gibt eine komplette Datei direkt im Post aus. Am besten sollte diese Funktion mit WP-CodeBox verwendet werden.

Argument displaypath
printfile akzeptiert das Argument pisplaypath. Wird dieses angegeben gibt printfile den Pfad zur Datei vor der Datei aus.

Beispiel
[printfile:index.php|displaypath=1]
Resultat (mit WP-CodeBox):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Contents of 'index.php'
<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
 
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);
 
/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php');
?>

JavaScript Links und Link Indication

wp-logoLink Indication ist ein Plugin für WordPress, das alle externen Links durch Symbole kennzeichnet. Leider ist das Plugin inkompatibel mit JavaScript Links.

1
<a href="javascript:" onclick="doSomeStuff()">...</a>

Links solcher Art enden in einem Desaster.

Beispiel: Link Indication “zerstört” JavaScript Link

Original

1
<a onclick="$('h2').slideToggle('slow');" href="javascript:">Alle Überschriften ausblenden</a>

Nach Link Indication

1
<a class="liinternal" );="" slow="" ).slidetoggle(="" h2="" onclick="$(" href="javascript:">Alle Überschriften ausblenden</a>

href=”…” scheint das Problem zu sein

Link Indication hat offenbar Probleme mit Links, deren href-Attribut keine gültige URL enthält.

Eine Möglichkeit wäre das href=”javascript:” komplett wegzulassen. Dies hat aber den Nachteil, dass der Link nun nicht mehr als solcher vom Browser interpretiert wird: Es wird keine Hand mehr bei darüberfahren angezeigt:

“Kaputter” Link: klick

“Reparatur” mit CSS

Man kann die Links aber mit CSS “reparieren”

1
a.js { cursor:pointer; }
1
<a class="js" onclick="doSomeStuff()">...</a>

“Reparierter” Link: klick

WordPress: Eigenes Plugin schreiben – “Post Functions”

wp-logoFür die Pluginentwicklung in WordPress sollte man zwei Sprachen beherrschen: PHP und Englisch. Alle wichtigen Hinweise können auf codex.wordpress.org/Writing_a_Plugin (en) gefunden werden.

Motivation

Ich verwende in meinem Blog relativ viele Links auf externe aber auch auf eigene Seiten. Das Verlinken von eigenen Seiten birgt ein Problem, welches sich erst bei einem eventuellen Umzug auf eine andere Domain offenbart: Alle Links müssen absolut sein, also die komplette Domain beinhalten. Bei einem Umzug auf eine andere Domain wären diese Links alle “kaputt”.

Mein experimentelles Plugin “Post Functions” führt 2 neue Funktionen ein, die in Artikeln und Seiten verwendet werden können:

Funktion “link”

Beispiele
(Der “.” in “[." dient dazu, dass das Plugin nicht aktiv wird...)

Externer Link
[.link:http://codex.wordpress.org/Writing_a_Plugin]
Resultat: codex.wordpress.org/Writing_a_Plugin

Interner Link
[.link:ueber-mich|Über mich]
Resultat: Über mich

Der Text nach dem “|” dient als Text für den Link. Wenn kein “|” vorhanden ist, wird die Url als Text verwendet, wobei das http:// wird entfernt. Zusätzlich kann das Plugin so konfiguriert werden, dass lange Urls durch “…” verkürzt werden:

Langer externer Link
[.link:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html]
Resultat: chiark.greenend.org.uk/…/download.html

Funktion “bloginfo”

Beispiel
[.bloginfo:url]
Resultat: http://familie-ottenhaus.de/simon/blog

“bloginfo” gibt Zugriff auf die WordPress-Funktion bloginfo. “[.bloginfo:url]” kann zum Beispiel in Bild-Urls verwendet werden.

(Source Code im ganzen Artikel)
Weiterlesen »

WordPress Themes