{"id":230986,"date":"2022-12-25T16:05:00","date_gmt":"2022-12-25T13:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230986"},"modified":"2022-12-07T11:07:49","modified_gmt":"2022-12-07T08:07:49","slug":"jak-manipulowac-dom-za-pomoca-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jak-manipulowac-dom-za-pomoca-php\/","title":{"rendered":"Jak manipulowa\u0107 DOM za pomoc\u0105 PHP"},"content":{"rendered":"\n<p>Je\u015bli chodzi o manipulowanie DOM, pierwsz\u0105 rzecz\u0105, o kt\u00f3rej wielu z nas prawdopodobnie pomy\u015bli, jest u\u017cycie JavaScript do robienia tego, co musimy zrobi\u0107.<\/p>\n<p>J\u0119zyk nie tylko natywnie obs\u0142uguje funkcje do tego celu, ale nowsze funkcje <a href=\"http:\/\/es6-features.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ES6<\/a> daj\u0105 nam bardziej zaawansowane sposoby tworzenia skrypt\u00f3w po stronie klienta. A je\u015bli u\u017cywasz <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery<\/a> z WordPressem, masz tak\u0105 sam\u0105 bibliotek\u0119 funkcji do, hm, odpytywania DOM, kt\u00f3r\u0105 mamy od lat.<\/p>\n<p>Ale manipulowanie DOM po stronie klienta nie zawsze jest najlepsz\u0105 opcj\u0105. Zamiast tego mo\u017cesz to zrobi\u0107 po stronie serwera. A ze wzgl\u0119du na niekt\u00f3re funkcje wbudowane w PHP, nie r\u00f3\u017cni si\u0119 on zbytnio od tego, jak robimy rzeczy przy u\u017cyciu JavaScript.<\/p>\n<p>Poza tym oczywi\u015bcie robimy to na serwerze.<\/p>\n<p>Wi\u0119c je\u015bli kiedykolwiek pracujesz z tre\u015bci\u0105 posta (typ posta lub niestandardowy typ posta, je\u015bli o to chodzi) i musisz manipulowa\u0107 tagami podobnie jak w przypadku JavaScript, u\u017cycie <code>DomDocument<\/code>biblioteki jest jednym z najpot\u0119\u017cniejszych narz\u0119dzia s\u0105 do Twojej dyspozycji.<\/p>\n<p>Za\u0142\u00f3\u017cmy na przyk\u0142ad, \u017ce chcesz przej\u015b\u0107 przez wszystkie elementy akapitu, kt\u00f3re istniej\u0105 w tre\u015bci posta.<\/p>\n<p>\u0141atwo to zrobi\u0107 za pomoc\u0105 wspomnianej biblioteki. Najpierw <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-00-use-dom-document-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">upewnij si\u0119, \u017ce masz skonfigurowan\u0105 bibliotek\u0119<\/a> w swojej klasie (lub po prostu w swojej kolekcji funkcji):<\/p>\n<p>Nast\u0119pnie skonfiguruj <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-01-the-content-hook-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hak dla tre\u015bci:<\/a><\/p>\n<pre><code>&lt;?php\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');<\/code><\/pre>\n<p>W ramach tej funkcji upewnij si\u0119, \u017ce za\u0142adowa\u0142e\u015b tre\u015b\u0107 posta do biblioteki, a nast\u0119pnie poszukaj wszystkich <code>p<\/code>element\u00f3w, podobnie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-02-update-the-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jak przy u\u017cyciu JavaScript<\/a> (z jedn\u0105 wa\u017cn\u0105 uwag\u0105, \u017ce musisz poprawnie zakodowa\u0107 informacje na wypadek, gdyby indeksy g\u00f3rne lub emotikony by\u0142y u\u017cywany):<\/p>\n<pre><code>&lt;?php\n\nfunction updateParagraphElements($content) \n{\n    \/* If we're not on a single page or it's not the main query, \n     * we won't do anything.\n     *\/\n    if (!is_single() || !is_main_query()) {\n        return $content;\n    }\n\n    \/\/ Make sure there is content to parse (and properly encode the HTML entities).\n    $domDocument = new DOMDocument();\n    $domContent = $domDocument-&gt;loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));\n    if (false === $domContent) {\n        return $content;\n    }\n\n    $paragraphs = $domDocument-&gt;getElementsByTagName('p');\n    if (0 === count($paragraphs)) {\n        return $content;\n    }\n\n    \/\/ More to come...\n}<\/code><\/pre>\n<p>Z tego miejsca mo\u017cesz zrobi\u0107 kilka r\u00f3\u017cnych rzeczy, takich jak dodanie identyfikatora posta do niestandardowego atrybutu ka\u017cdego elementu akapitu. Pe\u0142na funkcja wygl\u0105da\u0142aby wtedy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-04-full-code-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mniej wi\u0119cej tak:<\/a><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nuse DOMDocument;\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');\n\/**\n * Updates the content by locating all of the `p` elements in the content,\n * then adds a class attribute of the post ID to them.\n *\n * The gist of the work is done in this function.\n *\n * @param string $content the post content\n *\n * @return string the updated post content with the aforemented markup.\n *\/\nfunction updateParagraphElements($content) \n{\n    \/* If we're not on a single page or it's not the main query, \n     * we won't do anything.\n     *\/\n    if (!is_single() || !is_main_query()) {\n        return $content;\n    }\n\n    \/\/ Make sure there is content to parse (and properly encode the HTML entities).\n    $domDocument = new DOMDocument();\n    $domContent = $domDocument-&gt;loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));\n    if (false === $domContent) {\n        return $content;\n    }\n\n    $paragraphs = $domDocument-&gt;getElementsByTagName('p');\n    if (0 === count($paragraphs)) {\n        return $content;\n    }\n\n    \/\/ If so, iterate through the elements and add the post ID as a custom attribute.\n    $updatedContent = '';\n    foreach ($paragraphs as $paragraph) {\n        $paragraph-&gt;setAttribute('data-id', get_the_ID());\n    }\n\n    return wp_kses_post($domDocument-&gt;saveHTML());\n}<\/code><\/pre>\n<p>Oczywi\u015bcie s\u0105 te\u017c inne rzeczy, kt\u00f3re mo\u017cesz zrobi\u0107. Jedn\u0105 rzecz\u0105 jest manipulowanie znacznikami przed wys\u0142aniem ich do przegl\u0105darki. Inn\u0105 rzecz\u0105 jest jednak dodawanie atrybut\u00f3w do danych, je\u015bli jeszcze nie istniej\u0105.<\/p>\n<p>To znaczy, \u017cadna gra s\u0142\u00f3w nie przeznaczona \u2013 z wyj\u0105tkiem mo\u017ce tylko pewnego rodzaju \u2013 tre\u015bci do innego posta.<\/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>Manipulowanie DOM po stronie klienta nie zawsze jest najlepsz\u0105 opcj\u0105. Mo\u017cemy to zrobi\u0107 za pomoc\u0105 wbudowanych funkcji PHP.<\/p>\n","protected":false},"author":1,"featured_media":236123,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,836,866],"tags":[1169],"class_list":["post-230986","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-przewodnik-dla-poczatkujacych","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230986","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=230986"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230986\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}