Aeg-ajalt, kui töötan juba olemasoleva lähtekoodiga või teostan koodiauditit, näen ma teisi muutmas postitusobjekti postituse sisu, näiteks järgmiselt :
<?php
$post->post_content = $my_content;
Siinkohal langevad mõned vahele ja ütlevad kohe, et teete seda valesti. Ma vihkan seda fraasi (ja seda on isegi WordPressi koodibaasis risustatud, kuid ma kaldun kõrvale).
Andmete puhastamiseks enne atribuudi post_content väärtusega võrdsustamist on võimalik kasutada muid olemasolevaid WordPress API funktsioone. Nende funktsioonide kasutamine pole selleks parim viis.
Selle asemel peaksime kõik kasutama filtreid apply_filters. Probleem? Mõned ei tea, mõned ei tea, kuidas see töötab, ja mõned ei tea, kuidas seda kasutada. See tähendab, et pole selge, kuidas postituse sisu õigesti filtreerida.
WordPressi filtreeritud töötlemata sisu, mis seejärel andmebaasi kirjutatud.
Kuid neile, kes võivad kuuluda mõnda ülaltoodud kategooriasse, võib see aidata.
Postituse sisu õige filtreerimine
Siinkohal eeldan, et teate WP_Posti, selle atribuutide ja nende muutmise kohta erinevate API funktsioonide kaudu.
Peamine probleem, millest ma räägin, on tagada, et andmebaasi kirjutatav sisu oleks vormindatud samamoodi nagu WordPress teeks seda postitust kirjutades või värskendades.
Ja viis, mis juhtub, on järgmine (ja me jõuame selle üksikasjade juurde varsti):
<?php
/**
* Assume $contents is an array of information we want to convert into content for a post.
*/
$new_content = '';
foreach ($contents as $line) {
if (false === strpos( $line, $name)) {
$new_content .= $line;
}
}
$post->post_content = apply_filters( 'the_content', $new_content );
Kuid küsimused, mida see funktsioon teeb, kuidas see töötab ja millal seda kasutada, jäävad alles.
Mis on rakendus_filtrid?
Muidugi saate seda kõike lugeda arendaja ressurssidest ja see annab järgmise definitsiooni :
Helistage filtrikonksule lisatud funktsioonidele.
Kuid see ei aita alati. Ma mõtlen, et saame dokumentatsiooni lugeda ja ikkagi segaduses minema kõndida, eks?
Mõelge sellele järgmiselt:
- Filter on funktsioon, mis aktsepteerib töötlemiseks sisendit.
- Sisend töödeldakse funktsiooni definitsiooni alusel.
- Seejärel tagastab funktsioon töödeldud väärtuse.
See, mida te tagastatud väärtusega ette võtate, on teie otsustada, kuid kui rakendate filtrit või helistate teabejupile käsule apply_filters, ütlete WordPressile: „Mul on see teave olemas, rakendage selle võtmega tuvastatud filter ja andke tulemus mulle tagasi."
Pole paha, eks?
Kuidas see töötab?
Kuid üks osa ülaltoodust viib küsimuseni. Täpsemalt mainin, et "…palun rakendage selle võtmega tuvastatud filtrit…" ja võtme idee võib olla segadusttekitav, eriti kuna filtri või toimingu või üldisemalt öeldes konksu saab tuvastada nn märgendi või võti.
Need on sünonüümid. Seega, kui näete konksu kontekstis märgendit või võtit, käsitlege neid sellisena.
Seda öeldes toimib see järgmiselt.
- Funktsioon apply_filters aktsepteerib kahte argumenti. Esimene on silt või võti (olenevalt sellest, kuidas soovite seda nimetada), mis on seotud filtriga (loe: funktsiooniga), mida soovite töö töötlemiseks kasutada, teine on väärtus, mida soovite selle funktsiooni sees töödelda.
- Filter käivitub ja tagastab tulemuse (või pidage meeles, meie määratletud funktsiooni).
- Seejärel võtame tagastatud väärtuse ja rakendame seda mis tahes kinnisvarale, mida soovime.
Näiteks näete tõenäoliselt midagi sellist kellegi teise (või võib-olla isegi enda) koodibaasis:
<?php
$post->post_content = apply_filters( 'the_content', $my_content );
Ja nüüd, kui teil on natuke konteksti selle toimimiseks, saate idee aru, eks?
Kuidas me seda kasutame?
See toob postituse täisringi esialgse küsimuseni, kuidas saame kasutada parameetrit apply_filters post_content jaoks, kui meil on vaja postitust sisestada või värskendada.
Oletame, et teil on sisu, mida soovite postituse sisu väärtusele rakendada (või lisada). Võite teha midagi sellist :
<?php
/**
* Assume $contents is an array of information we want to convert into content for a post.
*/
$new_content = '';
foreach ($contents as $line) {
if (false === strpos( $line, $name)) {
$new_content .= $line;
}
}
$post->post_content = $new_content;
Aga see on halb vorm. Selle asemel teete seda :
<?php
/**
* Assume $contents is an array of information we want to convert into content for a post.
*/
$new_content = '';
foreach ($contents as $line) {
if (false === strpos( $line, $name)) {
$new_content .= $line;
}
}
$post->post_content = apply_filters( 'the_content', $new_content );
Ja nii teeb WordPress seda.
Järeldus
Arvestades kogu ülaltoodud teavet ja koodi, peaksite olema hästi relvastatud mitte ainult selleks, et tagada andmebaasi sisestatavate andmete õige filtreerimine, vaid ka teadmised, mida on vaja filtrite määratlemiseks ja nende rakendamiseks. mis tahes teie arvates sobivaid andmeid.
Kuid selle näited on mõne teise postituse sisu.
Vahepeal, kui töötate postituse sisuga, veenduge, et filtreeriksite andmed enne andmebaasi kandmist korralikult.