web-dev-qa-db-fra.com

Interdire la balise img dans les commentaires?

Je cherchais depuis longtemps un moyen d'empêcher les gens de publier des images externes dans les commentaires i e

<img alt="my photo" src="http://example.co.uk/pic.jpg" />

et l'image est affichée, sans la permission du propriétaire. C’est codé en dur quelque part dans le noyau mais je ne trouve pas le moyen de supprimer ce comportement. Merci!

1
psot

Vous pouvez facilement effacer les images affichées.

add_filter(
  'comment_text',
  function($comment) {
    $allowed_html = array(
        'a' => array(
        'href' => array(),
        'title' => array()
      ),
      'br' => array(),
      'em' => array(),
      'strong' => array()
    );
    return  wp_kses($comment, $allowed_html);
  }
);

Cela supprimera toutes les balises non répertoriées dans le tableau fourni. Pour effacer spécifiquement les images avec des liens vers des sources externes, vous avez besoin de quelque chose de plus compliqué.

function strip_external_images($match) {
  if (empty($match)) return;
  $site = parse_url(get_site_url());
  $parsed = parse_url($match[1]);
  if (empty($parsed['Host']) || $site['Host'] !== $parsed['Host']) {
    return '';
  } else {
    return $match[0];
  }
}

add_filter(
  'comment_text',
  function($comment) {
    $pattern = '|<img.*src="([^"]*)"[^>]+>|';
    return preg_replace_callback($pattern,'strip_external_images',$comment);
  }
);

Cela devrait permettre aux utilisateurs d'ajouter des images aux commentaires, mais uniquement aux images hébergées dans le même domaine que le site lui-même.

1
s_ha_dum

J'ai ajouté iframe à votre première fonction pour autoriser l'intégration de sites tels que YouTube et Instagram. Je pense que c'est un moyen sûr? Cela fonctionne comme prévu maintenant. Je ne suis pas sûr de ce que votre deuxième fonction accomplit, le résultat final est identique avec ou sans elle. Peut-être que je n'étais pas assez clair sur ce que je voulais accomplir dans ma question initiale? Merci beaucoup. Je vais accepter votre réponse.

add_filter(
'comment_text',
function($comment) {
$allowed_html = array(
    'a' => array(
        'href' => array(),
        'title' => array()
        ),
    'br' => array(),
    'em' => array(),
    'strong' => array(),
    'iframe' => array(
        'src' => array(),
        'height' => array(),
        'width' => array()
        ),
);
return  wp_kses($comment, $allowed_html);
}
); 
0
psot