{"id":230235,"date":"2022-12-08T13:11:00","date_gmt":"2022-12-08T10:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230235"},"modified":"2022-12-07T11:53:27","modified_gmt":"2022-12-07T08:53:27","slug":"punkt-do-pracy-z-zapytaniami-do-bazy-danych-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/punkt-do-pracy-z-zapytaniami-do-bazy-danych-w-wordpress\/","title":{"rendered":"Punkt do pracy z zapytaniami do bazy danych w WordPress"},"content":{"rendered":"\n<p>Jestem fanem niekt\u00f3rych API WordPressa do odpytywania bazy danych, takich jak:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Zapytanie<\/a><\/strong> ,<\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a><\/strong> ,<\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query#Related\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a><\/strong> ,<\/li>\n<li>i tak dalej<\/li>\n<\/ul>\n<p>Jestem r\u00f3wnie\u017c fanem zapyta\u0144 bezpo\u015brednio do bazy danych w razie potrzeby.<\/p>\n<p>Jak zauwa\u017cysz, robi\u0119 to w sp\u00f3jny spos\u00f3b, a poniewa\u017c ostatnio robi\u0119 to cz\u0119\u015bciej, oto podstawowy format do pracy z zapytaniami do bazy danych w WordPress.<\/p>\n<p>Je\u015bli jednak to zrobi\u0119, generalnie s\u0105 rzeczy, o kt\u00f3rych pami\u0119tam:<\/p>\n<ol>\n<li>zawsze upewnij si\u0119, \u017ce zapytanie jest sparametryzowane (szczeg\u00f3lnie w przypadku wprowadzania danych przez u\u017cytkownika),<\/li>\n<li>zwraca\u0107 informacje w postaci tablicy asocjacyjnej.<\/li>\n<\/ol>\n<p>Pierwsza sprawa dotyczy bezpiecze\u0144stwa; drugi jest mniej wi\u0119cej dla wygody, aby upro\u015bci\u0107 iteracj\u0119 danych za pomoc\u0105 funkcji tablicowych PHP.<\/p>\n<h2>Zapytania do bazy danych w WordPress<\/h2>\n<p>Po pierwsze, wa\u017cne jest zrozumienie dw\u00f3ch poj\u0119\u0107:<\/p>\n<ol>\n<li>parametryzacja,<\/li>\n<li>kolumna_tablicy<\/li>\n<\/ol>\n<p>To jest sedno tego, w jaki spos\u00f3b pisz\u0119 moje zapytania i pracuj\u0119 z ich wynikami.<\/p>\n<h3>1 Parametryzacja<\/h3>\n<p>Mo\u017cesz przeczyta\u0107 wi\u0119cej na ten temat w Kodeksie, ale parametryzacja to spos\u00f3b, w jaki jeste\u015bmy w stanie pisa\u0107 zapytania, kt\u00f3re zapobiegaj\u0105 wstrzykiwaniu SQL.<\/p>\n<p><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Protect_Queries_Against_SQL_Injection_Attacks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ze strony Kodeksu<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Wszystkie dane w zapytaniach SQL musz\u0105 zosta\u0107 poddane kodowaniu SQL przed wykonaniem zapytania SQL, aby zapobiec atakom typu SQL injection. Metoda <code>prepare<\/code>realizuje t\u0119 funkcjonalno\u015b\u0107 dla WordPressa, kt\u00f3ry obs\u0142uguje zar\u00f3wno sk\u0142adni\u0119 podobn\u0105 do <a href=\"https:\/\/php.net\/sprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf()<\/a>, jak i do <a href=\"https:\/\/php.net\/vsprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vsprintf() .<\/a><\/p>\n<\/blockquote>\n<p>Oznacza to, \u017ce metoda obs\u0142uguje tokeny, takie jak <strong>%s<\/strong>, <strong>%d<\/strong> i <strong>%f<\/strong> podczas przekazywania informacji do zapytania. Przyk\u0142ad tego poka\u017c\u0119 w dalszej cz\u0119\u015bci postu.<\/p>\n<h3>2 Praca z kolumnami tablicy<\/h3>\n<p>Wyniki takich zapyta\u0144 mog\u0105 by\u0107 zwracane na wiele r\u00f3\u017cnych sposob\u00f3w. Mianowicie jako obiekt, tablica indeksowana numerycznie lub tablica asocjacyjna. Cz\u0119\u015bciej ni\u017c nie, lubi\u0119 u\u017cywa\u0107 tablic (i poka\u017c\u0119, jak to zrobi\u0107 w WordPressie w dalszej cz\u0119\u015bci tego postu).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162387-61e73d7998688.png\" 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-162387-61e73d7998688.png\" alt=\"Punkt do pracy z zapytaniami do bazy danych w WordPress\" ><\/a><\/p>\n<p>Powodem jest jednak to, \u017ce mog\u0119 skorzysta\u0107 z <a href=\"https:\/\/php.net\/manual\/en\/function.array-column.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_column<\/a>. Z instrukcji PHP:<\/p>\n<blockquote>\n<p>array_column() zwraca warto\u015bci z pojedynczej kolumny danych wej\u015bciowych, identyfikowanej przez column_key. Opcjonalnie, index_key mo\u017ce by\u0107 dostarczony do indeksowania warto\u015bci w zwr\u00f3conej tablicy przez warto\u015bci z kolumny index_key tablicy wej\u015bciowej.<\/p>\n<\/blockquote>\n<p>Oznacza to, \u017ce je\u015bli masz tablic\u0119 i zawiera ona kilka wynik\u00f3w, z kt\u00f3rych ka\u017cdy ma t\u0119 sam\u0105 kolumn\u0119, mo\u017cesz \u0142atwo po prostu przekaza\u0107 informacje, przekazuj\u0105c tablic\u0119 do metody, a nast\u0119pnie przekazuj\u0105c nazw\u0119 kolumny do metody.<\/p>\n<p>Wynik? Numerycznie indeksowana tablica warto\u015bci. To znacznie u\u0142atwia iteracj\u0119 danych przez <a href=\"https:\/\/php.net\/manual\/en\/function.array-map.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_map<\/a><strong>,<\/strong> u\u017cywaj\u0105c <strong><a href=\"https:\/\/php.net\/manual\/en\/control-structures.for.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">for<\/a><\/strong> lub <strong><a href=\"https:\/\/php.net\/manual\/en\/control-structures.foreach.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">foreach<\/a><\/strong>.<\/p>\n<h2>Skr\u00f3t do przeszukiwania bazy danych<\/h2>\n<p>Maj\u0105c to uzasadnienie, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-00-query-stub-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oto skr\u00f3t<\/a><\/strong>, kt\u00f3rego zwykle u\u017cywam, gdy pracuj\u0119 bezpo\u015brednio z zapytaniami do bazy danych:<\/p>\n<pre><code>&lt;?php\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        \",\n        $userId\n    ),\n    ARRAY_A\n);\n\nif (empty($results)) {\n  return;\n}\n$results = array_map($results, 'column_name');<\/code><\/pre>\n<p>A oto przyk\u0142ad z kilkoma r\u00f3\u017cnymi informacjami, dzi\u0119ki czemu mo\u017cesz zobaczy\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-01-example-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, jak to dzia\u0142a<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT\n            user_id,\n            meta_value\n        FROM $wpdb-&gt;usermeta\n        WHERE meta_key LIKE %s\n        AND user_id = %d\n        \",\n        '%wc_authorize_net_cim_customer_profile_id%',\n        wp_get_current_user()-&gt;ID;\n    ),\n    ARRAY_A\n);\n\nif (empty($results)) {\n    return [];\n}\n$results = array_map($results, 'meta_value');<\/code><\/pre>\n<p><strong>Zapytanie o tabel\u0119 wp_user_meta<\/strong> mo\u017ce wydawa\u0107 si\u0119 g\u0142upie, poniewa\u017c get_user_meta jest prawid\u0142ow\u0105 funkcj\u0105 API, ale pomy\u015bla\u0142em, \u017ce b\u0119dzie to \u0142atwe zapytanie do zrozumienia, bior\u0105c pod uwag\u0119 to, co pr\u00f3buj\u0119 wyja\u015bni\u0107 w przesz\u0142o\u015bci.<\/p>\n<p>W ka\u017cdym razie nie mog\u0119 poda\u0107 zapytania ani poradzi\u0107 sobie z przypadkiem, w kt\u00f3rym wyniki mog\u0105 wr\u00f3ci\u0107 z wieloma kolumnami (w takim przypadku b\u0119dziesz musia\u0142 pracowa\u0107 z czym\u015b innym ni\u017c <strong>array_map<\/strong>, ale to powinno by\u0107 wystarczaj\u0105co \u0142atwe, prawda? )<\/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>Istnieje sp\u00f3jny spos\u00f3b, w jaki przeszukuj\u0119 baz\u0119 danych WordPress. Poniewa\u017c zdarzaj\u0105 si\u0119 sytuacje, w kt\u00f3rych robi\u0119 to cz\u0119\u015bciej, ostatnio, oto podstawowy format pracy z zapytaniami do bazy danych w WordPress.<\/p>\n","protected":false},"author":1,"featured_media":235713,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-230235","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230235","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=230235"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230235\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/235713"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}