✅ WEB- ja WordPress -uutiset, -teemat, -laajennukset. Täällä jaamme vinkkejä ja parhaita verkkosivustoratkaisuja.

Kuinka käsitellä DOM:ta PHP:n avulla

15

Mitä tulee DOM:n manipuloimiseen, ensimmäinen asia, jota monet meistä todennäköisesti ajattelevat, on JavaScriptin käyttäminen sen tekemiseen.

Kieli tukee alkuperäisiä toimintoja tämän tekemiseen, vaan ES6 :n uudemmat ominaisuudet antavat meille tehokkaampia tapoja rakentaa asiakaspuolen komentosarjoja. Ja jos käytät jQueryä WordPressin kanssa, sinulla on sama funktiokirjasto DOM-kyselyyn, joka meillä on ollut vuosia.

Mutta DOM:n manipulointi asiakaspuolella ei ole aina paras vaihtoehto. Sen sijaan voit tehdä sen palvelinpuolella. Ja johtuen joistakin PHP:n sisäänrakennetuista ominaisuuksista, se ei juurikaan eroa siitä, miten teemme asioita JavaScriptin avulla.

Muuten kuin tietysti teemme niin palvelimella.

Joten jos työskentelet joskus julkaisun sisällön parissa (tekstityyppi tai mukautettu viestityyppi) ja joudut käsittelemään tunnisteita samalla tavalla kuin JavaScriptin kanssa, DomDocumentkirjaston käyttö on yksi tehokkaimmista työkalut ovat käytettävissäsi.

Oletetaan esimerkiksi, että haluat iteroida kaikki tekstin sisällössä olevat kappaleelementit.

Tämä on helppo tehdä käyttämällä mainittua kirjastoa. Ensin sinun kannattaa varmistaa, että kirjasto on määritetty luokassasi (tai vain funktiokokoelmassasi):

Aseta seuraavaksi koukku sisällölle:

<?php

add_filter('the_content', __NAMESPACE__. 'updateParagraphElements');

Ja tässä toiminnossa, varmista, että lataat viestin sisältö kirjastoon ja etsi sitten kaikki pelementit aivan kuten käyttäisit JavaScriptiä (eräs tärkeä huomautus on, että sinun on koodattava tiedot oikein, jos yläindeksit tai emojit ovat käytetty):

<?php

function updateParagraphElements($content) 
{
    /* If we're not on a single page or it's not the main query, 
     * we won't do anything.
     */
    if (!is_single() || !is_main_query()) {
        return $content;
    }

    // Make sure there is content to parse (and properly encode the HTML entities).
    $domDocument = new DOMDocument();
    $domContent = $domDocument->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));
    if (false === $domContent) {
        return $content;
    }

    $paragraphs = $domDocument->getElementsByTagName('p');
    if (0 === count($paragraphs)) {
        return $content;
    }

    // More to come...
}

Täältä voit tehdä useita eri asioita, kuten lisätä viestitunnuksen kunkin kappaleelementin mukautettuun määritteeseen. Täysi toiminto näyttäisi sitten tältä :

<?php

namespace Acme;

use DOMDocument;

add_filter('the_content', __NAMESPACE__. 'updateParagraphElements');
/**
 * Updates the content by locating all of the `p` elements in the content,
 * then adds a class attribute of the post ID to them.
 *
 * The gist of the work is done in this function.
 *
 * @param string $content the post content
 *
 * @return string the updated post content with the aforemented markup.
 */
function updateParagraphElements($content) 
{
    /* If we're not on a single page or it's not the main query, 
     * we won't do anything.
     */
    if (!is_single() || !is_main_query()) {
        return $content;
    }

    // Make sure there is content to parse (and properly encode the HTML entities).
    $domDocument = new DOMDocument();
    $domContent = $domDocument->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES'));
    if (false === $domContent) {
        return $content;
    }

    $paragraphs = $domDocument->getElementsByTagName('p');
    if (0 === count($paragraphs)) {
        return $content;
    }

    // If so, iterate through the elements and add the post ID as a custom attribute.
    $updatedContent = '';
    foreach ($paragraphs as $paragraph) {
        $paragraph->setAttribute('data-id', get_the_ID());
    }

    return wp_kses_post($domDocument->saveHTML());
}

Tietysti on myös muita asioita, joita voit tehdä. Yksi asia on käsitellä merkintöjä ennen sen lähettämistä selaimeen. Toinen asia on kuitenkin lisätä attribuutteja tietoihin, jos niitä ei vielä ole.

Eli ei sanamuotoilua tarkoitettu – paitsi ehkä vain tavallaan – sisältöä toiselle viestille.

Tämä verkkosivusto käyttää evästeitä parantaakseen käyttökokemustasi. Oletamme, että olet kunnossa, mutta voit halutessasi kieltäytyä. Hyväksyä Lisätietoja