web-dev-qa-db-fra.com

Obtenir l'ID de n'importe quelle image pour accéder à functions.php

J'ai ajouté deux champs personnalisés aux pièces jointes sur mon site afin que l'utilisateur puisse ajouter un crédit d'image spécial.

J'essaie d'écrire une fonction qui cherche à savoir si l'un des champs personnalisés est rempli et, le cas échéant, renvoie le contenu.

La partie avec laquelle je me bats est d’obtenir l’identifiant de l’image dans la fonction - c’est assez simple pour les images en vedette utilisant get_post_thumbnail_id() - existe-t-il un moyen similaire d’obtenir l’ID pour toute image attachée?

Voici ce que j'ai jusqu'à présent:

    function mat_image_credit() {

    //this is the bit I'm struggling with:
    $mat_image_id = wp_get_attachment_image( $attachment->ID ); 

    //this is collecting the contents of the custom field and works fine
    $mat_flickr_credit = slt_cf_field_value('flickr_credit', 'attachment', $mat_image_id); 

    $mat_custom_credit = slt_cf_field_value('custom_credit', 'attachment', $mat_image_id);

    //and then this echoes out the contents depending on what we find...
    if (!empty ( $mat_flickr_credit ) ) { 
        echo '<div class="credit">Image by <a href="http://www.flickr.com/photos/' . $mat_flickr_credit . '" target="blank">' . $mat_flickr_credit . '</a></div>'; 
    } elseif ( !empty ( $mat_custom_credit ) ) { 
        echo '<div class="credit">Image by ' . $mat_custom_credit . '</div>'; 
    };

}

Merci!

1
seanhawkridge

Espérons que cela aide,

function mat_image_credit() {
    global $post;
    $args = array(
    'post_type'      => 'attachment',
        'post_parent'    => $post->ID,
        'post_mime_type' => 'image',
        'numberposts'    => -1,
    );
    $imgs = get_posts($args);
    foreach ($imgs as $img) {

        $field1 = slt_cf_field_value('flickr_credit', 'attachment', $img->ID);
        $field2 = slt_cf_field_value('custom_credit', 'attachment', $img->ID);

        if (!empty ( $field1 ) ) { 
            echo 'Image by ' . $field1; 
        } elseif ( !empty ( $field2 ) ) { 
            echo 'Image by ' . $field2; 
        };
    }
}

Puis dans votre thème (utilisé dans The Loop),

<?php mat_image_credit(); ?>

L’énoncé foreach suppose que les utilisateurs peuvent joindre plus d’une image et attributions de crédits par publication et que vous souhaitez les imprimer dans un ordre groupé.

L’autre solution consiste à supprimer l’instruction foreach et à retirer la première image du tableau des pièces jointes renvoyées.

function mat_image_credit() {
    global $post;
    $args = array(
    'post_type'      => 'attachment',
        'post_parent'    => $post->ID,
        'post_mime_type' => 'image',
        'numberposts'    => -1,
    );
    $imgs = get_posts($args);

        //$imgs[0]->ID grabs first image in the array (array key begining with 0)
        $field1 = slt_cf_field_value('flickr_credit', 'attachment', $imgs[0]->ID;);
        $field2 = slt_cf_field_value('custom_credit', 'attachment', $imgs[0]->ID;);

        if (!empty ( $field1 ) ) { 
            echo 'Image by ' . $field1; 
        } elseif ( !empty ( $field2 ) ) { 
            echo 'Image by ' . $field2; 
        };

    }

Puis dans votre thème [comme avant] (utilisé dans The Loop),

<?php mat_image_credit(); ?>

Au-delà de cela, vous pouvez étendre cette fonction pour la rendre un peu dynamique en ce sens que vous pouvez récupérer les première, deuxième et troisième images jointes et les utiliser dans différentes parties de votre modèle.

Exemple;

function mat_image_credit($custom = 0) {
    global $post;
    $args = array( //etc... );
    $imgs = get_posts($args);

    $field1 = slt_cf_field_value('flickr_credit', 'attachment', $img[$custom]->ID);
    $field2 = slt_cf_field_value('custom_credit', 'attachment', $img[$custom]->ID);

    if (!empty ( $field1 ) ) { 
        echo 'Image by ' . $field1; 
    } elseif ( !empty ( $field2 ) ) { 
        echo 'Image by ' . $field2; 
    };
}

Puis dans votre thème [comme avant] (utilisé dans The Loop),

<?php mat_image_credit();  ?> //returns first image (default $custom = 0)
<?php mat_image_credit(0); ?> //returns first image
<?php mat_image_credit(1); ?> //returns second image
<?php mat_image_credit(2); ?> //returns third image etc...

Si vous ne spécifiez pas de valeur (entier), la fonction par défaut affectera 0 à la clé, ce qui récupérerait la première image du tableau de résultats. Par la suite, pour ceux dans lesquels vous spécifiez une valeur, le key => value correspondant sera récupéré.

Qui sait ... vous devrez peut-être récupérer plus d'un lot de crédits à plus d'un endroit dans un fichier de modèle. CA aidera.

1
userabuser

Je suis allé à ce sujet comme ça à la fin:

function image_credit($id) {

$flickr_credit = slt_cf_field_value('flickr_credit', 'attachment', $id);
$custom_credit = slt_cf_field_value('custom_credit', 'attachment', $id);

if (!empty($flickr_credit)) {
$credit = '<div class="credit">Image: <a href="http://www.flickr.com/photos/' . $flickr_credit . '" target="blank">' . $flickr_credit . '</a></div>'; }

elseif (!empty($custom_credit)) {
$credit = '<div class="credit">Image: ' . $custom_credit . '</div>'; }

echo $credit;

}

Ensuite, dans mon modèle, je peux juste

echo image_credit($my_image_variable);
0
seanhawkridge