{"id":744,"date":"2019-05-06T13:56:53","date_gmt":"2019-05-06T11:56:53","guid":{"rendered":"https:\/\/geekcommunicant.com\/blog\/?p=744"},"modified":"2019-05-06T13:56:54","modified_gmt":"2019-05-06T11:56:54","slug":"automatisation-base-deplacement-fichiers-medias","status":"publish","type":"post","link":"https:\/\/geekcommunicant.com\/blog\/2019\/05\/06\/automatisation-base-deplacement-fichiers-medias\/","title":{"rendered":"Automatisation des op\u00e9rations en base suite au d\u00e9placement des fichiers de m\u00e9dias"},"content":{"rendered":"\n<p>Dans mon dernier article, je pr\u00e9sentais la mani\u00e8re dont j&rsquo;ai proc\u00e9d\u00e9 pour <a href=\"https:\/\/geekcommunicant.com\/blog\/2019\/04\/29\/deplacer-fichiers-medias-wordpress\/\">d\u00e9placer les fichiers de ma biblioth\u00e8que de m\u00e9dias WordPress<\/a>.<\/p>\n\n\n\n<p>Toutes les diff\u00e9rentes op\u00e9rations des \u00e9tapes d\u00e9crites dans cet article \u00e9taient faites \u00e0 la main, ce qui peut \u00eatre long, et une faute de frappe ou un oubli peut \u00eatre source d&rsquo;erreurs.<\/p>\n\n\n\n<p>Mais n&rsquo;ayez pas peur, j&rsquo;ai cr\u00e9\u00e9 un script PHP permettant d&rsquo;automatiser les \u00e9tapes concernant les actions en base de donn\u00e9es.<\/p>\n\n\n\n<p>Je vais vous pr\u00e9senter ici la mani\u00e8re de proc\u00e9der en PHP pour l&rsquo;automatisation des modifications des deux tables \u00e0 modifier :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>la table contenant les meta donn\u00e9es : <code>wp_postmeta<\/code><\/li><li>la table contenant les articles et pages : <code>wp_posts<\/code><\/li><\/ul>\n\n\n\n<p>Quelle que soit la table \u00e0 modifier, on va proc\u00e9der de la m\u00eame mani\u00e8re : on lit chaque ligne de la table devant \u00eatre modifi\u00e9e, et pour chaque ligne on modifie la valeur \u00e0 l&rsquo;aide de <code><a href=\"https:\/\/www.php.net\/manual\/fr\/function.preg-replace.php\">preg_replace()<\/a><\/code> avant de la mettre \u00e0 jour.<\/p>\n\n\n\n<p>Le m\u00eame pattern\/masque d&rsquo;expression r\u00e9guli\u00e8re et la m\u00eame cha\u00eene de remplacement sont utilis\u00e9s pour tout appel \u00e0 <code>preg_replace()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Table wp_postmeta<\/h2>\n\n\n\n<p>Pour cette table, selon la meta donn\u00e9e trait\u00e9e il faut proc\u00e9der de mani\u00e8re diff\u00e9rente :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>dans le cas de la cl\u00e9 \u00ab\u00a0_wp_attached_file\u00a0\u00bb, on se contente d&rsquo;un appel simple : <code>preg_replace('@&lt;pattern&gt;@', '&lt;cha\u00eene de remplacement&gt;', '&lt;valeur de la cl\u00e9&gt;')<\/code> avant de faire la mise \u00e0 jour<\/li><li>dans le cas de la cl\u00e9 \u00ab\u00a0_wp_attachment_metadata\u00a0\u00bb, il faut pr\u00e9alablement d\u00e9s\u00e9rialiser l&rsquo;array (avec <code><a href=\"https:\/\/www.php.net\/manual\/fr\/function.unserialize.php\">unserialize()<\/a><\/code>) avant de faire appel \u00e0 <code>preg_replace()<\/code>, et il faut bien penser \u00e0 \u00e0 nouveau s\u00e9rialiser le tableau (avec <code><a href=\"https:\/\/www.php.net\/manual\/fr\/function.serialize.php\">serialize()<\/a><\/code>) avant la mise \u00e0 jour.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Table wp_posts<\/h2>\n\n\n\n<p>Pour cette table, seul un appel \u00e0 <code>preg_replace()<\/code> est n\u00e9cessaire, mais avec une l\u00e9g\u00e8re diff\u00e9rence : il faut pr\u00e9fixer le masque de recherche et la cha\u00eene de remplacement avec \u00ab\u00a0uploads\/\u00a0\u00bb, car les liens vers les pages de votre site WordPress peuvent \u00e9galement contenir le pattern recherch\u00e9 (\u00ab\u00a0&lt;ann\u00e9e&gt;\/&lt;mois&gt;\u00a0\u00bb surtout).<\/p>\n\n\n\n<p>L&rsquo;appel \u00e0 <code>preg_replace()<\/code> devient donc : <code>preg_replace('@uploads\/&lt;pattern&gt;@', 'uploads\/&lt;cha\u00eene de remplacement&gt;', '&lt;valeur de la cl\u00e9&gt;')<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus<\/h2>\n\n\n\n<p>Voici un petit script, \u00e0 placer \u00e0 la racine de votre installation WordPress :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\n\n$search_pattern = &#039;&#x5B;0-9]{4}\/&#x5B;0-9]{2}\/&#039;;\n\n$replace = &#039;&#039;;\n\n\/***********************************\n *\n *\t\/!\\ NE PAS MODIFIER AU-DELA \/!\\\n *\n ***********************************\/\n\ninclude_once(&#039;.\/wp-config.php&#039;); \/\/ pour r\u00e9cup\u00e9rer la configuration de BDD de l&#039;installation WordPress\n\n$dsn = sprintf(&#039;mysql:host=%s;dbname=%s;charset=%s&#039;, DB_HOST, DB_NAME, DB_CHARSET);\n\n$db = new PDO($dsn, DB_USER, DB_PASSWORD);\n\n\/\/ Modification des posts\n$read_posts = $db-&gt;query(&#039;SELECT ID, post_content FROM &#039;.$table_prefix.&#039;posts WHERE post_type IN (&quot;post&quot;, &quot;page&quot;)&#039;);\n\n$write_post = $db-&gt;prepare(&#039;UPDATE &#039;.$table_prefix.&#039;posts SET post_content=:post_content WHERE ID=:post_id&#039;);\n\nwhile ($post = $read_posts-&gt;fetch(PDO::FETCH_ASSOC)) {\n\t\/\/ Pour ne r\u00e9\u00e9crire que les appels aux m\u00e9dias et pas les liens (qui peuvent aussi contenir une structure AAAA\/MM)\n\tif ( !preg_match(&#039;@uploads\/&#039;.$search_pattern.&#039;@&#039;, $post&#x5B;&#039;post_content&#039;]) ) {\n\t\tcontinue;\n\t}\n\n\t$write_post-&gt;bindParam(&#039;:post_content&#039;, preg_replace(&#039;@uploads\/&#039;.$search_pattern.&#039;@&#039;, &#039;uploads\/&#039;.$replace, $post&#x5B;&#039;post_content&#039;]), PDO::PARAM_STR);\n\t$write_post-&gt;bindParam(&#039;:post_id&#039;, $post&#x5B;&#039;ID&#039;], PDO::PARAM_INT);\n\t$write_post-&gt;execute();\n}\n\n$read_posts-&gt;closeCursor();\n\n\/\/ Modification des meta donn\u00e9es\n$read_metas = $db-&gt;query(&#039;SELECT meta_id, meta_key, meta_value FROM &#039;.$table_prefix.&#039;postmeta WHERE meta_key IN (&quot;_wp_attached_file&quot;, &quot;_wp_attachment_metadata&quot;)&#039;);\n\n$write_meta = $db-&gt;prepare(&#039;UPDATE &#039;.$table_prefix.&#039;postmeta SET meta_value=:meta_value WHERE meta_id=:meta_id&#039;);\n\nwhile ($meta = $read_metas-&gt;fetch(PDO::FETCH_ASSOC)) {\n\tif($meta&#x5B;&#039;meta_key&#039;] == &#039;_wp_attached_file&#039;) {\n\t\t$meta_value = preg_replace(&#039;@&#039;.$search_pattern.&#039;@&#039;, $replace, $meta&#x5B;&#039;meta_value&#039;]);\n\t} else {\n\t\t$meta_array = unserialize($meta&#x5B;&#039;meta_value&#039;]);\n\n\t\t$meta_array&#x5B;&#039;file&#039;] = preg_replace(&#039;@&#039;.$search_pattern.&#039;@&#039;, $replace, $meta_array&#x5B;&#039;file&#039;]);\n\n\t\t$meta_value = serialize($meta_array);\n\t}\n\n\t$write_meta-&gt;bindParam(&#039;:meta_value&#039;, $meta_value, PDO::PARAM_STR);\n\t$write_meta-&gt;bindParam(&#039;:meta_id&#039;, $meta&#x5B;&#039;meta_id&#039;], PDO::PARAM_INT);\n\t$write_meta-&gt;execute();\n}\n\n$read_metas-&gt;closeCursor();\n<\/pre><\/div>\n\n\n<p>\u26a0 Attention, ce script n&rsquo;a \u00e9t\u00e9 test\u00e9 que sur une version de test locale. Pensez bien \u00e0 faire une sauvegarde de votre base avant de l&rsquo;ex\u00e9cuter. \u26a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans mon dernier article, je pr\u00e9sentais la mani\u00e8re dont j&rsquo;ai proc\u00e9d\u00e9 pour d\u00e9placer les fichiers de ma biblioth\u00e8que de m\u00e9dias WordPress. Toutes les diff\u00e9rentes op\u00e9rations des \u00e9tapes d\u00e9crites dans cet article \u00e9taient faites \u00e0 la main, ce qui peut \u00eatre &hellip; <a href=\"https:\/\/geekcommunicant.com\/blog\/2019\/05\/06\/automatisation-base-deplacement-fichiers-medias\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[33,41],"tags":[32,42],"class_list":["post-744","post","type-post","status-publish","format-standard","hentry","category-php","category-wordpress","tag-php","tag-wordpress"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2IoOb-c0","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":740,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/04\/29\/deplacer-fichiers-medias-wordpress\/","url_meta":{"origin":744,"position":0},"title":"D\u00e9placer les fichiers de la biblioth\u00e8que de m\u00e9dias de WordPress","author":"geekc","date":"29\/04\/2019","format":false,"excerpt":"Si pour une raison ou une autre vous voulez d\u00e9placer les fichiers m\u00e9dias dans les dossiers de votre site WordPress, je vais vous expliquer comment faire. Dans mon cas, j'ai eu ce besoin quand j'ai voulu d\u00e9sactiver l'organisation en dossier annuels et mensuels par d\u00e9faut, et d\u00e9placer tous mes m\u00e9dias\u2026","rel":"","context":"Dans &quot;WordPress&quot;","block_context":{"text":"WordPress","link":"https:\/\/geekcommunicant.com\/blog\/category\/wordpress\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":314,"url":"https:\/\/geekcommunicant.com\/blog\/2014\/03\/30\/pourquoi-choisir-modx\/","url_meta":{"origin":744,"position":1},"title":"Pourquoi choisir MODX ?","author":"geekc","date":"30\/03\/2014","format":false,"excerpt":"Comme je l'ai annonc\u00e9 dans l'article pr\u00e9c\u00e9dent, j'ai choisis d'utiliser MODX pour mon site. Dans cet article je vais vous pr\u00e9senter MODX et vous dire ce qui me l'a fait choisir. Pr\u00e9sentation de MODX MODX est un syt\u00e8me de gestion de contenu (Content Management System en anglais) qui existe depuis\u2026","rel":"","context":"Dans &quot;MODX&quot;","block_context":{"text":"MODX","link":"https:\/\/geekcommunicant.com\/blog\/category\/modx\/"},"img":{"alt_text":"Arbre de ressources MODX","src":"https:\/\/i0.wp.com\/geekcommunicant.com\/blog\/wp-content\/uploads\/arbre_de_ressources.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":856,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/08\/carte-controle-calques-leaflet\/","url_meta":{"origin":744,"position":2},"title":"Carte avec contr\u00f4le de calques avec Leaflet","author":"geekc","date":"08\/07\/2019","format":false,"excerpt":"Cette semaine encore, nous allons encore voir la cr\u00e9ation d\u2019une carte interactive avec la librairie Leaflet. La carte pr\u00e9sent\u00e9e aujourd\u2019hui utilise les groupes de calques, ainsi que le contr\u00f4le de calques, afin de r\u00e9aliser une carte historique de la ligne 2 du tramway d\u2019\u00cele-de-France. Bref historique Afin d\u2019expliquer le d\u00e9coupage\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":778,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/05\/13\/enlever-meta-generator-wordpress\/","url_meta":{"origin":744,"position":3},"title":"Enlever la balise meta \u00ab\u00a0generator\u00a0\u00bb sur votre site WordPress","author":"geekc","date":"13\/05\/2019","format":false,"excerpt":"Je sais qu\u2019il y a quelque temps, j\u2019avais fait un article sur comment rajouter une balise meta \u00ab\u00a0generator\u00a0\u00bb \u00e0 un site MODX, mais cette balise peut remettre en question la s\u00e9curit\u00e9 de votre site. Une faille de s\u00e9curit\u00e9\u00a0? Conna\u00eetre le CMS derri\u00e8re un site peut faciliter la vie \u00e0 toute\u2026","rel":"","context":"Dans &quot;PHP&quot;","block_context":{"text":"PHP","link":"https:\/\/geekcommunicant.com\/blog\/category\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":357,"url":"https:\/\/geekcommunicant.com\/blog\/2014\/04\/28\/php-quest-ce-cest\/","url_meta":{"origin":744,"position":4},"title":"Le PHP, qu&rsquo;est-ce que c&rsquo;est ?","author":"geekc","date":"28\/04\/2014","format":false,"excerpt":"Qu'est-ce que le PHP ? Le PHP est un langage de programmation (ou script), qui permet de rendre les pages dynamiques; c'est-\u00e0-dire par exemple, utiliser un seul et unique squelette HTML pour g\u00e9n\u00e9rer des centaines de pages diff\u00e9rentes, comme dans tous les CMS modernes. \u00c0 quoi \u00e7a ressemble Voici maintenant,\u2026","rel":"","context":"Dans &quot;PHP&quot;","block_context":{"text":"PHP","link":"https:\/\/geekcommunicant.com\/blog\/category\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":860,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/15\/carte-interactive-openlayers-controle-calques\/","url_meta":{"origin":744,"position":5},"title":"Carte interactive OpenLayers avec contr\u00f4le de calques","author":"geekc","date":"15\/07\/2019","format":false,"excerpt":"Apr\u00e8s avoir r\u00e9alis\u00e9 une carte historique de la ligne 2 du tramway d\u2019\u00cele-de-France avec Leaflet (voir le tutoriel), je me suis attaqu\u00e9 \u00e0 la cr\u00e9ation de cette m\u00eame carte avec OpenLayers. Bien que plus complet sur certains points, OpenLayers n\u2019inclus pas nativement deux fonctionnalit\u00e9s utilis\u00e9es dans la carte\u00a0: Le contr\u00f4le\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/comments?post=744"}],"version-history":[{"count":0,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/744\/revisions"}],"wp:attachment":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/media?parent=744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/categories?post=744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/tags?post=744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}