How can I change the format of attachment page urls from /[post-url]/[attachment-name]/ to /media/[attachment-name]/? I understand that I can override the output of get_attachment_link via the attachment_link filter, but I guess I need to change the redirect structure so WordPress knows how to handle these urls?


You can do the following:

/* add new rewrite rule */
function attachment_rewrite( $wp_rewrite ) {
    $rule = array(
        'media/(.+)' => 'index.php?attachment=' . $wp_rewrite->preg_index(1)

    $wp_rewrite->rules = $rule + $wp_rewrite->rules;
add_filter( 'generate_rewrite_rules', 'attachment_rewrite' );

/* redirect standard wordpress attachments urls to new format */
function redirect_old_attachment() {
    global $wp;

    if( !preg_match( '/^media\/(.*)/', $wp->request ) && isset( $wp->query_vars['attachment'] ) ) {
        wp_redirect( site_url( '/media/' . $wp->query_vars['attachment'] ) , 301 );
add_filter( 'template_redirect', 'redirect_old_attachment' );
  • where do we add the above code, do we add it in functions.php or rewrite.php or links-template.php – Terrell Anderson Feb 27 '12 at 5:16
  • add it to your theme functions.php file – sorich87 Feb 28 '12 at 12:38
  • Where can I find / update the 'index.php?attachment=' handler? I want to use my own handler to resolve files, filter only for a specific user(s) & etc – Zilvinas Dec 16 '16 at 22:35

protected by fuxia Oct 1 '12 at 13:19

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.