{"id":2925,"date":"2012-10-03T08:54:01","date_gmt":"2012-10-03T06:54:01","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=2925"},"modified":"2024-01-31T16:46:33","modified_gmt":"2024-01-31T15:46:33","slug":"wordpress-personnaliser-un-theme-avec-child-theme-enfant","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/wordpress-personnaliser-un-theme-avec-child-theme-enfant","title":{"rendered":"WordPress \u2013 Personnaliser un th\u00e8me ? Oui, avec un child theme"},"content":{"rendered":"<p>Les th\u00e8mes WordPress sont de plus en plus courus par tous : d\u00e9butants, blogueurs confirm\u00e9s ou professionnels du web. Il est possible d&rsquo;en obtenir gratuitement un peu partout sur la toile, pas toujours de bonne qualit\u00e9, pas toujours tr\u00e8s s\u00e9curis\u00e9s, comme il est possible d&rsquo;en obtenir de payants (je n&rsquo;ai pas dit qu&rsquo;ils \u00e9taient mieux). Dans tous les cas il est possible de les personnaliser.<!--more--><\/p>\n<h2>Plusieurs solutions<\/h2>\n<h3 lang=\"en\">Wild tweaking<\/h3>\n<p>La premi\u00e8re, la moins propre, consiste \u00e0 modifier directement les fichiers du th\u00e8me, am\u00e9liorer les portions de code des articles, des commentaires, ou simplement de l&rsquo;en-t\u00eate de votre document ou du fichier <code>functions.php<\/code> pour ajouter quelques morceaux de code trouv\u00e9s sur la toile.<br \/>\n<img decoding=\"async\" class=\"noborder alignleft size-full wp-image-3047\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/pot-de-peinture.png\" alt=\"\" width=\"150\" height=\"170\" \/>Soit. Mais sachez qu&rsquo;en faisant cela, il ne vous sera plus possible de mettre \u00e0 jour votre th\u00e8me. (en tout cas pas automatiquement)<\/p>\n<p>En effet, \u00e0 l&rsquo;instar des plugins, les th\u00e8mes sont versionn\u00e9s et peuvent subir des mises \u00e0 jour (am\u00e9lioration de fonctionnalit\u00e9, mise \u00e0 jour de s\u00e9curit\u00e9, etc.). S&rsquo;il vous prenait l&rsquo;envie de mettre \u00e0 jour un th\u00e8me modifi\u00e9 par vos soins, vos modifications seraient alors \u00e9cras\u00e9es.<\/p>\n<p>Cette solution de modification n&rsquo;est donc possible que si vous \u00eates s\u00fbr de la s\u00e9curit\u00e9 du th\u00e8me et uniquement si vous ne souhaitez pas effectuer de mise \u00e0 jour. Autant vous dire que ce n&rsquo;est donc pas la meilleure des solutions.<\/p>\n<h3 lang=\"en\">Child Theme<\/h3>\n<p>La seconde solution, de loin ma pr\u00e9f\u00e9r\u00e9e : cr\u00e9er un th\u00e8me enfant.<br \/>\nLa cr\u00e9ation d&rsquo;un th\u00e8me enfant n&rsquo;est pas tr\u00e8s complexe et permet de b\u00e9n\u00e9ficier du th\u00e8me parent tout en autorisant la modification de certains fichiers \u00e0 partir du th\u00e8me enfant.<br \/>\nSa cr\u00e9ation se r\u00e9sume en quelques \u00e9tapes seulement :<\/p>\n<ol>\n<li>Cr\u00e9er un dossier de th\u00e8me<\/li>\n<li>D\u00e9finir le th\u00e8me de r\u00e9f\u00e9rence<\/li>\n<li>Modifier le th\u00e8me \u00e0 partir du th\u00e8me enfant<\/li>\n<\/ol>\n<p>Voyons cela en d\u00e9tail avec des exemples concrets.<\/p>\n<h2>Child theme <em lang=\"en\">\u00ab\u00a0Little Twenty\u00a0\u00bb<\/em><\/h2>\n<p>Nous allons cr\u00e9er un th\u00e8me enfant \u00e0 partir du th\u00e8me Twenty Eleven, nous l&rsquo;appellerons <em lang=\"en\">Little Twenty<\/em> (ou <abbr title=\"Little Twenty\">LT<\/abbr>)<\/p>\n<h3>Cr\u00e9ation du dossier de th\u00e8me<\/h3>\n<p>Le dossier du th\u00e8me enfant se met avec les autres dossiers dans <code>wp-content\/themes\/<\/code>. Cr\u00e9ez un dossier nomm\u00e9 <code>little-twenty<\/code>.<br \/>\nDans ce dossier, cr\u00e9ez un fichier <code>style.css<\/code> avec comme contenu de base :<\/p>\n<pre class=\"code\"><code class=\"language-css css\">\/*\r\nTheme Name: Little Twenty\r\nDescription: Th\u00e8me enfant de Twenty Eleven\r\nAuthor: Geoffrey Crofte\r\nAuthor URI: https:\/\/geoffreycrofte.com\r\nVersion: 1.0.0\r\nTemplate: twentyeleven\r\n*\/<\/code><\/pre>\n<p>Ce morceau est relativement clair, la premi\u00e8re ligne d\u00e9finit le nom visible de votre th\u00e8me, la seconde une description, la troisi\u00e8me le nom de l&rsquo;auteur, la quatri\u00e8me son URL et la cinqui\u00e8me le num\u00e9ro de version de votre th\u00e8me enfant. Toutes ces lignes servent de descriptif qui s&rsquo;affichera dans l&rsquo;espace d&rsquo;administration (<code>Apparence &gt; Th\u00e8mes<\/code>), vous \u00eates relativement libres sur le contenu \u00e0 renseigner.<br \/>\nLe morceau le plus important est le dernier qui est le \u00ab\u00a0slug\u00a0\u00bb du th\u00e8me de r\u00e9f\u00e9rence, le th\u00e8me parent. Ce slug correspond au nom du dossier du th\u00e8me que l&rsquo;on souhaite modifier, ici Twenty Eleven, qui porte comme nom de dossier \u00ab\u00a0twentyeleven\u00a0\u00bb.<\/p>\n<p>Une fois que vous avez cela, vous avez cr\u00e9\u00e9 votre <em lang=\"en\">Child Theme<\/em> qui apparait d\u00e9j\u00e0 dans la liste des th\u00e8mes disponibles depuis votre back-office.<\/p>\n<figure id=\"attachment_2964\" aria-labelledby=\"figcaption_attachment_2964\" class=\"wp-caption aligncenter\" style=\"width: 610px\"><img decoding=\"async\" class=\"size-full wp-image-2964\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/09\/child-theme-appearance.png\" alt=\"\" width=\"600\" height=\"401\" srcset=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/09\/child-theme-appearance.png 600w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/09\/child-theme-appearance-300x200.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption id=\"figcaption_attachment_2964\" class=\"wp-caption-text\">Apparition du th\u00e8me enfant dans Apparance &gt; Th\u00e8mes de l&rsquo;espace d&rsquo;admin<\/figcaption><\/figure>\n<p><strong>Vous pouvez d&rsquo;ores et d\u00e9j\u00e0 l&rsquo;activer<\/strong>, celui-ci va simplement adopter le comportement de son th\u00e8me parent, puisque nous n&rsquo;avons encore aucun fichier \u00ab\u00a0template\u00a0\u00bb dans notre dossier de th\u00e8me.<br \/>\nPetit hic cependant, la feuille de styles du th\u00e8me enfant remplace d\u00e9j\u00e0 celle du th\u00e8me parent. Deux solutions s&rsquo;offrent ici \u00e0 vous : copier le contenu de <code>style.css<\/code> de TwentyEleven pour le coller dans votre CSS du th\u00e8me LT, ou cr\u00e9er un import en CSS avec la r\u00e8gle suivante :<\/p>\n<pre class=\"code\"><code class=\"language-css\">@import url(\"..\/twentyeleven\/style.css\");<\/code><\/pre>\n<p>\u00c0 placer \u00e0 la suite des quelques lignes vues pr\u00e9c\u00e9demment.<br \/>\nPour des raisons de performance je conseillerais plut\u00f4t la premi\u00e8re solution (c&rsquo;est \u00e0 dire la copie du contenu de la feuille de styles du th\u00e8me parent), qui vous permettra m\u00eame de modifier la CSS en cas de besoin.<\/p>\n<h3>Modification des templates<\/h3>\n<p>Il vous est d\u00e9sormais possible d&rsquo;\u00e9diter les portions du templates parent comme bon vous semble. Comment\u00a0? Simplement en copiant le fichier \u00e0 modifier depuis le th\u00e8me parent, et en le collant dans votre th\u00e8me enfant.<br \/>\nD\u00e9sormais les modifications \u00e0 apporter se feront sur les fichiers que vous copierez depuis le th\u00e8me parent.<br \/>\nPrenons un exemple.<\/p>\n<p>Copiez le fichier <code>header.php<\/code> du th\u00e8me parent (TwentyEleven, pour rappel), puis collez-le dans votre th\u00e8me enfant.<br \/>\nVous avez maintenant dans votre dossier la feuille de style, et ce fichier <code>header.php<\/code>.<br \/>\nOuvrez le fichier <code>header.php<\/code> pour \u00e9dition et remplacez<\/p>\n<pre class=\"code\"><code class=\"language-php\">&lt;h2 id=\"site-description\"&gt;&lt;?php bloginfo( 'description' ); ?&gt;&lt;\/h2&gt;<\/code><\/pre>\n<p>par<\/p>\n<pre class=\"code\"><code class=\"language-php\">&lt;p id=\"site-description\"&gt;&lt;?php bloginfo( 'description' ); ?&gt;&lt;\/p&gt;<\/code><\/pre>\n<p>Le remplacement de <code>h2<\/code> par <code>p<\/code> n&rsquo;aura aucune incidence visuelle, par contre vous constaterez que le code a bel et bien chang\u00e9.<\/p>\n<h3>Modifications des autres fichiers (images, JS, CSS, etc.)<\/h3>\n<p><img decoding=\"async\" class=\"noborder alignleft size-full wp-image-3049\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/document-louche.png\" alt=\"\" width=\"128\" height=\"128\" srcset=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/document-louche.png 128w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/document-louche-100x100.png 100w\" sizes=\"(max-width: 128px) 100vw, 128px\" \/>Vous en avez fait l&rsquo;exp\u00e9rience avec le fichier <code>style.css<\/code> : cr\u00e9er un fichier dans votre th\u00e8me enfant qui porte le m\u00eame nom qu&rsquo;un fichier pr\u00e9sent dans le th\u00e8me parent vous permet de remplacer ce dernier.<\/p>\n<p>Par exemple, vous souhaitez modifier le fichier <code>images\/search.png<\/code> qui repr\u00e9sente la loupe pr\u00e9sente dans les champs de recherche du th\u00e8me parent. Cr\u00e9ez le dossier <code>images<\/code> dans <abbr>LT<\/abbr>, puis placez-y une image <code>search.png<\/code>. (prenez une ic\u00f4ne sur le web pour effectuer le test, si \u00e7a vous dit)<br \/>\nL&rsquo;autre possibilit\u00e9 aurait \u00e9t\u00e9 d&rsquo;\u00e9craser le style CSS appliqu\u00e9 \u00e0 ce type de champ de formulaire, puisque cette image est plac\u00e9e en <code>background-image<\/code>.<\/p>\n<p>Chacun des fichiers du th\u00e8me parent est donc \u00e9ditable de la sorte.<\/p>\n<h3>Ajout de templates, d&rsquo;images, styles, etc.<\/h3>\n<p>L&rsquo;<strong>ajout de template<\/strong> est possible : comme vous le feriez pour un th\u00e8me parent, cr\u00e9er simplement votre template dans le th\u00e8me enfant. En respectant la <a href=\"http:\/\/codex.wordpress.org\/images\/1\/18\/Template_Hierarchy.png\">hi\u00e9rarchie des templates de WordPress<\/a>, vous pouvez par exemple cr\u00e9er une page sp\u00e9cifique pour l&rsquo;auteur dont l&rsquo;identifiant est 2 en cr\u00e9ant le fichier <code>author-2.php<\/code> \u00e0 la racine de votre th\u00e8me.<\/p>\n<p>L&rsquo;<strong>ajout d&rsquo;image<\/strong> se fait comme vous le feriez pour n&rsquo;importe quel projet, cr\u00e9ez votre image, dans n&rsquo;importe quel dossier, puis appelez l\u00e0 dans votre th\u00e8me (via CSS) ou dans votre code HTML.<\/p>\n<p><strong>Attention\u00a0!<\/strong> Lorsque vous cherchez \u00e0 ins\u00e9rer une nouvelle image, le code suivant ne fonctionne plus :<\/p>\n<pre class=\"code\"><code class=\"language-markup\">&lt;img src=\"&lt;?php bloginfo('template_directory'); ?&gt;\/img\/mon-image.jpg\" \/&gt;<\/code><\/pre>\n<p>En effet, la valeur \u00ab\u00a0<code>template_directory<\/code>\u00a0\u00bb de <code>bloginfo()<\/code> retourne le dossier du th\u00e8me parent : <code>http:\/\/domain.tld\/wp-content\/themes\/twentyeleven<\/code><br \/>\n\u00c0 la place, utilisez la fonction : <code><a href=\"http:\/\/codex.wordpress.org\/Function_Reference\/get_stylesheet_directory_uri\">get_stylesheet_directory_uri();<\/a><\/code><br \/>\nCette fonction retourne le dossier du th\u00e8me enfant : <code>http:\/\/domain.tld\/wp-content\/themes\/little-twenty<\/code>.<\/p>\n<p>L&rsquo;ajout de feuille de styles ou JavaScript se fait de la m\u00eame mani\u00e8re que les images : nommez vos fichiers de la m\u00eame mani\u00e8re que ceux du th\u00e8me parent pour les \u00e9craser, ou chargez-en de nouveaux dans vos templates avec les fonctions <a href=\"http:\/\/codex.wordpress.org\/Function_Reference\/wp_register_style\"><code>wp_register_style()<\/code><\/a> et <a href=\"http:\/\/codex.wordpress.org\/Function_Reference\/wp_register_script\"><code>wp_register_script()<\/code><\/a>. Je vous laisse consulter la documentation pour plus de d\u00e9tails.<\/p>\n<h3>Les fichiers sp\u00e9ciaux<\/h3>\n<p><img decoding=\"async\" class=\"noborder alignleft size-full wp-image-3051\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/fichier-speciaux.png\" alt=\"\" width=\"128\" height=\"128\" srcset=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/fichier-speciaux.png 128w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/10\/fichier-speciaux-100x100.png 100w\" sizes=\"(max-width: 128px) 100vw, 128px\" \/>J&rsquo;entends par fichiers sp\u00e9ciaux, les fichiers qui n&rsquo;ont pas tout \u00e0 fait le m\u00eame comportement que les pr\u00e9c\u00e9dents.<\/p>\n<h4>Le fichier <code>screenshot.png<\/code><\/h4>\n<p>Ce fichier permet d&rsquo;afficher un aper\u00e7u du th\u00e8me dans l&rsquo;administration. C&rsquo;est un fichier PNG de 300 pixels de large et 225 de hauteur.<br \/>\nCe fichier n&rsquo;est pas charg\u00e9 depuis le th\u00e8me parent, il vous faudra donc le cr\u00e9er pour votre th\u00e8me enfant.<\/p>\n<h4>Le fichier <code>functions.php<\/code><\/h4>\n<p>Le fichier <code>functions.php<\/code> ne fonctionne pas sur le principe des templates. En effet lorsque vous cr\u00e9ez un fichier <code>functions.php<\/code> pour votre th\u00e8me enfant, celui est charg\u00e9 en premier, puis le m\u00eame fichier du th\u00e8me parent est charg\u00e9 par la suite.<br \/>\nLes deux fichiers <code>functions.php<\/code> sont donc charg\u00e9s l&rsquo;un apr\u00e8s l&rsquo;autre, th\u00e8me enfant, puis th\u00e8me parent.<\/p>\n<p>De cette logique d\u00e9coule une probl\u00e9matique que vous finirez par rencontrer : \u00ab\u00a0Cannot redeclare function_name() (previously declared in [\u2026])\u00a0\u00bb.<br \/>\nEn effet, PHP ne permet pas de d\u00e9clarer deux fois une fonction portant le m\u00eame nom, ce qui provoque une erreur.<\/p>\n<p>Faisons un essai et analysons-le (attention, faites \u00e7a en local, on va cr\u00e9er un conflit) :<\/p>\n<ul>\n<li>Dans votre child theme LT, cr\u00e9ez le fichier <code>functions.php<\/code><\/li>\n<li>Entrez le code suivant, qui permet de red\u00e9finir le nombre de mots de l&rsquo;extrait d&rsquo;article\n<pre class=\"code\"><code class=\"language-php\">&lt;?php \r\nfunction twentyeleven_excerpt_length( $length ) {\r\n\treturn 50;\r\n}\r\nadd_filter( 'excerpt_length', 'twentyeleven_excerpt_length' );\r\n?&gt;<\/code><\/pre>\n<\/li>\n<li>Rechargez la page d&rsquo;accueil du votre site, une erreur PHP apparait.<\/li>\n<\/ul>\n<p>Nous venons de d\u00e9finir la fonction <code>twentyeleven_excerpt_length<\/code>, soit parce qu&rsquo;on a accidentellement utilis\u00e9 le m\u00eame nom de fonction, soit parce qu&rsquo;on voulait \u00e9craser l&rsquo;effet de la fonction du th\u00e8me parent. Sauf que cette fonction est d\u00e9clar\u00e9e deux fois par deux fichiers <code>functions.php<\/code> diff\u00e9rents.<br \/>\nVoici ce qui se passe :<\/p>\n<ol>\n<li>le fichier <code>functions.php<\/code> de LT (le th\u00e8me enfant) est lu<\/li>\n<li><code>twentyeleven_excerpt_length<\/code> est d\u00e9clar\u00e9e pour la premi\u00e8re fois<\/li>\n<li>le fichier <code>functions.php<\/code> de TwentyElevent (le th\u00e8me parent) est lu<\/li>\n<li><code>twentyeleven_excerpt_length<\/code> est d\u00e9clar\u00e9e pour la seconde fois<\/li>\n<li>PHP ne comprend pas : Paf\u00a0! Erreur\u00a0!<\/li>\n<\/ol>\n<p>Comment \u00e9viter ce probl\u00e8me\u00a0?<\/p>\n<p>En utilisant la fonction <a href=\"http:\/\/php.net\/manual\/en\/function.function-exists.php\"><code>function_exists()<\/code><\/a> de PHP. En contr\u00f4lant si la fonction existe d\u00e9j\u00e0, on peut d\u00e9clarer conditionnellement une fonction.<\/p>\n<pre class=\"code\"><code class=\"language-php\">&lt;?php \r\nif ( !function_exists('twentyeleven_excerpt_length')) {\r\n   function twentyeleven_excerpt_length( $length ) {\r\n      return 50;\r\n   }\r\n   add_filter( 'excerpt_length', 'twentyeleven_excerpt_length' );\r\n}\r\n?&gt;<\/code><\/pre>\n<p>\u00ab\u00a0Si la fonction <code>twentyeleven_excerpt_length<\/code> n&rsquo;existe pas, alors on la d\u00e9clare.\u00a0\u00bb<\/p>\n<p>Ok pour le principe, mais c&rsquo;est sur le th\u00e8me parent qu&rsquo;il faut faire cette manipulation, or on a dit pr\u00e9c\u00e9demment qu&rsquo;on s&rsquo;interdisait \u00e0 modifier sauvagement le th\u00e8me parent.<br \/>\nOn est bloqu\u00e9\u00a0! <strong>Le th\u00e8me parent est mal construit\u00a0!<\/strong><\/p>\n<p>Il ne vous reste plus qu&rsquo;\u00e0 pr\u00e9venir l&rsquo;auteur du th\u00e8me qu&rsquo;il a mal pens\u00e9 son code.<\/p>\n<p>Cependant, WordPress pr\u00e9voit quelque chose : chaque fonction cr\u00e9\u00e9e et li\u00e9e \u00e0 un hook est consid\u00e9r\u00e9e comme une \u00ab\u00a0action\u00a0\u00bb sur ce hook, il est donc possible de retirer ces actions.<br \/>\nVoici un code type qui reprend notre exemple pr\u00e9c\u00e9dent :<\/p>\n<pre class=\"code\"><code class=\"language-php\">&lt;?php\r\nadd_action('after_setup_theme','remove_parent_functions');\r\nfunction remove_parent_functions() {\r\n   remove_action('excerpt_length','twentyeleven_excerpt_length');\r\n   add_action('excerpt_length','new_twentyeleven_excerpt_length');\r\n}\r\n \r\nfunction new_twentyeleven_excerpt_length($length){\r\n   return 75;\r\n}\r\nadd_filter('excerpt_length', 'new_twentyeleven_excerpt_length');\r\n<\/code><\/pre>\n<p>Il reste impossible d&rsquo;utiliser le m\u00eame nom de fonction, cependant nous avons supprimer l&rsquo;action de la fonction initiale.<br \/>\nCela reste un petit bidouillage malgr\u00e9 tout.<br \/>\nMerci \u00e0 <a href=\"http:\/\/tweetpress.fr\/codewp\/personnaliser-un-theme-wordpress-avec-un-child-theme\/\">Julien et son article<\/a> pour cette derni\u00e8re astuce !<\/p>\n<p class=\"note message\">D\u00e9veloppeurs de th\u00e8me, pensez \u00e0 contr\u00f4ler l&rsquo;existence des fonctions avant de les d\u00e9clarer ! Merci.<\/p>\n<h2>R\u00e9sumons en quelques points<\/h2>\n<p>Pour modifier un th\u00e8me, vous devez dans l&rsquo;id\u00e9al :<\/p>\n<ul>\n<li>Cr\u00e9er un th\u00e8me enfant<\/li>\n<li>\u00c9craser les templates, images, scripts et CSS en cr\u00e9ant des fichiers de m\u00eames noms que le th\u00e8me parent dans le dossier du th\u00e8me enfant<\/li>\n<li>Ajouter autant de templates, script, CSS ou images que je le souhaite, mais :\n<ul>\n<li>utiliser <code>bloginfo('stylesheet_directory')<\/code> pour appeler mes fichiers<\/li>\n<li>Penser \u00e0 utiliser <code>wp_register_style()<\/code> et <code>wp_register_scripts()<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Penser aux fichiers sp\u00e9ciaux\n<ul>\n<li>screenshot.png : pour ajouter un aper\u00e7u de votre th\u00e8me au back-office<\/li>\n<li>functions.php : les deux fichiers (th\u00e8me parent et th\u00e8me enfant) sont charg\u00e9s<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Pour ne pas avoir \u00e9t\u00e9 beaucoup plus loin dans l&rsquo;exploration des th\u00e8mes, je vais m&rsquo;arr\u00eater l\u00e0, mais n&rsquo;h\u00e9sitez pas \u00e0 apporter votre expertise ou toute information compl\u00e9mentaire afin de corriger ou compl\u00e9ter cet article.<br \/>\nMerci \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les th\u00e8mes WordPress sont de plus en plus courus par tous : d\u00e9butants, blogueurs confirm\u00e9s ou professionnels du web. Il est possible d&rsquo;en obtenir gratuitement un peu partout sur la toile, pas toujours de bonne qualit\u00e9, pas toujours tr\u00e8s s\u00e9curis\u00e9s, comme il est possible d&rsquo;en obtenir de payants (je n&rsquo;ai pas dit qu&rsquo;ils \u00e9taient mieux). [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":3037,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[9,13],"tags":[228,497,470,15],"coauthors":[597],"class_list":["post-2925","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriels","category-wordpress","tag-astuce","tag-child-theme","tag-theme","tag-tutoriel"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/2925","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=2925"}],"version-history":[{"count":1,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/2925\/revisions"}],"predecessor-version":[{"id":8583,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/2925\/revisions\/8583"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/3037"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=2925"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=2925"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=2925"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=2925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}