web-dev-qa-db-fra.com

Balises HTML dans la légende de l'image Wordpress

Je développe un site Web client avec Wordpress (3.3), mais j'ai constaté que la fonction de légende d'image supprime les balises HTML.

La légende obtenue est du texte brut, ce qui rend difficile l’attribution de crédits d’image. Également en tant que site Web client, une édition WYSIWYG est requise.

Par exemple si mon shortcode est:

[caption caption="This is my <em>example</em> caption"]
<a href="http://example.com/image.jpg">
<img src="http://example.com/image-300x224.jpg" alt=""/>
</a>
[/caption]

Les balises sont supprimées de l'attribut caption comme suit:

[caption caption="This is my example caption"]
<a href="http://example.com/image.jpg">
<img src="http://example.com/image-300x224.jpg" alt=""/>
</a>
[/caption]

Les balises que je préfère préserver sont <em>, <sup>, <sub>, <span> et <a>.

Je n'ai trouvé aucun plugin existant pour résoudre ce problème, à l'exception des liens.

Des idées sur la façon de s'y prendre et sur les fonctions à remplacer?

1
mnorrish

Je suis heureux de pouvoir ajouter un meilleur support dans la version 3.4, mais pour l’instant, j’ai résolu le problème en modifiant le comportement de l’insertion d’image afin qu’elle n’utilise pas le shortcode [caption].

Voici ce que j'ai ajouté à functions.php:

add_filter( 'disable_captions', create_function('$a', 'return true;') );

function image_send_to_editor_2($html, $id, $caption, $title, $align, $url, $size, $alt) {
    if ( !$caption ) {
        return $html;
    } else {
        $width = 'auto';
        if ( preg_match( '/width="([0-9]+)/', $html, $matches ) ) {
            $width = $matches[1] . 'px';
        }

        $output = '<div id="attachment-' . $id . '" class="wp-caption align' . $align . '" style="width: ' . $width . ';">';
        $output .= $html;
        $output .= '<p class="wp-caption-text">' . $caption . '</p>';
        $output .= '</div>';

        return $output;
    }

}

add_filter('image_send_to_editor', 'image_send_to_editor_2', 10, 8);

Cela fonctionne mieux avec le plugin TinyMCE Advanced avec son option permettant d’arrêter de supprimer (et d’ajouter) les balises <p> et <br />.

3
mnorrish

Ok, ton problème semble intéressant.

Une chose à laquelle je pourrais penser est:

[caption caption="caption1"]
<a href="http://example.com/image.jpg">
<img src="http://example.com/image-300x224.jpg" alt=""/>
</a>
[/caption]

Stockez un champ méta personnalisé pour le message avec le nom 'caption1' et votre légende HTML. Utilisez un filtre sur the_content() pour convertir tous caption1 en votre légende HTML en le tirant de postmeta.

0
Sterex

Tout d’abord, vous pouvez mettre des éléments dans des légendes comme celle-ci:

[caption ...]
  <a ...> ... </a>
  Your caption text
[/caption]

Cela fonctionne avec la plupart des formats HTML. Il échoue (iirc) pour les liens et il se peut également que la légende ne soit pas placée exactement comme vous l’aimez.

J'ai observé que les choses produites par les codes courts dans les légendes sont pas assainies, cependant. Par conséquent, ma solution de contournement utilise l'excellent et toujours utile plugin Shortcode Exec PHP et crée un shortcode captiontext avec ce PHP:

return '<div style="text-align: center; margin: 5px 0px -20px 0px;">'.do_shortcode($content).'</div>';

Ajustez les informations de style à votre guise, évidemment. Maintenant, vous pouvez l'utiliser comme ça

[caption ...]
  <a ...> ... </a>
  [captiontext]Your caption text[/captiontext]
[/caption]

et vous pouvez utiliser tout le code HTML que vous voulez.

Modifier: Avantages de cette solution: Elle est (relativement) stable contre les modifications futures de Wordpress et de vos goûts. Tant que les codes abrégés sont gérés comme ils le sont maintenant, vous pouvez ajuster votre définition de code abrégé pour compenser les modifications de tous les articles jamais écrits sans avoir à les toucher. De plus, la solution de contournement est bien intégrée au flux naturel de Wordpress; en particulier, vous pouvez utiliser d'autres codes abrégés dans votre légende. Dernier point mais non le moindre, vous ne devez toucher aucun thème ou fichier principal pour la solution de contournement, mais utilisez plutôt un plugin mature.

0
Raphael