web-dev-qa-db-fra.com

Faire des pièces jointes nécessitent une URL de base

Si je télécharge une image avec le nom de fichier 8.jpg, le lien permanent devient alors http://www.example.com/8 - ce que je ne veux vraiment pas. Comment puis-je faire en sorte que les pièces jointes utilisent leur type mime comme base pour l'URL? http://example.com/image/8?

add_action('init', function(){
    add_rewrite_endpoint( 'media', EP_PERMALINK | EP_ATTACHMENT| EP_PAGES  );
    flush_rewrite_rules(true);
} );

Je ne suis pas vraiment sûr du fonctionnement des terminaux, mais je peux transformer /media/8 en post ...

2
jgraup

Les points finaux servent à ajouter des variables de requête supplémentaires aux routes existantes, je pense que vous voulez simplement une règle de réécriture Vanilla ici:

function wpd_media_image_rewrite_rule() {
    add_rewrite_rule(
        '^image/([^/]*)/?',
        'index.php?post_type=attachment&name=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wpd_media_image_rewrite_rule' );

Vous voudrez peut-être y insérer des types MIME valides et ajouter une règle pour chacun. Vous devez également vider les réécritures pour que cela commence à fonctionner, mais n'utilisez pas flush_rewrite_rules sur init comme dans l'exemple ci-dessus. Les règles ne doivent être effacées que lorsqu'elles changent. Un moyen rapide de les vider consiste simplement à visiter la page des paramètres de permaliens.

Vous aurez également besoin de filtrer au moins attachment_link pour générer l'URL correcte des médias non attachés, tels que:

function wpd_media_image_att_link( $link, $post_id ){
    $post = get_post( $post_id );
    if( 0 == $post->post_parent ){
        $link = home_url( user_trailingslashit( 'image/' . $post->post_name ) );
    }
    return $link;
}
add_filter( 'attachment_link', 'wpd_media_image_att_link', 10, 2 );

Ici, nous vérifions si la pièce jointe n'a pas de parent, car si elle est attachée à un article, ce serait un enfant de l'article parent. Vous pouvez également vérifier le type mime ici et rendre la partie image/ dynamique en fonction du type.

Il existe également la fonction wp_get_attachment_link qui peut nécessiter un filtre, si celui-ci est utilisé quelque part dans le modèle. Je ne pense pas que l’administrateur principal utilise cette fonction n’importe où, mais j’ai peut-être tort.

4
Milo