{"id":228717,"date":"2022-11-01T14:22:00","date_gmt":"2022-11-01T11:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228717"},"modified":"2022-11-09T03:59:57","modified_gmt":"2022-11-09T00:59:57","slug":"prawidlowe-filtrowanie-tresci-posta-i-zrozumienie-apply_filters","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/prawidlowe-filtrowanie-tresci-posta-i-zrozumienie-apply_filters\/","title":{"rendered":"Prawid\u0142owe filtrowanie tre\u015bci posta (i zrozumienie Apply_filters)"},"content":{"rendered":"\n<p>Od czasu do czasu, gdy pracuj\u0119 z istniej\u0105cym kodem \u017ar\u00f3d\u0142owym lub przeprowadzam audyt kodu, widz\u0119, \u017ce inni modyfikuj\u0105 tre\u015b\u0107 postu obiektu postu w <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-00-my_content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ten<\/a> spos\u00f3b :<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = $my_content;\n<\/code><\/pre>\n<p>W tym momencie niekt\u00f3rzy wpadn\u0105 i od razu powiedz\u0105, \u017ce robisz to \u017ale. Nienawidz\u0119 tego wyra\u017cenia (i jest nawet za\u015bmiecone w ca\u0142ym kodzie WordPressa, ale robi\u0119 dygresj\u0119).<\/p>\n<p>Istniej\u0105 sposoby na wykorzystanie innych istniej\u0105cych funkcji API WordPress do oczyszczenia danych przed ustawieniem ich na warto\u015b\u0107 atrybutu <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Post\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post_content<\/a>. Korzystanie z tych funkcji nie jest najlepszym sposobem na zrobienie tego.<\/p>\n<p>Zamiast tego wszyscy powinni\u015bmy u\u017cywa\u0107 Apply_filters. Problem? Niekt\u00f3rzy nie wiedz\u0105, niekt\u00f3rzy nie wiedz\u0105, jak to dzia\u0142a, a niekt\u00f3rzy nie wiedz\u0105, jak go u\u017cywa\u0107. Oznacza to, \u017ce nie jest jasne, jak prawid\u0142owo filtrowa\u0107 tre\u015bci post\u00f3w.<\/p>\n<p>Surowa tre\u015b\u0107 przefiltrowana przez WordPress, a nast\u0119pnie zapisana do bazy danych.<\/p>\n<p>Ale dla tych, kt\u00f3rzy mog\u0105 nale\u017ce\u0107 do kt\u00f3rejkolwiek z powy\u017cszych kategorii, by\u0107 mo\u017ce to mo\u017ce pom\u00f3c.<\/p>\n<h2>Prawid\u0142owe filtrowanie tre\u015bci post\u00f3w<\/h2>\n<p>W tym momencie zak\u0142adam, \u017ce wiesz ju\u017c o <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Post<\/a>, jego w\u0142a\u015bciwo\u015bciach i sposobach ich modyfikacji za pomoc\u0105 r\u00f3\u017cnych funkcji API.<\/p>\n<p>Podstawowym problemem, o kt\u00f3rym m\u00f3wi\u0119, jest upewnienie si\u0119, \u017ce tre\u015b\u0107, kt\u00f3ra zostanie zapisana do bazy danych, jest sformatowana w taki sam spos\u00f3b, w jaki zrobi\u0142by to WordPress, gdyby\u015b pisa\u0142 lub aktualizowa\u0142 post.<\/p>\n<p>Spos\u00f3b, w jaki to si\u0119 dzieje, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wygl\u0105da nast\u0119puj\u0105co<\/a> (a wkr\u00f3tce przejdziemy do szczeg\u00f3\u0142\u00f3w):<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Pozostaj\u0105 jednak pytania, do czego s\u0142u\u017cy ta funkcja, jak dzia\u0142a i kiedy z niej korzysta\u0107.<\/p>\n<h3>Co to jest zastosowanie_filtr\u00f3w?<\/h3>\n<p>Oczywi\u015bcie, mo\u017cesz przeczyta\u0107 o tym wszystkim w zasobach dla programist\u00f3w i zawiera ona <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u0119 definicj\u0119<\/a> :<\/p>\n<blockquote>\n<p>Wywo\u0142aj funkcje dodane do haka filtra.<\/p>\n<\/blockquote>\n<p>Ale to nie zawsze pomaga. Chodzi mi o to, \u017ce mo\u017cemy przeczyta\u0107 dokumentacj\u0119 i nadal odej\u015b\u0107 zdezorientowani, prawda?<\/p>\n<p>Pomy\u015bl o tym w ten spos\u00f3b:<\/p>\n<ol>\n<li>Filtr to funkcja, kt\u00f3ra przyjmuje dane wej\u015bciowe do przetwarzania.<\/li>\n<li>Dane wej\u015bciowe s\u0105 przetwarzane na podstawie definicji funkcji.<\/li>\n<li>Funkcja nast\u0119pnie zwraca przetworzon\u0105 warto\u015b\u0107.<\/li>\n<\/ol>\n<p>To, co zrobisz ze zwr\u00f3con\u0105 warto\u015bci\u0105, zale\u017cy od Ciebie, ale kiedy zastosujesz filtr lub wywo\u0142asz <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apply_filters<\/a> do informacji, m\u00f3wisz WordPressowi: \u201eMam te informacje, zastosuj filtr zidentyfikowany przez ten klucz i przeka\u017c wynik z powrotem do mnie.&quot;<\/p>\n<p>Nie\u017ale, prawda?<\/p>\n<h3>Jak to dzia\u0142a?<\/h3>\n<p>Ale jest jedna cz\u0119\u015b\u0107 powy\u017cszego, kt\u00f3ra prowadzi do pytania. W szczeg\u00f3lno\u015bci wspominam, \u017ce \u201e\u2026prosz\u0119 zastosowa\u0107 filtr identyfikowany przez ten klucz\u2026&quot;, a pomys\u0142 z kluczem mo\u017ce by\u0107 myl\u0105cy, zw\u0142aszcza \u017ce filtr lub akcja lub, bardziej og\u00f3lnie m\u00f3wi\u0105c, zaczep mo\u017cna zidentyfikowa\u0107 za pomoc\u0105 tego, co nazywa si\u0119 tagiem lub klucz.<\/p>\n<p>S\u0105 synonimami. Wi\u0119c kiedy widzisz <strong>tag<\/strong> lub <strong>klucz<\/strong> w kontek\u015bcie haka, traktuj je jako takie.<\/p>\n<p>Powiedziawszy to, oto jak to dzia\u0142a:<\/p>\n<ol>\n<li>Funkcja Apply_filters przyjmuje dwa argumenty. Pierwszy to tag lub klucz (w zale\u017cno\u015bci od tego, jak chcesz go nazwa\u0107) powi\u0105zany z filtrem (czytaj: funkcja), kt\u00f3rego chcesz u\u017cy\u0107 do przetwarzania pracy, drugi to warto\u015b\u0107, kt\u00f3r\u0105 chcesz przetworzy\u0107 w ramach tej funkcji.<\/li>\n<li>Filtr uruchomi si\u0119 i zwr\u00f3ci wynik (lub, pami\u0119taj, funkcj\u0119, kt\u00f3r\u0105 zdefiniowali\u015bmy).<\/li>\n<li>Nast\u0119pnie pobieramy zwr\u00f3con\u0105 warto\u015b\u0107 i stosujemy j\u0105 do dowolnej w\u0142a\u015bciwo\u015bci.<\/li>\n<\/ol>\n<p>Na przyk\u0142ad prawdopodobnie zobaczysz co\u015b <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-01-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">takiego<\/a> w kodzie kodu innej osoby (a mo\u017ce nawet w swoim):<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = apply_filters( 'the_content', $my_content );\n<\/code><\/pre>\n<p>A teraz, gdy masz troch\u0119 kontekstu, jak to dzia\u0142a, masz pomys\u0142, prawda?<\/p>\n<h3>Jak tego u\u017cywamy?<\/h3>\n<p>To sprawia, \u017ce \u200b\u200bpost zatacza pe\u0142ne ko\u0142o do pocz\u0105tkowego pytania, w jaki spos\u00f3b mo\u017cemy u\u017cy\u0107 apply_filters do post_content, gdy musimy wstawi\u0107 lub zaktualizowa\u0107 post.<\/p>\n<p>Za\u0142\u00f3\u017cmy wi\u0119c, \u017ce masz tre\u015b\u0107, kt\u00f3r\u0105 chcesz zastosowa\u0107 (lub do\u0142\u0105czy\u0107) do warto\u015bci tre\u015bci posta. Mo\u017cesz zrobi\u0107 co\u015b <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-02-dont-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">takiego<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = $new_content;\n<\/code><\/pre>\n<p>Ale to z\u0142a forma. Zamiast tego <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">robisz to<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>I tak robi to WordPress.<\/p>\n<h2>Wniosek<\/h2>\n<p>Bior\u0105c wi\u0119c pod uwag\u0119 wszystkie powy\u017csze informacje i kod, powiniene\u015b by\u0107 dobrze uzbrojony nie tylko po to, aby upewni\u0107 si\u0119, \u017ce prawid\u0142owo filtrujesz dane, kt\u00f3re zostan\u0105 wstawione do bazy danych, ale masz wiedz\u0119 potrzebn\u0105 do zdefiniowania filtr\u00f3w i zastosowania ich do wszelkie dane, kt\u00f3re uwa\u017casz za stosowne.<\/p>\n<p>Ale przyk\u0142ady na to s\u0105 tre\u015bci\u0105 dla innego postu.<\/p>\n<p>W mi\u0119dzyczasie, je\u015bli pracujesz z tre\u015bci\u0105 posta, upewnij si\u0119, \u017ce odpowiednio filtrujesz dane przed umieszczeniem ich w bazie danych.<\/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>Je\u015bli programowo wstawiasz lub aktualizujesz posty, wa\u017cne jest, aby upewni\u0107 si\u0119, \u017ce odpowiednio filtrujesz tre\u015b\u0107 posta.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,866,815],"tags":[1169],"class_list":["post-228717","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-wordpress-7","category-wtyczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228717","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=228717"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228717\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228717"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228717"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}