Wordpress
Kati Pierson
Sonntag, den 10. Mai 2015 um 18:00 Uhr

WordPress: Attachment- und Medien-Seiten mit Permalink

Für meine Bilder- und Attachemnt-Seiten einer anderen Wordpress-Installation wollte ich eine bestimmt URL haben. Einen Speaking-Name, einen Pretty Permalink - wenn man so will.

Bilder haben in WordPress erst einen SEO tauglichen Permalink, wenn sie mit einem Artikel verknüpft wurden. Sie sind jedoch sofort nach dem Upload auf einer URL der Struktur www.domain.de/?attachment_id=23 erreichbar. Dies ist jedoch nicht besonders SEO-freundlich.

Deshalb sollten wir eine meiner WordPress-Installationen sogenannte Pretty Permalinks, Speaking Names oder Sprechenden URLs her.

Diese neue URL sollte folgendermaßen aussehen:

/bilder/{attachment_id}/{attachment_title}

Da es sich hier um ein übergreifendes Problem handelt, ist die „functions.php“ im Theme-Verzeichnis für die nächsten Codezeilen der richtige Ort. Dazu müssen zunächst einmal die bestehenden RewriteRules zurückgesetzt werden.  Diese Zeilen und ein Themewechsel machen dies möglich.

/* Flush your rewrite rules */
function bt_flush_rewrite_rules() {
flush_rewrite_rules();
}
add_action('after_switch_theme', 'bt_flush_rewrite_rules');

Anschließend werden die URLs der Attachments- bzw. Medienseiten geändert. Der Slug „bilder“ wird dazu fix hineingeschrieben. Attachement-ID und Attachement-Titel werden via $post = get_post( $post_id ); geholt und entsprechend eingesetzt.

function wpd_attachment_link( $link, $post_id ){
$post = get_post( $post_id );
return home_url( '/bilder/' . $post->ID .'/'. $post->post_name  );
}
add_filter( 'attachment_link', 'wpd_attachment_link', 20, 2 );

Jetzt muss natürlich noch WordPress beigebracht werden, dass wie es diese neue URL zu lesen hat. Dazu muss die neue RewriteRule zu den bestehenden hinzugefügt werden. Dazu wird via Regular Expression ('bilder/(d*)/([^/]+)/?') die neue URL auf die alte URL (index.php?attachment_id=$matches[1]) übersetzt.

add_action('generate_rewrite_rules', 'attachment_rewrite_rules');
function attachment_rewrite_rules($wp_rewrite){
$new_rules = array();
$new_rules['bilder/(d*)/([^/]+)/?'] = 'index.php?attachment_id=$matches[1]';
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

Am Ende kann via www.domain.de/bilder/23/hund-katz-maus/ die Seite mit dem Bild aufgerufen werden.