web-dev-qa-db-fra.com

Affichage de la description de l'image avec les liens incorporés ci-dessous les images postées

J'ai des images dans mes publications Wordpress avec la configuration de champ suivante:

Légende: Ce champ contient la légende de l'image à afficher sous l'image.

Description: Ce champ contient des crédits photo avec des liens vers des sources attribuées.

J'ai besoin que ces deux valeurs soient affichées juste en dessous de l'image, comme ceci:

enter image description here

En s'inspirant d'une excellente réponse de @toscho à cette question, j'ai essayé cette fonction:

add_shortcode('wp_caption', 'img_caption_add_description');
add_shortcode('caption', 'img_caption_add_description');
function img_caption_add_description($attr, $content = null)
{
    $post_id = str_replace('attachment_', '', $attr['id']);
    $img = get_post((int)$post_id);

    if (is_a($img, 'WP_Post')) {
        $attr['caption'] = $img->post_content;
    }

    return img_caption_shortcode($attr, $content);
}

Comme vous pouvez le voir sur la capture d'écran, la fonction fait bien son travail, sauf qu'elle supprime tous les liens hypertextes. J'en ai besoin! Est-il possible de modifier la fonction ci-dessus d'une manière qui respecte les liens? Dans l'exemple ci-dessus, par exemple, les textes "Amit Schandillia" et "CC BY-SA 3.0" doivent être des hyperliens. J'ai les liens bien dans mon champ Description comme ci-dessous:

Photo credit: <a href="" target="_blank" rel="nofollow">Amit Schandillia</a> licensed <a href="" target="_blank" rel="nofollow"><i class="fa fa-creative-commons"></i> BY-SA 3.0</a>

Comment puis-je m'assurer que les balises <a> restent en place lors du rendu sur la page de publication?

1
TheLearner

Lorsque vous regardez la dernière ligne img_caption_shortcode() , vous pouvez voir wp_kses() dépouillant les balises HTML non autorisées. La fonction wp_kses_hook() n’enveloppe qu’un filtre:

return apply_filters( 'pre_kses', $string, $allowed_html, $allowed_protocols );

qui permet de connecter et de modifier la sortie avant que wp_kses_split() supprime enfin la balise HTML en utilisant preg_replace_callback avec _wp_kses_split_callback() en tant que fonction pour supprimer les tags.

Comme dans _wp_kses_split_callback(), la fonction wp_kses_split2() est appelée, vous avez également une (mauvaise) alternative: modifier un global.

Vous avez les deux globales suivantes dans le rappel:

global $pass_allowed_html, $pass_allowed_protocols;

Cela signifie que vous pouvez également effectuer les opérations suivantes (non recommandé):

// Fetch the global context
global $pass_allowed_html;
// Save the global context for restoring it to not nuke other code
$temp = $pass_allowed_html;
// Alter the context
$GLOBALS['pass_allowed_html'] = [ /* your allowed HTML tags here */ ];
// Fetch the result
$result = img_caption_shortcode();
// Reset the global context
$GLOBALS['pass_allowed_html'] = $temp;
// Return your altered result
return $result;

Gardez à l'esprit que wp_kses_allowed_html() déclenchera alors son cas explicit.

Comme img_caption_shortcode() ne transmet que la string de la valeur post à wp_kses(), vous pouvez également tirer profit des lignes suivantes dans wp_kses_split2():

if ( ! is_array( $allowed_html ) )
    $allowed_html = wp_kses_allowed_html( $allowed_html );

En regardant à nouveau [wp_kses_allowed_html()]:

return apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );

vous pouvez simplement utiliser ce filtre. Assurez-vous que supprimez à nouveau le filtre après qu'il ne soit pas entré en conflit avec d'autres contenus et par conséquent permettant la balise ailleurs par accident.

1
kaiser