ChatGPT pour adapter un plugin WordPress

ChatGPT pour adapter un plugin WordPress

Waouw, je suis impressionné ! J’avais déjà lu qu’il était assez facile de pouvoir s’aider de ChatGPT pour créer du code informatique, en autre dans WordPress. Même si j’utilise le CMS depuis plus de 10 ans et bien que j’ai déjà eu régulièrement à mettre les mains dans le cambouis. Je n’ai pas suivi l’évolution des commandes et fonctions et je serais bien incapable de créer un plugin par moi même.

Depuis de longues semaines, je traque tout ce qui pourrait ralentir mon blog, blog qui par ailleurs souffre également des récentes nouvelles pénalisations mise en place par Google… Et oui, il devient difficile de rester « visible » !!

J’avais donc repéré que mon plugin « Related Posts » qui a presque 10 ans était loin d’être optimisé, que ce soit du coté code que du côté visuel. Récemment, j’ai vu qu’il affichait en réalité beaucoup de contenus hors de la base de données, plus de 50 éléments pour en afficher 6. Je me suis donc relancer à lui trouver un remplaçant, et « Related Post« , sans le « s » s’est donc montré capable de proposer une alternative assez similaire,..  Cependant, assez vite je me suis confronté à 3 éléments problématiques qui ne semblent pas modifiables dans les options.

  1. Affichage des vignettes « Related Post » pour chacun des articles sur la homepage
  2. Pas de vignette pour les vieux articles
  3. Des contenus proposés pas vraiment pertinents

Si bien évidemment, le 3° point reste à l’heure actuelle non résolu et n’offre donc pas une solution de repli parfaite. Je suis néanmoins content et surpris d’avoir pu résoudre les deux premiers éléments en discutant avec ChatGPT !


Supprimer les vignettes « Related Post » sur la homepage

Il semble que dans une ancienne version du plugin, des options aient permis de faire un choix plus précis de l’affichage ou non des contenus proposés par le plugin Related Post. Néanmoins, la solution proposée par les développeurs ciblent maintenant activer ou non l’extrait du post sur la home page. Dans mon thème, c’est en réalité une fonction qui coupe le contenu lorsqu’il voit le « Read More« , ce qui imposait alors d’afficher les 3 articles en lien de chacun des posts affichés sur ma home page

Je me suis dit que si je pouvais trouver dans le code du plugin un endroit où mettre une condition qui vérifierait le statut d’affilage « is single« , cela pourrait aider. A ChatGPT de me corriger :

Pour limiter l’exécution du code WordPress uniquement lorsque la vue est en mode « article seul » (single), vous pouvez utiliser la fonction is_singular('post') pour vérifier si la page actuelle correspond à un article individuel.

Pour limiter l'exécution du code WordPress uniquement lorsque la vue est en mode "article seul" (single), vous pouvez utiliser la fonction is_singular('post') pour vérifier si la page actuelle correspond à un article individuel.
Pour limiter l’exécution du code WordPress uniquement lorsque la vue est en mode « article seul » (single), vous pouvez utiliser la fonction is_singular(‘post’) pour vérifier si la page actuelle correspond à un article individuel.

J’ai donc adapté le fichier related-post/templates/related-post-hook.php pour y ajouter les deux conditions ciblées et mon problème était corrigé !

<?php
if (!defined(‘ABSPATH’)) exit; // if direct access

add_action(‘related_post_main’, ‘related_post_main_title’);
function related_post_main_title($atts)
{
if (!is_singular(‘post’)) {
return; // Quitte la fonction si la vue n’est pas en mode « article seul »
}

$settings = isset($atts[‘settings’]) ? $atts[‘settings’] : array();
$post_type = isset($atts[‘post_type’]) ? $atts[‘post_type’] : ‘post’;
$post_type_settings = $settings[‘post_types_display’][$post_type];
$headline_text = !empty($settings[‘headline_text’]) ? $settings[‘headline_text’] :  »;
$headline_text = !empty($post_type_settings[‘headline_text’]) ? $post_type_settings[‘headline_text’] : $headline_text;
$headline_text = isset($atts[‘headline’]) ? $atts[‘headline’] : $headline_text;

if (!empty($headline_text)) :
?>
<div class= »headline »><?php echo $headline_text; ?></div>
<?php
endif;
}

add_action(‘related_post_main’, ‘related_post_main_post_loop’);
function related_post_main_post_loop($atts)
{
if (!is_singular(‘post’)) {
return; // Quitte la fonction si la vue n’est pas en mode « article seul »
}

// Reste du code…
// …
}


Récupérer un autre image que celle liée à un article pour créer une vignette.

Depuis de longues années déjà, il est possible de liée une image mise en avant à un article. C’est évidemment celle-ci que le code de l’extension Related Post va utiliser pour illustrer la vignette qu’il va afficher pour inviter les internautes à lire les articles connexes.

Dans la mesure où mon blog tourne depuis 2007, un grand nombre d’articles ne disposent pas d’image mise en avant. Le précédent plugin ne s’en formalisait pas, il récupérait alors la première image rencontrée dans le contenu de l’article. Dans le cas de Related Post, je n’ai la possibilité que d’utiliser une image de remplacement, similaire à tous les articles.

En cherchant sur le forum, j’ai trouvé un autre utilisateur qui cherchait une solution à ce problème, et celle proposée se montre très « rustine », en faisant une modification non pas dans le plugin, mais dans le thème du site. D’autant que cette rustine impose alors d’utiliser la première image trouvée dans le contenu de l’article comme image mise en avant pour tous les articles, y compris ceux qui avaient déjà une image mise en avant.

J’ai donc demandé à ChatGTP de retrouver l’endroit dans le code du plugin l’endroit où est récupéré l’image mise en avant et de créer une condition qui permettrait, sur base du code proposé dans le forum, de pouvoir utiliser la première image rencontrée dans le contenu de l’article pour être utilisée comme vignette lors de l’affichage de l’article proposé.

Là encore, c’est une réussite !

Maintenant, si aucun post thumbnail n'est disponible, la fonction récupérera la première image du contenu du post en utilisant une expression régulière pour extraire l'URL de l'image. Si une image est trouvée, elle sera utilisée comme image à afficher. Sinon, l'image par défaut sera utilisée.
Maintenant, si aucun post thumbnail n’est disponible, la fonction récupérera la première image du contenu du post en utilisant une expression régulière pour extraire l’URL de l’image. Si une image est trouvée, elle sera utilisée comme image à afficher. Sinon, l’image par défaut sera utilisée.

add_action(‘related_post_loop_item_element_post_thumb’, ‘related_post_loop_item_element_post_thumb’, 10, 2);

function related_post_loop_item_element_post_thumb($loop_post_id, $elementData)
{
$settings = isset($elementData[‘settings’]) ? $elementData[‘settings’] : array();
$elements = isset($settings[‘elements’]) ? $settings[‘elements’] : array();
$post_thumb = isset($elements[‘post_thumb’]) ? $elements[‘post_thumb’] : array();
$default_img = isset($post_thumb[‘default_img’]) ? $post_thumb[‘default_img’] :  »;

$thumb_size = isset($elementData[‘thumb_size’]) ? $elementData[‘thumb_size’] : ‘full’;

$post_thumbnail_id = get_post_thumbnail_id($loop_post_id);
$post_thumb = wp_get_attachment_image_src($post_thumbnail_id, $thumb_size);
$thumb_url = isset($post_thumb[‘0’]) ? $post_thumb[‘0’] :  »;

// If no post thumbnail, get the first image from post content
if (empty($thumb_url)) {
$post = get_post($loop_post_id);
$post_content = $post->post_content;
$first_img =  »;

ob_start();
ob_end_clean();
$output = preg_match_all(‘/<img.+src=[\' »]([^\' »]+)[\' »].*>/i’, $post_content, $matches);

if (!empty($matches[1][0])) {
$first_img = isset($matches[1][0]) ? $matches[1][0] :  »;
}

if (!empty($first_img)) {
$thumb_url = $first_img;
}
}

$post_link = get_permalink($loop_post_id);
$post_title = get_the_title($loop_post_id);

$enable_stats = isset($settings[‘enable_stats’]) ? $settings[‘enable_stats’] : ‘disable’;
$post_link = ($enable_stats == ‘enable’) ? $post_link . ‘?related_post_from=’ . $loop_post_id : $post_link;

?>
<div class= »thumb post_thumb »>
<a <?php echo apply_filters(‘related_post_element_link_attrs’,  », $elementData); ?> title= »<?php echo esc_attr($post_title); ?> » href= »<?php echo esc_url_raw($post_link); ?> »>
<?php
if (!empty($thumb_url)) :
?>
<img src= »<?php echo esc_url_raw($thumb_url); ?> » title= »<?php echo esc_attr($post_title); ?> » alt= »<?php echo esc_attr($post_title); ?> »>
<?php
else :
?>
<img src= »<?php echo esc_url_raw($default_img); ?> » title= »<?php echo esc_attr($post_title); ?> » alt= »<?php echo esc_attr($post_title); ?> »>
<?php
endif;
?>
</a>
</div>
<?php
}


Il me reste maintenant à chercher à comprendre comment le plugin analyse et trie les différentes articles. Avec plus de 2000 contenus et étiquettes (tags), il est probable que mon blog soit loin de ce que les développeurs avaient comme base de données pour réfléchir à cela…

Vous aimerez aussi
ChatGTP fait la Une
ChatGTP fait la Une

Difficile d'être passé à coté de l'info : ces dernières semaines ChatGPT s'est emparé de la Une des journaux. D'abord (Lire la suite)

Petit Bug avec PHP8 et WordPress 6.1.1
Petit Bug avec PHP8 et WordPress 6.1.1

La semaine dernière, j'ai constaté un petit problème sur l'un de nos site web tournant sous WordPress 6.1.1 Lorsque je (Lire la suite)

Faire un WordPress Roll-back
Faire un WordPress Roll-back

Et bien, en plus de 15 ans de WordPress, je pense que je ne m'étais jamais retrouvé dans une situation (Lire la suite)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.