Od czasu do czasu, gdy pracuję z istniejącym kodem źródłowym lub przeprowadzam audyt kodu, widzę, że inni modyfikują treść postu obiektu postu w ten sposób :
<?php
$post->post_content = $my_content;
W tym momencie niektórzy wpadną i od razu powiedzą, że robisz to źle. Nienawidzę tego wyrażenia (i jest nawet zaśmiecone w całym kodzie WordPressa, ale robię dygresję).
Istnieją sposoby na wykorzystanie innych istniejących funkcji API WordPress do oczyszczenia danych przed ustawieniem ich na wartość atrybutu post_content. Korzystanie z tych funkcji nie jest najlepszym sposobem na zrobienie tego.
Zamiast tego wszyscy powinniśmy używać Apply_filters. Problem? Niektórzy nie wiedzą, niektórzy nie wiedzą, jak to działa, a niektórzy nie wiedzą, jak go używać. Oznacza to, że nie jest jasne, jak prawidłowo filtrować treści postów.
Surowa treść przefiltrowana przez WordPress, a następnie zapisana do bazy danych.
Ale dla tych, którzy mogą należeć do którejkolwiek z powyższych kategorii, być może to może pomóc.
Prawidłowe filtrowanie treści postów
W tym momencie zakładam, że wiesz już o WP_Post, jego właściwościach i sposobach ich modyfikacji za pomocą różnych funkcji API.
Podstawowym problemem, o którym mówię, jest upewnienie się, że treść, która zostanie zapisana do bazy danych, jest sformatowana w taki sam sposób, w jaki zrobiłby to WordPress, gdybyś pisał lub aktualizował post.
Sposób, w jaki to się dzieje, wygląda następująco (a wkrótce przejdziemy do szczegółów):
<?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 );
Pozostają jednak pytania, do czego służy ta funkcja, jak działa i kiedy z niej korzystać.
Co to jest zastosowanie_filtrów?
Oczywiście, możesz przeczytać o tym wszystkim w zasobach dla programistów i zawiera ona tę definicję :
Wywołaj funkcje dodane do haka filtra.
Ale to nie zawsze pomaga. Chodzi mi o to, że możemy przeczytać dokumentację i nadal odejść zdezorientowani, prawda?
Pomyśl o tym w ten sposób:
- Filtr to funkcja, która przyjmuje dane wejściowe do przetwarzania.
- Dane wejściowe są przetwarzane na podstawie definicji funkcji.
- Funkcja następnie zwraca przetworzoną wartość.
To, co zrobisz ze zwróconą wartością, zależy od Ciebie, ale kiedy zastosujesz filtr lub wywołasz apply_filters do informacji, mówisz WordPressowi: „Mam te informacje, zastosuj filtr zidentyfikowany przez ten klucz i przekaż wynik z powrotem do mnie."
Nieźle, prawda?
Jak to działa?
Ale jest jedna część powyższego, która prowadzi do pytania. W szczególności wspominam, że „…proszę zastosować filtr identyfikowany przez ten klucz…", a pomysł z kluczem może być mylący, zwłaszcza że filtr lub akcja lub, bardziej ogólnie mówiąc, zaczep można zidentyfikować za pomocą tego, co nazywa się tagiem lub klucz.
Są synonimami. Więc kiedy widzisz tag lub klucz w kontekście haka, traktuj je jako takie.
Powiedziawszy to, oto jak to działa:
- Funkcja Apply_filters przyjmuje dwa argumenty. Pierwszy to tag lub klucz (w zależności od tego, jak chcesz go nazwać) powiązany z filtrem (czytaj: funkcja), którego chcesz użyć do przetwarzania pracy, drugi to wartość, którą chcesz przetworzyć w ramach tej funkcji.
- Filtr uruchomi się i zwróci wynik (lub, pamiętaj, funkcję, którą zdefiniowaliśmy).
- Następnie pobieramy zwróconą wartość i stosujemy ją do dowolnej właściwości.
Na przykład prawdopodobnie zobaczysz coś takiego w kodzie kodu innej osoby (a może nawet w swoim):
<?php
$post->post_content = apply_filters( 'the_content', $my_content );
A teraz, gdy masz trochę kontekstu, jak to działa, masz pomysł, prawda?
Jak tego używamy?
To sprawia, że post zatacza pełne koło do początkowego pytania, w jaki sposób możemy użyć apply_filters do post_content, gdy musimy wstawić lub zaktualizować post.
Załóżmy więc, że masz treść, którą chcesz zastosować (lub dołączyć) do wartości treści posta. Możesz zrobić coś takiego :
<?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;
Ale to zła forma. Zamiast tego robisz to :
<?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 );
I tak robi to WordPress.
Wniosek
Biorąc więc pod uwagę wszystkie powyższe informacje i kod, powinieneś być dobrze uzbrojony nie tylko po to, aby upewnić się, że prawidłowo filtrujesz dane, które zostaną wstawione do bazy danych, ale masz wiedzę potrzebną do zdefiniowania filtrów i zastosowania ich do wszelkie dane, które uważasz za stosowne.
Ale przykłady na to są treścią dla innego postu.
W międzyczasie, jeśli pracujesz z treścią posta, upewnij się, że odpowiednio filtrujesz dane przed umieszczeniem ich w bazie danych.