web-dev-qa-db-fra.com

Obtenir le texte d'une image dans un shortcode en utilisant l'URL de l'image

Je crée un shortcode qui ressemble à ceci:

[hpLocationSquare locationimage="...wp-content/uploads/2017/04/Enfielddetails.jpg"  /]

L'attribut locationimage est l'URL d'une image dans la bibliothèque multimédia.

Dans mon functions.php j'ai le code suivant:

function hplocationsfn($atts, $content = null){
extract(shortcode_atts(array(
    'locationimage'=>''
    ), $atts));                     
return '<div class="locationSquare">
<a href="'.esc_attr($locationlink).'">
<img src="'.esc_attr($locationimage).'" />
</a>
</div><!-- locationSquare -->';
}

Ça fonctionne bien.

Ce que je veux vraiment, c’est en quelque sorte ramasser le texte alternatif de l’image dans la bibliothèque. Je pourrais juste ajouter un autre attribut, mais cela semblerait idiot si c'est déjà là. Existe-t-il un moyen d'obtenir le texte de remplacement pour l'image?

Merci

1
maxelcat

Au lieu d'utiliser l'attribut locationimage, pourquoi ne pas utiliser l'ID de pièce jointe?

Cela vous permettra de saisir dynamiquement l'URL du fichier et facilitera l'obtention d'autres métadonnées telles que le texte alternatif. Vous trouverez ci-dessous une version réécrite de hplocationsfn().

Exemple d'utilisation: [hpLocationSquare id='2299' link='http://example.com']

Notez que l'attribut link est facultatif.

function hplocationsfn( $atts ) {
    // Set up shortcode attributes.
    // User provided values are stored in $atts.
    // Default values are passed to shortcode_atts below.
    // Merged values are stored in the $a array.
    $a = shortcode_atts( [
                'id'   => false,
                'size' => 'thumbnail',
                'link' => false,
    ], $atts );

    // Bail if we don't have an image.
    if ( ! $a['id'] ) {
        return;
    }

    // Get the image and the image's alt value.
    $image     = wp_get_attachment_image_src( $a['id'], $a['size'] );
    $image_alt = get_post_meta( $a['id'], '_wp_attachment_image_alt', true );

    // Bail if our image is invalid.
    if ( ! $image || empty ( $image ) ) {
        return;
    }

    // Generate the output.
    $output = '<div class="locationSquare">';
    if ( $a['link'] ) {
        $output .= '<a href="' . esc_attr( $a['link'] ) .'">';
    }

    $output .= '<img src="' . esc_attr( $image[0] ) . '" alt="' . esc_attr( $image_alt ) . '"/>';

    if ( $a['link'] ) {
        $output .= '</a>';
    }
    $output .= '</div><!-- locationSquare -->';

    return $output;
}
add_shortcode( 'hpLocationSquare', 'hplocationsfn' );

Il peut être un peu pénible pour les utilisateurs de trouver l'ID de pièce jointe. Voici donc une fonction qui ajoutera l'ID de pièce jointe à l'écran de superposition de support:

/**
 * Add custom field to media
 */
add_filter( 'attachment_fields_to_edit', 'wpse_attachment_fields_id', 10, 2 );
function wpse_attachment_fields_id( $fields, $post ) {

    $fields['attachment_id'] = [
            'label' =>  __( 'Attachment ID', 'text-domain' ),
            'input' => 'html',
            'value' => $post->ID,
            'html'  => "<input type='text' class='text attachment_idfield' readonly='readonly' name='attachments[{$post->ID}][attachment_id]' value='" . esc_attr( $post->ID ) . "' /><br />",
            'show_in_edit' => true,
    ];

    return $fields;         
}

Éditer: Obtenir l'ID de pièce jointe à partir de l'URL de l'image

Alternativement, nous pouvons obtenir l'ID de pièce jointe à partir de l'URL de l'image à l'aide de attachment_url_to_postid() .

Exemple d'utilisation:

[hpLocationSquare2 locationimage='http://domain.com/wp-content/uploads/2017/02/my-image.jpg' link='http://example.com/2/']
function hplocationsfn2( $atts ) {
    // Set up shortcode attrubutes.
    // User provided values are stored in $atts.
    // Default valued are passed to shortcode_atts below.
    // Merged valued are stored in the $a array.
    $a = shortcode_atts( [
                'locationimage' => false,
                'link'          => false,
    ], $atts );

    // Bail if we don't have an image.
    if ( ! $a['locationimage'] ) {
        return;
    }

    $image_id = attachment_url_to_postid( $a['locationimage'] );
    if ( ! $image_id ) {
        return;
    }

    // Get the image and the image's alt value.
    $image_alt = get_post_meta( $image_id, '_wp_attachment_image_alt', true );

    // Generate the output.
    $output = '<div class="locationSquare">';
    if ( $a['link'] ) {
        $output .= '<a href="' . esc_attr( $a['link'] ) .'">';
    }

    $output .= '<img src="' . esc_attr( $a['locationimage'] ) . '" alt="' . esc_attr( $image_alt ) . '"/>';

    if ( $a['link'] ) {
        $output .= '</a>';
    }
    $output .= '</div><!-- locationSquare -->';

    return $output;
}
add_shortcode( 'hpLocationSquare2', 'hplocationsfn2' );
2
Dave Romsey