Då och då, när jag arbetar med redan existerande källkod eller utför en kodgranskning, kommer jag att se andra ändra inläggsinnehållet i ett inläggsobjekt så här :
<?php
$post->post_content = $my_content;
Vid det här laget kommer några att komma in och omedelbart säga att du gör fel. Jag hatar den frasen (och den finns till och med överströdd i WordPress-kodbasen, men jag avviker).
Det finns sätt att använda andra befintliga WordPress API-funktioner för att rensa data innan du ställer in den lika med värdet på post_content- attributet, att använda dessa funktioner är inte det bästa sättet att göra det.
Istället borde vi alla använda application_filters. Problemet? Vissa vet inte, andra vet inte hur det fungerar och andra vet inte hur man använder det. Det är inte klart hur man ska gå tillväga för att filtrera inläggsinnehåll på rätt sätt.
Råinnehåll som filtrerats av WordPress och sedan skrivits till databasen.
Men för dem som kan falla inom någon av kategorierna ovan, så kanske detta kan hjälpa.
Korrekt filtrering av inläggsinnehåll
Vid det här laget antar jag att du känner till WP_Post, dess egenskaper och hur man ändrar dem genom olika API-funktioner.
Den primära frågan jag pratar om är att se till att innehållet som kommer att skrivas till databasen är formaterat på samma sätt som WordPress skulle göra det om du skulle skriva eller uppdatera ett inlägg.
Och sättet som händer är så här (och vi kommer snart till detaljerna om detta):
<?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 );
Men frågorna om vad den här funktionen gör, hur den fungerar och när den ska användas kvarstår.
Vad är application_filters?
Visst, du kan läsa allt om detta i utvecklarresurserna, och det ger denna definition :
Anropa funktionerna som läggs till en filterkrok.
Men det hjälper inte alltid. Jag menar att vi kan läsa dokumentationen och ändå gå därifrån förvirrade, eller hur?
Tänk på det så här:
- Ett filter är en funktion som accepterar input till process.
- Inmatningen bearbetas utifrån definitionen av funktionen.
- Funktionen returnerar sedan det bearbetade värdet.
Vad du gör med det returnerade värdet är upp till dig, men när du använder ett filter eller anropar application_filters på en informationsbit säger du till WordPress: "Jag har den här informationen, använd filtret som identifieras med denna nyckel och lämna resultat tillbaka till mig."
Inte illa, eller hur?
Hur fungerar det?
Men det finns en del av ovanstående som leder till en fråga. Specifikt nämner jag att "…snälla använd filtret som identifieras av den här nyckeln…" och idén med en nyckel kan vara förvirrande, särskilt eftersom ett filter eller en åtgärd eller, mer allmänt sett, en krok kan identifieras av vad som kallas en tagg eller en nyckel.
De är synonymer. Så när du ser tagg eller nyckel i samband med en krok, behandla dem som sådana.
Med det sagt, så här fungerar det:
- Funktionen applicera_filter accepterar två argument. Den första är taggen eller nyckeln (beroende på vad du vill kalla den) som är kopplad till filtret (läs: funktion) du vill använda för att bearbeta arbetet, den andra är värdet du vill bearbeta inom nämnda funktion.
- Filtret kommer att aktiveras och returnera ett resultat (eller, kom ihåg, funktionen som vi har definierat).
- Vi tar sedan värdet som returneras och tillämpar det på vilken egendom vi vill.
Så, till exempel, kommer du sannolikt att se något liknande detta i någon annans kodbas (eller kanske till och med din egen):
<?php
$post->post_content = apply_filters( 'the_content', $my_content );
Och nu när du har lite sammanhang för hur det fungerar, förstår du idén, eller hur?
Hur använder vi det?
Detta för inlägget full cirkel till den första frågan om hur vi kan använda application_filters till post_content närhelst vi behöver infoga eller uppdatera ett inlägg.
Så låt oss säga att du har innehållet som du vill tillämpa (eller lägga till) på värdet av ett inläggs innehåll. Du kan göra något så här :
<?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;
Men det är dålig form. Istället gör du så här :
<?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 );
Och det är så WordPress gör det.
Slutsats
Så med tanke på all information och kod ovan bör du vara väl rustad inte bara för att se till att du filtrerar data som kommer att infogas i databasen korrekt, du har den kunskap som behövs för att definiera dina filter och tillämpa dem på alla data du tycker är lämpliga.
Men exempel på det är innehåll för ett annat inlägg.
Under tiden, om du arbetar med inläggsinnehåll, se till att du filtrerar data ordentligt innan du släpper den i databasen.