✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Muokkaa kuvasäiliöitä palvelinpuolella WordPressissä

9

Aina kun rakennat mukautettuja ratkaisuja muille ihmisille, saatat joutua käsittelemään vivahteita, kuinka WordPress renderöi sisältöä.

Tämä johtuu yleensä teemasta, vähintään yhdestä laajennuksesta tai molempien yhdistelmästä. Ja jos sinun on työskenneltävä kuvien kanssa erikseen, se voi olla pieni haaste. Ongelma edes yrittää kirjoittaa tällaista viestiä on, että on vaikea edes kuvata tilannetta, jossa saatat tarvita jotain tällaista.

Silti aion tehdä parhaani. Toisin sanoen haluan kertoa kuinka muokata kuvasäilöjä palvelinpuolella ennen niiden renderöimistä asiakaspuolella ja tehdä se PHP:n DOMDocument-kirjaston avulla.

Kuulostaako paljon? Toivottavasti pystyn rikkomaan tämän riittävän helposti.

Oletetaan ennen koodiin perehtymistä, että sinulla on ne, jotka renderöivät kuvat yhdessä kappaleelementissä (tai missä tahansa lohkotason elementissä) ja sinun on käärittävä jokainen elementti jonkin tyyppiseen luokkaan, jotta voit käyttää niitä se CSS:n tai JavaScriptin kautta.

Missä olemme

Joten aluksi, oletetaan, että kuvat näkyvät seuraavasti:

Ja sinun täytyy hahmontaa ne näin:

Muokkaa kuvasäiliöitä palvelinpuolella WordPressissä

Nyt saatat tarvita tai et tarvitse tilaa niiden väliin. Sillä ei ole väliä, koska voit hallita tätä CSS:n kautta. Mutta voit hallita sitä, kuinka tämä lähetetään langan kautta asiakaspuolelle.

Tätä varten tarvitset muutaman asian:

  • Pääsy PHP:n DOMDocument-kirjastoon,
  • Ymmärtää kuinka käsitellä sisältöä WordPressin the_content koukun avulla,
  • Strategia siitä, miten haluat kääriä kuvat.

Käyn läpi kaikki nämä koodissa, mutta riittää, kun sanon, että aion kääriä jokaisen kuvan kappaleelementtiin. Voit tietysti valita tehdä mitä haluat.

Kuinka tehdä se

Varmista ensin, että olet ilmoittanut käyttäväsi DOM-asiakirjan sisältöä luokkasi yläpuolella :

<?php

namespace Acme;

use DOMDocument;

class AcmeContentSubscriber
{
  // ...
}

Siirry seuraavaksi ja luo koukku the_content -tiedostoon. Kuinka teet tämän, riippuu siitä, kuinka olet järjestänyt koodisi (olipa se sitten OOP tai ei). Tässä esimerkissä aion näyttää hyvin yksinkertaisen esimerkin siitä, kuinka se tehdään :

<?php

public function contentSubscriber()
{
  add_action( 'the_content', [$this, 'addImageAttributes']);
}

Sen jälkeen sinun on tehtävä vähän työtä (joka kaikki on alla, mutta tämän viestin ulkopuolella). Tämä sisältää:

  • muuntaa HTML-kokonaisuuksien koodausta,
  • luoda DOM-asiakirjan esiintymä,
  • lataamalla viestin HTML-koodi saapuvasta sisällöstä

Koodissa sen pitäisi näyttää tältä :

<?php

public function addImageAttributes($content)
{

    $content  = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
    $document = new DOMDocument();

    libxml_use_internal_errors(true);
    $document->loadHTML(utf8_decode($content));

    // ...
}

Seuraavaksi sinun on toistettava img – elementit ja varmistettava, että asetat oikean määritteen. Voit valita luokan käytön, dataattribuutin tai jonkin muun käytön. Tällä osuudella ei ole väliä.

Huomaa, että tietyn kuvan kohdalla sinun kannattaa tarkistaa, että seuraava elementti ei ole kappaleelementti, koska olen valinnut kuvan rivityksen sen. Toisin sanoen, jos seuraava elementti ei ole kappale, käärimme elementin kappaleelementtiin.

Tätä varten päätoiminnon rungon tulisi näyttää tältä :

<?php

public function addImageAttributes($content)
{

    $content  = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
    $document = new DOMDocument();

    libxml_use_internal_errors(true);
    $document->loadHTML(utf8_decode($content));

    $images = $document->getElementsByTagName('img');
    foreach ($images as $image) {
        $image->setAttribute('class', 'acme-iamge');
        if ($image->nextSibling->tagName !== 'p') {
            $this->wrapImage($document, $image);
        }
    }

    // ...
}

Tällöin elementin käärimisestä kappaleelementtiin vastaavan funktion pitäisi näyttää tältä :

<?php

/**
 * This function is used to wrap individual images in a paragraph element.
 *
 * @param $document The DOM Document which is to be rendered.
 * @param $image    The image to wrap with the new paragraph element.
 */
private function wrapImage($document, $image)
{
    if (null === $image) {
        return;
    }
    $wrapper = $document->createElement('p');
    $wrapper->setAttribute('class', 'acme-image');

    $image->parentNode->replaceChild($wrapper, $image);
    if (null !== $image) {
        $wrapper->appendChild($image);
    }
}

Muista lukea koodin DocBlock ymmärtääksesi, kuinka toiminto toimii. Yksinkertaisesti sanottuna:

  • se hyväksyy asiakirjan esiintymän ja kuvaelementin,
  • luo kappaleelementin,
  • lisää luokkaattribuutin
  • korvaa alkuperäisen kuvaelementin kappaleella,
  • ja lisää kuvan lapsielementiksi

Ja koska olemme perustaneet asiakirjaobjektin menetelmään, meidän ei tarvitse palauttaa mitään.

Alkuperäisen funktion lopullisen version pitäisi näyttää tältä :

<?php

public function addImageAttributes($content)
{

    $content  = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
    $document = new DOMDocument();

    libxml_use_internal_errors(true);
    $document->loadHTML(utf8_decode($content));

    $images = $document->getElementsByTagName('img');
    foreach ($images as $image) {
        $image->setAttribute('class', 'acme-image');
        if ($image->nextSibling->tagName !== 'p') {
            $this->wrapImage($document, $image);
        }
    }

  return $document->saveHTML();
}

Ja tulostesi pitäisi näyttää yllä olevalta kuvalta. Muista kuitenkin; Sinun on palautettava asiakirjainstanssin tulokset WordPressiin, jotta se hahmontaa HTML-koodin oikein. Ja sitä saveHTML- toiminto tekee yllä olevassa koodissa.

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen