web-dev-qa-db-fra.com

Comment puis-je obtenir une taille d'image différente, si tout ce que j'ai, c'est le lien?

Pour diverses raisons, je ne peux pas utiliser la fonctionnalité Thumbnail intégrée à Wordpress.

Ce que je veux plutôt faire, c'est utiliser la première image du message en tant que vignette.

Voici ce que j'ai trouvé dans le codex: Affiche la première image associée à la publication .

Cependant, le problème avec cela est que si l'article contient plusieurs images, mais que la première image de l'article n'est pas celle qui a été téléchargée en premier, vous obtiendrez la deuxième image au lieu de la première.


J'ai donc décidé d'utiliser quelque chose de similaire à cette approche , qui utilise une expression régulière pour analyser the_content afin de trouver le premier message.

Cela fonctionne bien, mais je me retrouve avec la taille de l'image qui a été utilisée dans l'article, et je ne veux que la taille de la vignette.


Alors, voici la question: Si j'ai un lien vers une image, est-il possible d'obtenir une taille différente?

Il semble que ce dont j'ai besoin, c'est d'obtenir en quelque sorte l'ID de pièce jointe, afin d'obtenir la taille de l'image avec ceci:

wp_get_attachment_link( $id, 'thumbnail' );

Le problème est, comment obtenir un identifiant si tout ce que j'ai est l'URL ?

2
Joseph Silber

J'ai décidé d'utiliser ceci, qui est basé sur la réponse de @ AndresYanez:

function get_image_id_by_link($link)
{
    global $wpdb;

    $link = preg_replace('/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $link);

    return $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE BINARY guid='$link'");
}

C'est beaucoup plus succinct (puisqu'il ne saute pas dans les cerceaux de supprimer d'abord l'extension puis de la rajouter), et est un peu plus précis (puisque le . est échappé et que la requête est sensible à la casse).

6
Joseph Silber
function get_attachment_id_from_src ($src) {
    global $wpdb;

    $reg = "/-[0-9]+x[0-9]+?.(jpg|jpeg|png|gif)$/i";

    $src1 = preg_replace($reg,'',$src);

    if($src1 != $src){
        $ext = pathinfo($src, PATHINFO_EXTENSION);
        $src = $src1 . '.' .$ext;
    }

    $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$src'";
    $id = $wpdb->get_var($query);

    return $id;
}

Crédits à pathorsley: http://www.pathorsley.com/code/get-the-wordpress-post-attachment-id-from-an-image-src/

1
Andres Yanez

Le Codex est une source valide

Parfois Le Codex n'est-ce pas faux ...

Afficher les pièces jointes pour le poste actuel

C'est un exemple légèrement modifié du Codex.

<?php
// Do this inside The Loop (where $post->ID is available).
global $post;
$args = array( 
     'post_type'    => 'attachment'
    ,'numberposts'  => 1
    ,'post_status'  => null
    ,'post_parent'  => $post->ID
    ,'orderby'      => 'ID'
    ,'order'        => 'ASC' 
); 
$attachments = get_posts( $args );
if ( $attachments ) 
{
    foreach ( $attachments as $attachment ) 
    {
        echo apply_filters( 'the_title' , $attachment->post_title );
        the_attachment_link( $attachment->ID , false );
    }
}
?>

Soyez intelligent - utilisez le système derrière le système

Les modifications apportées à l'exemple Codex sont simples: les numberposts ont la valeur 1, la valeur orderby est la ID et il est en train de trier ASC d'obtenir le message avec l'ID le plus bas en premier.

Voici donc pourquoi smart : les identifiants sont attribués les uns après les autres, de sorte que le premier message téléchargé porte le plus petit identifiant.

Dans l'exemple ci-dessus, vous pouvez simplement échanger la dernière fonction avec wp_get_attachment_link() et la sauvegarder dans un fichier var que vous pourrez réutiliser ultérieurement.

0
kaiser