Je développe mon thème personnalisé et j'essaie de comprendre comment modifier le code par défaut pour une image WordPress insérée dans le contenu du message afin de pouvoir ajouter un support pour le format webP et de l'insérer dans l'élément <picture>
.
Je génère des images .webp
à l'aide de la bibliothèque cwebp
sur mon serveur et de PHP exec()
lors du téléchargement d'une image sur le support dans WordPress Admin.
Le code est:
function my_image_webp($meta, $id){
if(!isset($meta['sizes'])) {
return $meta['full'];
}
$upload_path = wp_upload_dir();
$path = $upload_path['basedir'];
// media upload direktorij
if(isset($path)){
$file = trailingslashit($upload_path['basedir'].'/').$meta['file'];
}else{
$file = trailingslashit($upload_path['path']).$meta['file'];
}
list($orig_type) = @getimagesize($file);
switch ($orig_type) {
case IMAGETYPE_PNG:
$png_image = preg_replace('/\\.[^.\\s]{3,4}$/', '', $file);
exec("cwebp ".$file." -o ".$png_image.".webp");
break;
case IMAGETYPE_JPEG:
$jpg_image = preg_replace('/\\.[^.\\s]{3,4}$/', '', $file);
exec("cwebp ".$file." -o ".$jpg_image.".webp");
break;
}
// return
wp_update_attachment_metadata($id, $meta);
return $meta;
}
}
add_filter('wp_generate_attachment_metadata','my_image_webp', 10, 2);
Actuellement, le contenu de mon message contient l'élément <img>
qui permet d'afficher la vignette dans la balise <p>
, mais la balise <img>
est un lien <a>
qui pointe vers l'image en taille réelle.
Actuellement, j'ai cette image en taille réelle dans le contenu du message:
<p>
<a href="http://www.example.com/wp-content/uploads/2018/11/image-full.jpg" itemprop="url" title="Some title">
<img alt="Alt tag of the image" class="alignnone size-full" src="http://www.example.com/wp-content/uploads/2018/11/image-thumb.jpg" width="940" height="529">
</a>
</p>
J'essaie de le modifier pour obtenir cela comme résultat:
<p>
<a href="http://www.example.com/wp-content/uploads/2018/11/image-full.jpg" itemprop="url" title="Some title">
<picture>
<source srcset="http://www.example.com/wp-content/uploads/2018/11/image-thumb.webp" type="image/webp" />
<img alt="Alt tag of the image" class="alignnone size-full" src="http://www.example.com/wp-content/uploads/2018/11/image-thumb.jpg" width="940" height="529">
</picture>
</a>
</p>
J'ai une ou plusieurs images insérées comme ceci. Donc, aurait besoin de vérifier le contenu de la publication et de le modifier/remplacer?
Devrais-je utiliser une fonction preg_replace () ou WordPress image_send_to_editor ()?
Peut-être en utilisant un filtre?
Avez-vous des idées pour le changer?
J'ai trouvé des solutions pour l'élément <figure>
, mais je ne parviens pas à le faire fonctionner avec <picture>
.
Vous devez parcourir toutes les images à l'intérieur de $post
the_content()
à l'aide de foreach()
.
Ce qui nous donne, regex
pour la correspondance de groupe de la balise <img>
. Mettez toutes les images dans array()
.
Commencez à compter à partir de -1
puisque 0
a déjà la 1ère image dans array()
.
Parcourez array()
avec des images, recherchez une image avec "size-full"
avec une correspondance de groupe 3
, si oui, obtenez la valeur src
avec la correspondance de groupe 7
.
Ensuite, remplacez src="value"
extenstion - .png, .jpg ..., affectez la chaîne remplacée à la nouvelle variable. Utilisez la nouvelle variable et ajoutez l’extension ".webp"
à la.
Remplacez les balises <img>
existantes par l'élément <picture>
et appelez la fonction sur $content
.
function webp_picture_fix($content){
global $post;
preg_match_all("/<img(.*?)class=('|\")(.*?)('|\")(.*?)src=('|\")(.*?)('|\")(.*?)>/i", $content, $images);
if(!is_null($images)){
$i = -1;
foreach ($images as $key) {
$i++;
//echo $key[$i];
if(strpos($images[3][$i], 'size-full') !== false){
//echo "hi";
$slika_ekstenzija = $images[7][$i];
$sewebp = preg_replace('/\\.[^.\\s]{3,4}$/', '', $slika_ekstenzija);
$webp_slika_src = $sewebp.".webp";
$replacement = '<picture><source srcset="'.$webp_slika_src.'" type="image/webp" /><img'.$images[1][$i].'class='.$images[2][$i].$images[3][$i].$images[4][$i].$images[5][$i].'src='.$images[6][$i].$images[7][$i].$images[8][$i].$images[9][$i].'></picture>';
$content = str_replace($images[0][$i], $replacement, $content);
}
}
}
return $content;
}
add_filter('the_content', 'webp_picture_fix', 9999);