{"id":231052,"date":"2022-12-27T12:46:00","date_gmt":"2022-12-27T09:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231052"},"modified":"2022-12-25T22:34:52","modified_gmt":"2022-12-25T19:34:52","slug":"zapytania-do-bazy-danych-w-celu-szybkiej-aktualizacji-danych-czesc-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/zapytania-do-bazy-danych-w-celu-szybkiej-aktualizacji-danych-czesc-1\/","title":{"rendered":"Zapytania do bazy danych w celu szybkiej aktualizacji danych, cz\u0119\u015b\u0107 1"},"content":{"rendered":"\n<p>To nie pierwszy raz, kiedy o tym wspominam, ale jednym z wyzwa\u0144 zwi\u0105zanych z pisaniem bezpo\u015brednich zapyta\u0144 do bazy danych w celu aktualizacji informacji w bazie danych WordPressa jest to, \u017ce otwierasz si\u0119 na co\u015b takiego:<\/p>\n<blockquote>\n<p>Tak, ale jest API do zrobienia czego\u015b takiego.<\/p>\n<\/blockquote>\n<p>I w wielu przypadkach to prawda. Ja te\u017c jestem wielkim fanem ich u\u017cywania. Ale zdarzaj\u0105 si\u0119 sytuacje, w kt\u00f3rych bezpo\u015brednie, sparametryzowane zapytania do bazy danych mog\u0105 by\u0107 bardziej optymalnym wyborem.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159831-61e6fe995df5b.jpg\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159831-61e6fe995df5b.jpg\" alt=\"Zapytania do bazy danych w celu szybkiej aktualizacji danych, cz\u0119\u015b\u0107 1\" ><\/a><\/p>\n<p>Nie, to nie jest baza danych, ale czy nie by\u0142oby wspaniale, gdyby wygl\u0105da\u0142y tak? Zdj\u0119cie Tobiasa Fischera na Unsplash<\/p>\n<p>Jest to oczywi\u015bcie uzale\u017cnione od \u015brodowiska, w kt\u00f3rym pracujesz, wymaga\u0144 projektu.<\/p>\n<p>Jest to wi\u0119c kolejny post, kt\u00f3ry b\u0119dzie ilustracj\u0105 tego, jak u\u017cywa\u0107 <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> do szybkiej aktualizacji informacji na podstawie metadanych (bez u\u017cycia czego\u015b takiego jak <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> lub <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a> do obs\u0142ugi tego).<\/p>\n<p>Podziel\u0119 to na dwie cz\u0119\u015bci, poniewa\u017c pocz\u0105tkowa funkcja, kt\u00f3r\u0105 poka\u017c\u0119, robi wi\u0119cej ni\u017c jedn\u0105 rzecz.<\/p>\n<p>Nie jestem tego fanem.<\/p>\n<p>Po drugie, jest to r\u00f3wnie\u017c okazja do tego, jak mo\u017cna przeprojektowa\u0107 funkcje, aby zachowywa\u0142y si\u0119 w spos\u00f3b bardziej obiektowy (co jest czym\u015b, <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">co jestem fanem<\/a> i co <a href=\"https:\/\/tommcfarlin.com\/object-oriented-programming-using-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zawsze ch\u0119tnie promuj\u0119<\/a> ).<\/p>\n<p>Na razie jednak przedstawi\u0119 problem pod r\u0119k\u0105<\/p>\n<ol>\n<li>Importuj\u0119 troch\u0119 informacji z zewn\u0119trznego API.<\/li>\n<li>Informacje s\u0105 mapowane do tabeli wp_posts oraz tabeli wp_postmeta.<\/li>\n<li>Istniej\u0105 pewne metadane, kt\u00f3re s\u0105 kryteriami dyktowania statusu posta. Lub bardziej bezpo\u015brednio, je\u015bli istnieje fragment metadanych, post powinien mie\u0107 status wersji roboczej, aby nie pojawi\u0142 si\u0119 w g\u0142\u00f3wnym zapytaniu.<\/li>\n<\/ol>\n<p>Aby rozwi\u0105za\u0107 ten problem, musz\u0105 si\u0119 wydarzy\u0107 dwie rzeczy:<\/p>\n<ol>\n<li>Potrzebujemy identyfikator\u00f3w post\u00f3w,<\/li>\n<li>I musimy zmieni\u0107 status post\u00f3w.<\/li>\n<\/ol>\n<p>Zanim skonfigurujemy zapytania i reszt\u0119 kodu, za\u0142\u00f3\u017cmy, \u017ce metaklucz, kt\u00f3rego u\u017cywamy, nazywa si\u0119 tw\u00f3rczo <strong>acme-status<\/strong>. I z tym zacznijmy.<\/p>\n<h3>1 Chwy\u0107 identyfikatory post\u00f3w za pomoc\u0105 powi\u0105zanego klucza meta<\/h3>\n<p>Najpierw utworzymy funkcj\u0119 o nazwie <strong>setInactivePosts.<\/strong> Jest to bardziej og\u00f3lne ni\u017c w przypadku pracy w okre\u015blonej domenie, ale rozumiesz.<\/p>\n<p>Nast\u0119pnie skonfigurujemy zapytanie, kt\u00f3re <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-00-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pobierze wszystkie identyfikatory post\u00f3w, kt\u00f3re maj\u0105 ten konkretny klucz meta<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\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            'acme-status') );\n\n  \/\/ More to come...\n<\/code><\/pre>\n<p>Tutaj mamy szereg wynik\u00f3w. Ale zanim cokolwiek zrobimy, musimy upewni\u0107 si\u0119, \u017ce mamy dane, na kt\u00f3rych mo\u017cemy operowa\u0107.<\/p>\n<h3>2 Wyjd\u017a wcze\u015bniej?<\/h3>\n<p>Zanim jednak przejdziemy do aktualizacji informacji, powinni\u015bmy sprawdzi\u0107, czy s\u0105 jakie\u015b wyniki. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-01-return-early-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A je\u015bli nie?<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ If there aren't any results, there's nothing to do.\nif (0 === count($results)) {\n    return;\n}\n\n\/\/ More to come...<\/code><\/pre>\n<p>Wtedy mo\u017cemy si\u0119 uchyli\u0107.<\/p>\n<h3>3 Zaktualizuj status postu<\/h3>\n<p>Ale je\u015bli s\u0105 wyniki, powinni\u015bmy je przejrze\u0107 i zaktualizowa\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-02-update-post-status-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ich status postu<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ See previous gist.\n\n\/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\nforeach ($results as $result) {\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) ($result-&gt;post_id)) );\n}<\/code><\/pre>\n<p>Wi\u0119c jak to wygl\u0105da razem?<\/p>\n<h3>4 Wszyscy razem<\/h3>\n<p>Kiedy po\u0142\u0105czymy t\u0119 wi\u0119ksz\u0105 ni\u017c konieczna funkcj\u0119, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a4b657f93a5df41274f5b4744975d265#file-03-set-inactive-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zobaczysz<\/a> :<\/p>\n<pre><code>&lt;?php\n\nfunction setInactivePosts()\n{\n    \/\/ First, find the post IDs with an empty acme-status.\n    global $wpdb;\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            'acme-status') );\n\n    \/\/ If there aren't any results, there's nothing to do.\n    if (0 === count($results)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    foreach ($results as $result) {\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) ($result-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Ale w nast\u0119pnym po\u015bcie zmienimy to nieco, aby by\u0142o bardziej zorientowane obiektowo.<\/p>\n<h3>Uwaga dla administrator\u00f3w baz danych<\/h3>\n<p>Dla tych z was, kt\u00f3rzy s\u0105 dobrze zorientowani w SQL-fu, wiecie, \u017ce mo\u017cna to prawdopodobnie rozwi\u0105za\u0107 za pomoc\u0105 jednego zapytania; jednak cel tego posta i postu po nim jest dwojaki:<\/p>\n<ol>\n<li>Aby pokaza\u0107, jak u\u017cywa\u0107 $wpdb do szybkiego osi\u0105gni\u0119cia czego\u015b,<\/li>\n<li>Pokaza\u0107, jak przekszta\u0142ci\u0107 proceduraln\u0105 metod\u0119 robienia czego\u015b w obiektow\u0105 metod\u0119 robienia czego\u015b.<\/li>\n<\/ol>\n<p>Maj\u0105c to na uwadze, dzi\u0119kuj\u0119 za wszystkie pytania. \ud83d\udc4d\ud83c\udffb<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>To kolejny post, kt\u00f3ry b\u0119dzie ilustracj\u0105 tego, jak u\u017cywa\u0107 $wpdb do szybkiego aktualizowania informacji za pomoc\u0105 bezpo\u015brednich zapyta\u0144 do bazy danych.<\/p>\n","protected":false},"author":1,"featured_media":237054,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,836,845,866],"tags":[1169],"class_list":["post-231052","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231052","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=231052"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231052\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/237054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}