Comment créer un extrait d'un article sans extrait et le limiter par nombre de caractères • WPShout

By | novembre 3, 2020

Formation WordPress

Les articles WordPress sont associés à deux types de textes: le contenu de l'article et son extrait. Le contenu est la partie principale de l'article, et l'extrait est soit rempli dans son propre champ, soit généré par WordPress en extrayant la première partie du contenu.

Dans cet article, nous nous concentrerons sur ce qui se passe si l'extrait de l'article est vide et sur la façon dont nous pouvons contrôler la longueur de l'extrait généré. Cependant, il est toujours préférable de remplir l’extrait avec vos propres mots et d’obtenir ainsi le meilleur contrôle sur ce champ. Comment ajouter un extrait dans un article WordPress est décrit dans l'article WPShout:

Comment définir un extrait de message personnalisé dans WordPress

Le cas de l'exigence d'un extrait de longueur de caractère fixe

Les pages d'accueil de nombreux sites affichent une liste de publications contenant uniquement des extraits de publications. Parfois, la conception de cette liste est celle d’une grille, où chaque publication est un bloc dans une ligne. Dans ces cas, l'espace alloué à chaque article est très spécifique – avec une largeur et une hauteur spécifiques – de sorte que la longueur de chaque extrait doit être la même afin que tous les blocs soient parfaitement alignés par ligne et colonne.

WordPress a une bonne fonction appelée the_excerpt () qui affiche l'extrait d'un article. Cela fonctionne intelligemment: il vérifie d'abord s'il y a un extrait et sinon, il extrait les premiers mots du contenu. Par défaut, il faut 55 mots, mais il est possible de changer ce nombre en utilisant un filtre, le extrait_longueur filter, que vous pouvez approfondir dans cet article de WPShout.

Changer la longueur de l'extrait de WordPress: apprendre grâce à la spéléologie

Théoriquement, nous pourrions utiliser le the_excerpt () fonction dans notre cas où nous voulons limiter la longueur de l'extrait. Cependant, après une inspection plus approfondie, cela ne nous a pas suffi. Les mots sont une unité de mesure très inexacte – les mots sont de longueur variable, et nous avons besoin de quelque chose de plus précis: des lettres ou, comme nous les appelons en programmation: des caractères. Donc, cet article décrit une fonction qui prend le contenu (et non l'extrait) et en extrait le nombre souhaité de caractères.

Cet article passera en revue toutes les parties de cette fonction et expliquera tous les éléments qui doivent être pris en considération dans une fonction comme celle-ci. L'extraction de caractères ne consiste pas uniquement à compter les lettres. Le message peut contenir d'autres éléments: des balises HTML enveloppant les mots, les images, les codes courts, les blocs. En outre, le comptage des caractères doit être pris en compte pour les caractères qui sont au-delà du code ASCII et s'étendent à UTF-8. Toutes ces questions seront discutées maintenant.

Tags de bande

La première chose que nous souhaitons est de supprimer toutes les balises HTML. Cela supprimera également le img tag et les balises de commentaire qui enveloppent les blocs Gutenberg. Par conséquent, la première commande de la fonction doit être $ content = strip_tags ($ content);.

Supprimer les codes courts

Il ne nous reste plus de balises HTML, mais nous avons toujours du contenu que nous ne voulons pas afficher dans l'extrait: les codes courts. Étant donné que l'extrait est uniquement destiné à afficher du texte, nous ne les voulons pas dans notre contenu car ils n'ont aucun sens lorsqu'ils ne sont pas analysés. Heureusement, nous n'avons pas besoin d'écrire notre propre analyseur – WordPress a une fonction qui fait exactement cela: strip_shortcodes ().

Supprimer les nouvelles lignes et les espaces

Après avoir supprimé les balises, nous pourrions nous retrouver avec des espaces et des retours à la ligne redondants, ce que nous ne voulons pas car nous voulons que l'extrait soit un paragraphe de texte continu. Par conséquent, nous utiliserons une expression régulière pour rechercher et remplacer tous les onglets, espaces, retours à la ligne, etc. par un seul espace.

str contre mb_str

Il ne nous reste plus que le texte, et il nous reste 2 choses à faire: extraire le nombre de caractères demandé et s'assurer que les mots ne sont pas coupés au milieu.

Compter les lettres, comment cela peut-il être difficile? En utilisant le strpos () et substr () les fonctions devraient faire la tâche comme un morceau de gâteau. Je faisais cela dans un site qui utilisait une langue dont les lettres ne sont pas en code ASCII, et 2 choses se sont produites: je recevais beaucoup moins de lettres que le nombre que j'ai passé à la fonction, et parfois j'obtiens une lettre charabia à la fin de l'extrait. Suite au commentaire d'un collègue, j'ai appris que chaque str La fonction en PHP a un équivalent multi_byte dont le but est d'adresser tous les caractères UTF-8. Je n'avais pas réalisé que les caractères UTF-8 prenaient plus d'un octet, donc quand strpos () comptait des lettres, il comptait en fait des octets, mais dans le cas UTF-8, il y a moins de lettres que d'octets, et c'est la raison pour laquelle je recevais des chaînes plus courtes qui demandaient. C'était aussi la raison du caractère charabia à la fin de l'extrait: substr () compte également les octets, et si le nombre d’octets auquel il parvient arrive à le placer au milieu d’un caractère, ce caractère ne sera pas réel et s’affichera sous forme de charabia.
Par conséquent, la mb_strpos () devrait être utilisé à la place de strpos (), et mb_substr () les problèmes doivent être utilisés au lieu de substr ().

Laisser des mots entiers

L'étape suivante consiste à découper élégamment l'extrait afin qu'aucun mot ne soit coupé au milieu. Cela signifie bien sûr que le nombre de caractères passés en paramètre ne sera pas, selon toute vraisemblance, le nombre exact que nous extrairons, mais nous voulons rester aussi proches que possible de celui-ci et nous allons donc vérifier quels placards : couper avant ou après le dernier mot dans lequel nous sommes en train de se trouver.

Nous utilisons mb_strrpos nous trouvons le dernier espace avant la limite de caractères, et mb_strpos pour trouver l'espace suivant après la limite de caractères. Nous éloignons ensuite ces espaces de la limite de caractères et renvoyons l'extrait jusqu'à l'espace le plus proche.

La fonction entière

/ **
* Obtenez une partie limitée du contenu - sans balises html et shortcodes -
* selon le montant écrit en limite de $. Assurez-vous que les mots ne sont pas coupés au milieu
* @param int $ limit - nombre de caractères
* @return string - le contenu raccourci
* /
function wpshout_the_short_content ($ limit) 
   $ content = get_the_content ();
   / * parfois il y a 

les balises qui séparent les mots, et lorsque les balises sont supprimées, * Les mots des paragraphes adjacents restent ensemble. * alors remplacez la fin

balises avec espace, pour garantir que les mots ne collent pas * / $ content = strip_tags ($ content); $ content = strip_shortcodes ($ content); $ content = trim (preg_replace ('/ s + /', '', $ content)); $ ret = $ contenu; / * si la limite est supérieure à la longueur, cela sera retourné * / if (mb_strlen ($ content)> = $ limite) $ ret = mb_substr ($ contenu, 0, $ limite); // veillez à ne pas couper les mots au milieu: // 1. vérifiez d'abord si la sous-chaîne se termine déjà par un espace if (mb_substr ($ ret, -1)! == '') // 2. Si ce n'est pas le cas, recherchez le dernier espace avant la fin de la chaîne $ space_pos_in_substr = mb_strrpos ($ ret, ''); // 3. puis recherchez l'espace suivant après la fin de la chaîne (en utilisant la chaîne d'origine) $ space_pos_in_content = mb_strpos ($ content, '', $ limit); // 4. comparez maintenant la distance de chaque position spatiale à la limite if ($ space_pos_in_content! = false && $ space_pos_in_content - $ limit <= $ limit - $ space_pos_in_substr) / * si l'espace le plus proche est dans la chaîne d'origine, prenez la sous-chaîne à partir de là * / $ ret = mb_substr ($ content, 0, $ space_pos_in_content); autre // sinon prend la sous-chaîne de la chaîne d'origine, mais avec la position précédente (espace) $ ret = mb_substr ($ content, 0, $ space_pos_in_substr); retourne $ ret. '...';

Mettre à jour le message avec l'extrait généré

Si nous ne voulons pas que le code doive générer l'extrait à chaque fois que nous affichons l'article, nous pourrions mettre à jour l'extrait de l'article dans la base de données afin que la prochaine fois has_excerpt () s'exécute sur ce poste particulier, il retournera un résultat positif et notre fonction récupérera simplement l'extrait sans tous les calculs.

En utilisant le faire avec le wp_update_post () , nous remplirons son champ d’ID de publication et le champ d’extrait, et à la fin du wpshout_the_short_content () fonction que nous appellerons une petite fonction de mise à jour:





function wpshout_update_post_excerpt ($ new_excerpt) 
$ post = tableau (
'ID' => get_the_ID (),
'post_excerpt' => $ new_excerpt,
);
wp_update_post ($ post);

Comment appeler la fonction

La meilleure façon d'appeler cette fonction est de l'accrocher à un filtre. Dans l'article de WPShout Comment personnaliser vos extraits d'articles WordPress, nous apprenons, entre autres, sur le wp_trim_excerpt filtre:
"Le fonction wp_trim_excerpt () est la fonction principale qui génère en fait un extrait du contenu de l'article WordPress (en le raccourcissant à 55 mots et en ajoutant "[…]”). Avant de terminer, il appelle le wp_trim_excerpt filtre pour vous permettre de filtrer les résultats. Nous utilisons le wp_trim_excerpt filtre pour générer et revenir revenir sur notre propre comportement extrait.

function wpshout_excerpt ($ text) 
if (is_admin ()) 
return $ text;

if (! has_excerpt ()) 
$ text = wpshout_the_short_content (200);

wpshout_update_post_excerpt ($ texte);
return $ text;


add_filter ('wp_trim_excerpt', 'wpshout_excerpt');

Conclusion

Cet article nous a appris comment générer et mettre à jour par programme un extrait de message de manière à limiter les caractères de l'extrait et sans couper les mots au milieu.