web-dev-qa-db-fra.com

Comment changer la description de la même image qui se trouve dans plusieurs instances?

Nous avons le site de http://asceticexperience.com/

N'hésitez pas à creuser le site afin de comprendre notre question ci-dessous.

Bien sûr, tout commentaire apprécié :-) mais ma question principale est la suivante:

Nous avons une photo plusieurs fois sur le site (blog, portfolio et diaporamas à partir des menus Body, Mind, Heart).

La description des photos provient du champ "Description" de la Galerie multimédia. (Comme vous le savez, le champ est rempli à partir de EXIF ​​de photo).

Parce que chaque fois que je joint une photo à une page/une publication, WordPress copie la photo, nous avons besoin d'un plugin/solution/que ce soit nous permettant de changer simultanément la description de toutes les instances de la. myPhoto.jpg.

Maintenant, lorsque nous voulons changer/mettre à jour une légende, nous devons accéder à toutes les instances et les éditer manuellement.

Est-ce que quelqu'un connaît une solution à ce problème?

1
John Thomas

Idée de plugin n ° 1

Lorsque nous insérons une image dans l’éditeur, le plugin modifie automatiquement le libellé et le alt attribut à:

[caption id="attachment_729" align="alignnone" width="300"]
  <a href="http://example.tld/wp-content/uploads/2015/02/wordpress.jpg">
      <img src="http://example.tld/wp-content/uploads/2015/02/wordpress-300x284.jpg" 
          alt="###ALT###" 
          width="300" 
          height="284" 
          class="size-medium wp-image-729" />
  </a> 
  ###CAPTION###
[/caption]

Ensuite, au début, la légende de l'image est extraite pour la pièce jointe correspondante, en fonction de la chaîne attachment_729 et remplace les valeurs factices ###ALT### et ###CAPTION###.

Ainsi, lorsque nous souhaitons modifier les sous-titres de toutes les copies d’image, il suffit de le faire une fois dans Media Manager.

Voici notre plugin d'image dynamique qui devrait supporter cette fonctionnalité (PHP 5.4+):

<?php
/**
 * Plugin Name:   Dynamic Image Caption #1
 * Description:   We only want to modify the image captions in the Media Manager 
 * Plugin URI:    http://wordpress.stackexchange.com/a/179689/26350
 * Plugin Author: Birgir Erlendsson (birgire)
 * Version:       0.0.1
 */

namespace birgire\wpse;

add_action( 'init', function()
{
    $o = new DynamicImageCaption;
    $o->activate();
});

class DynamicImageCaption
{
    private $caption_dummy = '###CAPTION###';
    private $alt_dummy     = '###ALT###';

    public function activate()
    {
        add_shortcode( 
            'caption', 
             [ $this, 'caption_shortcode' ] 
        );

        add_filter( 
            'image_add_caption_text', 
            [ $this, 'add_caption_text' ], 
            10, 
            2 
        );

        add_filter( 
            'image_send_to_editor',  
            [ $this, 'send_to_editor' ],
            10, 
            8 
        );
    }

    public function caption_shortcode( $attr = [], $content = '' )
    {
        if( isset( $attr['id'] ) 
            && ( 
                false !== strpos( $content, $this->caption_dummy ) 
                ||
                false !== strpos( $content, $this->alt_dummy ) 
           )
        )
        {
            $caption = $this->get_caption( 
                $attr['id'], 
                str_replace( 'attachment_', '', $attr['id'] ) 
            );

            $content = str_replace(
                [ $this->caption_dummy, $this->alt_dummy ],
                [ $caption, esc_attr( $caption ) ],
                $content
            );
        }
        return img_caption_shortcode( $attr, $content );
    }

    private function get_caption( $caption, $id )
    {
        $caption = '';

        $attachments = get_posts( 
            [ 
                'p'           =>  $id, 
                'post_type'   => 'attachment', 
                'post_status' => 'inherit' 
            ] 
        );

        if( isset( $attachments[0] ) 
            && $attachments[0] instanceof \WP_Post  
        )
            $caption =  $attachments[0]->post_excerpt;

        return $caption;
    }

    public function send_to_editor( $html, $id, $caption, $title, $align, $url, $size, $alt )
    {
        if( $alt )
        {
            $html = str_replace(
                'alt="' . esc_attr( $alt ),
                'alt="' . $this->alt_dummy,
                $html
            );
        }
        return $html;
    }

} // end class

Copiez ceci dans le fichier:

/wp-content/plugins/dynamic-image-caption/dynamic-image-caption.php

et activer le plugin.

Notez que j'utilise ici la légende également comme attribut alt pour plus de commodité. . Vous devriez le tester plus avant et le modifier selon vos besoins.

Ps: Ma première idée a été d'ajouter des shortcodes supplémentaires dans le shortcode [caption], comme ceci:

[dynamic_caption id="729"] 

et

[dynamic_alt id="729"] 

Cela fonctionne, mais je voulais trouver un autre moyen de ne récupérer qu'une seule fois la pièce jointe correspondante, sans utiliser ce type de code court.

Idée de plugin n ° 2

Voici une autre idée pour modifier les légendes d’image et les attributs alt existants. Ce plugin ne modifie pas le code dans l'éditeur de publication, comme le plugin précédent l'a fait, mais seulement sa sortie.

<?php
/**
 * Plugin Name:   Dynamic Image Caption And Alt #2
 * Description:   We only want to modify the image caption and alt in the Media Manager. 
 * Plugin URI:    http://wordpress.stackexchange.com/a/179689/26350
 * Plugin Author: Birgir Erlendsson (birgire)
 * Version:       0.0.1
 */

namespace birgire\wpse;

add_action( 'init', function()
{
    $o = new DynamicImageCaptionAlt;
    $o->activate();
});

class DynamicImageCaptionAlt
{
    public function activate()
    {
        add_shortcode( 
            'caption', 
             [ $this, 'caption_shortcode' ] 
        );
    }

    public function caption_shortcode( $attr = [], $content = '' )
    {
        if( isset( $attr['id'] ) )
        {
            $id = str_replace( 'attachment_', '', $attr['id'] );

            // Fetch the caption and the alt attribute:
            $caption = $this->get_caption( $id );
            $alt     = esc_attr( $this->get_alt( $id ) );

            // Use caption as alt, if alt is empty:
            if( ! $alt )
                $alt = esc_attr( $caption );

            // Modify the caption:
            $content .= '###END###';
            $content = str_replace( 
                strip_tags( $content ), 
                $caption, 
                $content 
            );

            // Modify the alt attribute:
            $content = preg_replace( 
                '#alt="[^"]*"#', 
                sprintf( 'alt="%s"', $alt ), 
                $content 
            );
        }
        return img_caption_shortcode( $attr, $content );
    }

    private function get_caption( $id )
    {
        global $wpdb;
        $sql = $wpdb->prepare( 
            "SELECT post_excerpt 
             FROM {$wpdb->posts} 
             WHERE ID = %d AND post_type = 'attachment' ", 
            $id 
        );
        return $wpdb->get_var( $sql );
    }

    private function get_alt( $id )
    {
       return get_post_meta( $id, '_wp_attachment_image_alt', true );
    }

} // end class

Notez que cela ajoutera des requêtes de base de données supplémentaires à votre site, comme prévu.

3
birgire

Je suppose que vous faites référence aux images qui ont été placées dans l'éditeur de contenu de publication de WordPress, n'est-ce pas?

Par exemple, vous avez cliqué sur "Ajouter un média", puis avez téléchargé une photo et l'avez insérée dans votre message. Ce qui est difficile à savoir, c’est de savoir si vous vous référez à une "Description" ou si vous voulez dire les champs "Texte alternatif", "Légende" ou "Titre". Je n'ai jamais vu le champ "Description" être rempli par défaut, qu'il s'agisse d'un fichier EXIF ​​ou autre, bien que le champ "Titre" soit automatiquement renseigné.

Quoi qu'il en soit, si vous faites référence à des images que vous avez placées directement dans le contenu de votre message, vous ne pouvez pas modifier facilement ces informations. Il s'agit d'un code HTML plus ou moins codé dans le message. La mise à jour des champs "Titre", "Légende", "Texte alternatif" ou "Description" dans l'éditeur de média ne le met pas à jour dans les éditeurs de contenu.

Cependant, quelques solutions s'offrent à vous.

Si vous pouvez vous connecter à PHPMyAdmin, vous pouvez effectuer une recherche globale et la remplacer. Comme pour tout ce qui touche "votre base de données", faites d'abord une sauvegarde!

  1. Dans PHPMyAdmin, sélectionnez la base de données avec laquelle vous souhaitez travailler dans la liste de gauche.
  2. Cliquez sur "SQL" dans la liste des onglets en haut.
  3. Entrez la requête suivante

    UPDATE `wp_posts` SET `post_content` = replace(`post_content`, 'this is your original description1234567890', 'this is the new one')

  4. Cliquez sur Go

Je viens de tester cela et je n'ai eu aucun problème avec mon site, mais pour de vrai, faites tout d'abord la sauvegarde.

Il y a aussi ce plugin, mais il ne fonctionnait pas très bien dans le passé: https://wordpress.org/plugins/search-and-replace/

1
Nathan