{"id":231630,"date":"2022-12-25T16:30:00","date_gmt":"2022-12-25T13:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231630"},"modified":"2022-12-07T11:07:46","modified_gmt":"2022-12-07T08:07:46","slug":"kuinka-kaesitellae-dom-ta-php-n-avulla","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kuinka-kaesitellae-dom-ta-php-n-avulla\/","title":{"rendered":"Kuinka k\u00e4sitell\u00e4 DOM:ta PHP:n avulla"},"content":{"rendered":"\n<p>Mit\u00e4 tulee DOM:n manipuloimiseen, ensimm\u00e4inen asia, jota monet meist\u00e4 todenn\u00e4k\u00f6isesti ajattelevat, on JavaScriptin k\u00e4ytt\u00e4minen sen tekemiseen.<\/p>\n<p>Kieli tukee alkuper\u00e4isi\u00e4 toimintoja t\u00e4m\u00e4n tekemiseen, vaan <a href=\"http:\/\/es6-features.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ES6<\/a> :n uudemmat ominaisuudet antavat meille tehokkaampia tapoja rakentaa asiakaspuolen komentosarjoja. Ja jos k\u00e4yt\u00e4t <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery\u00e4<\/a> WordPressin kanssa, sinulla on sama funktiokirjasto DOM-kyselyyn, joka meill\u00e4 on ollut vuosia.<\/p>\n<p>Mutta DOM:n manipulointi asiakaspuolella ei ole aina paras vaihtoehto. Sen sijaan voit tehd\u00e4 sen palvelinpuolella. Ja johtuen joistakin PHP:n sis\u00e4\u00e4nrakennetuista ominaisuuksista, se ei juurikaan eroa siit\u00e4, miten teemme asioita JavaScriptin avulla.<\/p>\n<p>Muuten kuin tietysti teemme niin palvelimella.<\/p>\n<p>Joten jos ty\u00f6skentelet joskus julkaisun sis\u00e4ll\u00f6n parissa (tekstityyppi tai mukautettu viestityyppi) ja joudut k\u00e4sittelem\u00e4\u00e4n tunnisteita samalla tavalla kuin JavaScriptin kanssa, <code>DomDocument<\/code>kirjaston k\u00e4ytt\u00f6 on yksi tehokkaimmista ty\u00f6kalut ovat k\u00e4ytett\u00e4viss\u00e4si.<\/p>\n<p>Oletetaan esimerkiksi, ett\u00e4 haluat iteroida kaikki tekstin sis\u00e4ll\u00f6ss\u00e4 olevat kappaleelementit.<\/p>\n<p>T\u00e4m\u00e4 on helppo tehd\u00e4 k\u00e4ytt\u00e4m\u00e4ll\u00e4 mainittua kirjastoa. Ensin sinun kannattaa <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-00-use-dom-document-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">varmistaa, ett\u00e4 kirjasto on m\u00e4\u00e4ritetty<\/a> luokassasi (tai vain funktiokokoelmassasi):<\/p>\n<p>Aseta seuraavaksi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-01-the-content-hook-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koukku sis\u00e4ll\u00f6lle:<\/a><\/p>\n<pre><code>&lt;?php\n\nadd_filter('the_content', __NAMESPACE__. 'updateParagraphElements');<\/code><\/pre>\n<p>Ja t\u00e4ss\u00e4 toiminnossa, varmista, ett\u00e4 lataat viestin sis\u00e4lt\u00f6 kirjastoon ja etsi sitten kaikki <code>p<\/code>elementit aivan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-02-update-the-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kuten k\u00e4ytt\u00e4isit JavaScripti\u00e4<\/a> (er\u00e4s t\u00e4rke\u00e4 huomautus on, ett\u00e4 sinun on koodattava tiedot oikein, jos yl\u00e4indeksit tai emojit ovat k\u00e4ytetty):<\/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>T\u00e4\u00e4lt\u00e4 voit tehd\u00e4 useita eri asioita, kuten lis\u00e4t\u00e4 viestitunnuksen kunkin kappaleelementin mukautettuun m\u00e4\u00e4ritteeseen. T\u00e4ysi toiminto n\u00e4ytt\u00e4isi sitten t\u00e4lt\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5bd22e01487fd22df526c1a2e8687d13#file-04-full-code-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">:<\/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>Tietysti on my\u00f6s muita asioita, joita voit tehd\u00e4. Yksi asia on k\u00e4sitell\u00e4 merkint\u00f6j\u00e4 ennen sen l\u00e4hett\u00e4mist\u00e4 selaimeen. Toinen asia on kuitenkin lis\u00e4t\u00e4 attribuutteja tietoihin, jos niit\u00e4 ei viel\u00e4 ole.<\/p>\n<p>Eli ei sanamuotoilua tarkoitettu \u2013 paitsi ehk\u00e4 vain tavallaan \u2013 sis\u00e4lt\u00f6\u00e4 toiselle viestille.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>DOM:n manipulointi asiakaspuolella ei ole aina paras vaihtoehto. Voimme tehd\u00e4 sen k\u00e4ytt\u00e4m\u00e4ll\u00e4 PHP:n sis\u00e4\u00e4nrakennettuja ominaisuuksia.<\/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":[719,895,834,803,864],"tags":[1166],"class_list":["post-231630","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opas-aloittelijoille","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=231630"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231630\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}