{"id":231613,"date":"2022-12-27T11:53:00","date_gmt":"2022-12-27T08:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231613"},"modified":"2022-12-27T12:14:55","modified_gmt":"2022-12-27T09:14:55","slug":"requetes-de-base-de-donnees-pour-mettre-a-jour-rapidement-les-donnees-partie-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/requetes-de-base-de-donnees-pour-mettre-a-jour-rapidement-les-donnees-partie-2\/","title":{"rendered":"Requ\u00eates de base de donn\u00e9es pour mettre \u00e0 jour rapidement les donn\u00e9es, partie 2"},"content":{"rendered":"\n<p>Ceci est la deuxi\u00e8me et derni\u00e8re partie d&rsquo;une s\u00e9rie sur &#8211; comme le titre l&rsquo;indique &#8211; les requ\u00eates directes de base de donn\u00e9es. Plus pr\u00e9cis\u00e9ment, il s&rsquo;agit de changer les statuts des publications (mais cela concerne plus que cela).<\/p>\n<p>Photo de Ross Findon sur Unsplash<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/requetes-de-base-de-donnees-pour-mettre-a-jour-rapidement-les-donnees-partie-1\/\" title=\"Du message pr\u00e9c\u00e9dent\u00a0:\">Du message pr\u00e9c\u00e9dent\u00a0:<\/a><\/p>\n<blockquote>\n<p>Ceci est encore un autre article qui va \u00eatre une illustration de la fa\u00e7on d&rsquo;utiliser $ wpdb pour mettre \u00e0 jour rapidement les informations bas\u00e9es sur les m\u00e9tadonn\u00e9es.<\/p>\n<\/blockquote>\n<p>Et le code fourni dans cet article fonctionne, mais si vous cherchez \u00e0 le rendre plus orient\u00e9 objet, il y a plus de travail \u00e0 faire.<\/p>\n<p>Avant de passer au message proprement dit, cependant, il est important de noter qu&rsquo;en mati\u00e8re de programmation orient\u00e9e objet, il y a beaucoup de travail qui peut \u00eatre consacr\u00e9 \u00e0 la conception de la classe et \u00e0 la cr\u00e9ation de niveaux d&rsquo;abstraction.<\/p>\n<p>\u00c0 un moment donn\u00e9, vous devez tracer la ligne proverbiale entre le moment o\u00f9 vous allez utiliser des interfaces, la granularit\u00e9 de vos classes en termes de ce qu&rsquo;elles extraient, etc.<\/p>\n<p>Et le but de cet article est d&rsquo;aider \u00e0 fournir une meilleure conception orient\u00e9e objet, mais ce n&rsquo;est pas un exercice qui rend cela aussi optimal que possible. Je discute de sujets comme celui-ci dans <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une autre s\u00e9rie de messages<\/a>.<\/p>\n<p>Mais gardez cela \u00e0 l&rsquo;esprit lorsque vous lisez le code tout au long du reste du message.<\/p>\n<h2>Requ\u00eates de base de donn\u00e9es pour mettre \u00e0 jour rapidement les donn\u00e9es, partie 2<\/h2>\n<p>\u00c9tant donn\u00e9 o\u00f9 nous nous sommes arr\u00eat\u00e9s, nous avons une seule fonction faisant les choses suivantes\u00a0:<\/p>\n<ol>\n<li>r\u00e9cup\u00e9rer tous les messages associ\u00e9s \u00e0 une cl\u00e9 m\u00e9ta sp\u00e9cifique,<\/li>\n<li>d\u00e9terminer si nous devons sortir plus t\u00f4t,<\/li>\n<li>mettre \u00e0 jour le statut de publication de tous les messages existants.<\/li>\n<\/ol>\n<p>La premi\u00e8re chose \u00e0 noter est qu&rsquo;une seule fonction est trop, elle doit donc \u00eatre divis\u00e9e en plusieurs autres fonctions. Et puisqu&rsquo;elle est orient\u00e9e objet, nous devons nous assurer que tout ce qu&rsquo;une fonction fait n&rsquo;est pas n\u00e9cessairement bas\u00e9 sur les \u00e9tapes pr\u00e9c\u00e9dentes &#8211; c&rsquo;est pr\u00e9cis\u00e9ment ce qu&rsquo;est la programmation proc\u00e9durale.<\/p>\n<p>Au lieu de cela, nous utiliserons cette opportunit\u00e9 pour configurer des fonctions, afin qu&rsquo;elles fonctionnent sur toutes les donn\u00e9es qui leur sont transmises, quelle que soit la mani\u00e8re dont elles y sont arriv\u00e9es.<\/p>\n<p>Enfin, c&rsquo;est \u00e0 vous, en tant que d\u00e9veloppeur, de d\u00e9terminer si vous voulez avoir une seule classe pour faire cela, plus d&rsquo;une classe, ou un ensemble de classes li\u00e9es qui h\u00e9ritent d&rsquo;une classe parent.<\/p>\n<p>Encore une fois, tout d\u00e9pend de la fa\u00e7on dont vous voulez rendre le code abstrait.<\/p>\n<p>Pour l&rsquo;instant, cependant, allons de l&rsquo;avant avec la rupture des choses.<\/p>\n<h3>1 Saisissez les identifiants de publication avec la m\u00e9ta-cl\u00e9 associ\u00e9e<\/h3>\n<p>Tout comme dans le premier message, nous voulons nous assurer que nous r\u00e9cup\u00e9rons les identifiants de publication li\u00e9s \u00e0 une cl\u00e9 m\u00e9ta sp\u00e9cifique.<\/p>\n<p>Afin de rendre cette fonction aussi flexible que possible, nous allons la configurer pour\u00a0:<\/p>\n<ul>\n<li>accepter la cl\u00e9 m\u00e9ta comme une cha\u00eene,<\/li>\n<li>retourner un tableau<\/li>\n<\/ul>\n<p>La fonction ressemblera alors <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci :<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Locates all of the post IDs that are associated with an empty meta key (which\n * is specified as an argument for the function).\n *\n * @param string $metaKey The meta key used to retrieve the set of post IDs.\n * @return array $results The set of product IDs associated with the specified meta key.\n *\/\npublic function getInactivePostIds(string $metaKey): array\n{\n    global $wpdb;\n\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            $metaKey) );\n\n    return $results;\n}<\/code><\/pre>\n<p>Dans le premier article, nous avons divis\u00e9 cela en trois \u00e9tapes (qui sont \u00e9galement d\u00e9crites ci-dessus). Ici, cependant, nous pouvons combiner la deuxi\u00e8me et la troisi\u00e8me \u00e9tape en une seule fonction.<\/p>\n<h3>2 Mettre \u00e0 jour le statut de la publication<\/h3>\n<p>Comme je l&rsquo;ai mentionn\u00e9, l&rsquo;un des aspects de la programmation orient\u00e9e objet est de s&rsquo;assurer que les fonctions que nous utilisons sont ind\u00e9pendantes de la mani\u00e8re dont les donn\u00e9es qu&rsquo;elles re\u00e7oivent ont \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9es.<\/p>\n<p>Au lieu de cela, ils ont un seul algorithme \u00e0 ex\u00e9cuter pour se concentrer sur les donn\u00e9es transmises \u00e0 la fonction. Dans ce cas, nous voulons prendre l&rsquo;ensemble des r\u00e9sultats &#8211; qui sont des identifiants de publication &#8211; et mettre \u00e0 jour leur statut de publication afin qu&rsquo;il soit d\u00e9fini sur <strong>brouillon<\/strong>.<\/p>\n<p>Cela signifie que la fonction acceptera un tableau mais ne renverra rien. Potentiellement, vous pourriez lui faire garder une trace de nombreux messages qu&rsquo;il a mis \u00e0 jour (ou s&rsquo;il a mis \u00e0 jour quoi que ce soit), mais je me concentre uniquement sur la refactorisation du code que nous avons d\u00e9j\u00e0.<\/p>\n<p>C&rsquo;est donc ce que nous allons faire. Et la premi\u00e8re chose est de s&rsquo;assurer qu&rsquo;il y a des donn\u00e9es r\u00e9elles avec lesquelles travailler. Et si c&rsquo;est le cas, parcourez ensuite le tableau de liste des ID de publication et <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modifiez leur statut de publication\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Updates incoming posts by setting their post status to 'draft.'\n *\n * @param array $postData the set of post IDs associated with the specific meta key.\n *\/\npublic function setPostsToDraft(array $postData)\n{\n    \/\/ If the post data is empty, there's nothing to do.\n    if (0 === count($postData)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    global $wpdb;\n    foreach ($postData as $post) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($post-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Vous pouvez voir que ce n&rsquo;est pas tr\u00e8s diff\u00e9rent du travail qui a \u00e9t\u00e9 fait dans le premier post, mais cela soul\u00e8ve maintenant quelques questions.<\/p>\n<h3>3 consid\u00e9rations orient\u00e9es objet<\/h3>\n<p>Lorsque vous travaillez avec un code comme celui-ci\u00a0:<\/p>\n<ul>\n<li>Appartiennent-ils tous \u00e0 la m\u00eame classe ou \u00e0 des classes distinctes\u00a0?<\/li>\n<li>Devrait-il y avoir une classe de base et, si oui, pourquoi ou pourquoi pas ?<\/li>\n<li>Devrait-il y avoir une seule fonction publique invoqu\u00e9e qui appelle ces m\u00e9thodes (et les marque comme priv\u00e9es)\u00a0?<\/li>\n<li>Doit-on laisser les fonctions publiques ?<\/li>\n<\/ul>\n<p>Pour ce post, je vais faire ce qui suit :<\/p>\n<ul>\n<li><strong>Exposez chaque fonction en tant que m\u00e9thode publique<\/strong>. C&rsquo;est ainsi que si des donn\u00e9es sont renvoy\u00e9es par la premi\u00e8re m\u00e9thode, vous pouvez potentiellement en faire autre chose.<\/li>\n<li><strong>Gardez-le contenu dans une seule classe<\/strong>. De cette fa\u00e7on, nous pouvons instancier une seule classe, puis l&rsquo;utiliser pour effectuer tout le travail que nous devons faire. S&rsquo;il y avait d&rsquo;autres m\u00e9thodes, nous utiliserions ces m\u00eames m\u00e9thodes.<\/li>\n<li><strong>Commencez par l&rsquo;interface<\/strong>. Je ne vais pas m&#8217;emb\u00eater \u00e0 \u00e9crire une interface dans le seul but de montrer une interface (je suppose que c&rsquo;est assez facile \u00e0 d\u00e9duire \u00e9tant donn\u00e9 les fonctions que nous avons en ce moment), mais je vais prendre la classe et montrer comment nous pouvons invoquer le fonctionne &quot;de l&rsquo;ext\u00e9rieur vers l&rsquo;int\u00e9rieur&quot;.<\/li>\n<\/ul>\n<p>Je vais donc commencer par <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le dernier point<\/a> et revenir en arri\u00e8re. Voici une fa\u00e7on de travailler avec le code\u00a0:<\/p>\n<pre><code>&lt;?php\n\n$postStatusModifier = new PostStatusModifier();\n$inactivePost = $postStatusModifier-&gt;getInactivePostIds('acme-status');\n$postStatusModifier-&gt;setPostsToDraft($inactivePosts);<\/code><\/pre>\n<p>Et puis voici \u00e0 quoi ressemble <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">toute la classe :<\/a><\/p>\n<pre><code>&lt;?php\n\nclass PostStatusModifier\n{\n    \/**\n     * Locates all of the post IDs that are associated with an empty meta key (which\n     * is specified as an argument for the function).\n     *\n     * @param string $metaKey The meta key used to retrieve the set of post IDs.\n     * @return array $results The set of product IDs associated with the specified meta key.\n     *\/\n    public function getInactivePostIds(string $metaKey): array\n    {\n        global $wpdb;\n\n        $results = $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                SELECT post_id\n                FROM $wpdb-&gt;postmeta\n                WHERE meta_key = %s\n                AND meta_value = ''\n                \",\n                $metaKey) );\n\n        return $results;\n    }\n\n    \/**\n     * Updates incoming posts by setting their post status to 'draft.'\n     *\n     * @param array $postData the set of post IDs associated with the specific meta key.\n     *\/\n    public function setPostsToDraft(array $postData)\n    {\n        \/\/ If the post data is empty, there's nothing to do.\n        if (0 === count($postData)) {\n            return;\n        }\n\n        \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n        global $wpdb;\n        foreach ($postData as $post) {\n            $wpdb-&gt;get_results(\n                $wpdb-&gt;prepare(\n                    \"\n                    UPDATE $wpdb-&gt;posts\n                    SET post_status = %s\n                    WHERE ID = %d\n                    \",\n                    'draft',\n                    (int) ($post-&gt;post_id)) );\n        }\n    }\n}<\/code><\/pre>\n<p>D&rsquo;une mani\u00e8re g\u00e9n\u00e9rale, cela servira les m\u00eames objectifs que le premier mais d&rsquo;une mani\u00e8re plus orient\u00e9e objet.<\/p>\n<h2>Ce n&rsquo;est pas la voie<\/h2>\n<p>Comme j&rsquo;ai essay\u00e9 de le r\u00e9p\u00e9ter plusieurs fois dans cet article, ce n&rsquo;est pas la mani\u00e8re d\u00e9finitive de faire ce travail. Au lieu de cela, c&rsquo;est une fa\u00e7on de travailler.<\/p>\n<p>Vous pouvez reconcevoir, refactoriser ou r\u00e9utiliser cela comme bon vous semble. Le but, cependant, est de montrer comment d\u00e9coupler la logique que nous consid\u00e9rons normalement comme proc\u00e9durale en quelque chose qui est un peu moins d\u00e9pendant d&rsquo;elle-m\u00eame et laisse de la place pour un travail suppl\u00e9mentaire.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Utilisation de principes orient\u00e9s objet pour am\u00e9liorer la conception de classe pour l&rsquo;\u00e9criture de requ\u00eates de base de donn\u00e9es afin de mettre \u00e0 jour rapidement les donn\u00e9es.<\/p>\n","protected":false},"author":1,"featured_media":237043,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,832,841],"tags":[1167],"class_list":["post-231613","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231613","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=231613"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231613\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231613"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231613"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231613"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}