Час від часу, коли я працюю з уже існуючим вихідним кодом або виконую перевірку коду, я бачу, як інші змінюють вміст об’єкта публікації таким чином :
<?php
$post->post_content = $my_content;
У цей момент деякі зайдуть і відразу скажуть, що ви робите це неправильно. Я ненавиджу цю фразу (і вона навіть розсіяна по кодовій базі WordPress, але я відволікаюся).
Існують способи використання інших існуючих функцій WordPress API для дезінфекції даних, перш ніж установити для них значення атрибута post_content, використання цих функцій — не найкращий спосіб це зробити.
Натомість ми всі повинні використовувати apply_filters. Проблема? Хтось не знає, хтось не знає, як це працює, а хтось не знає, як ним користуватися. Тобто незрозуміло, як правильно фільтрувати вміст дописів.
Необроблений вміст, відфільтрований WordPress, потім записаний у базу даних.
Але для тих, хто може належати до будь-якої з категорій вище, можливо, це може допомогти.
Належне фільтрування вмісту публікації
На цьому етапі я припускаю, що ви знаєте про WP_Post, його властивості та те, як їх змінювати за допомогою різних функцій API.
Основна проблема, про яку я говорю, полягає в тому, щоб переконатися, що вміст, який буде записано в базу даних, відформатовано так само, як це зробив би WordPress, якщо б ви писали або оновлювали публікацію.
І як це відбувається ( і ми незабаром дійдемо до деталей):
<?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 );
Але залишаються питання щодо того, що ця функція робить, як вона працює та коли її використовувати.
Що таке apply_filters?
Звичайно, ви можете прочитати все про це в Ресурсах для розробників, і там дається таке визначення :
Викликати функції, додані до фільтра.
Але це не завжди допомагає. Я маю на увазі, що ми можемо прочитати документацію і все одно піти збентеженими, чи не так?
Подумайте про це так:
- Фільтр — це функція, яка приймає вхідні дані для обробки.
- Вхідні дані обробляються на основі визначення функції.
- Потім функція повертає оброблене значення.
Ви самі вирішуєте, що робити з поверненим значенням, але коли ви застосовуєте фільтр або викликаєте apply_filters до частини інформації, ви повідомляєте WordPress: «У мене є ця інформація, будь ласка, застосуйте фільтр, визначений цим ключем, і передайте результат повернеться мені».
Непогано, правда?
Як це працює?
Але є одна частина вищесказаного, яка викликає запитання. Зокрема, я згадую, що «…будь ласка, застосуйте фільтр, визначений цим ключем…», і ідея ключа може заплутати, особливо тому, що фільтр або дію або, загальніше кажучи, хук можна ідентифікувати за тегом або ключ.
Вони синоніми. Отже, коли ви бачите тег або ключ у контексті хука, сприймайте їх як такі.
Ось як це працює:
- Функція apply_filters приймає два аргументи. Перший — тег або ключ (залежно від того, як ви хочете його назвати), пов’язаний із фільтром (читай: функцією), який ви хочете використати для обробки роботи, другий — це значення, яке ви хочете обробити у згаданій функції.
- Фільтр спрацює та поверне результат (або, запам’ятайте, функцію, яку ми визначили).
- Потім ми беремо значення, яке повертається, і застосовуємо його до будь-якої властивості, яку ми хочемо.
Отже, наприклад, ви, швидше за все, побачите щось подібне в чужій кодовій базі (або, можливо, навіть у своїй власній):
<?php
$post->post_content = apply_filters( 'the_content', $my_content );
І тепер, коли ви маєте трохи контексту про те, як це працює, ви зрозуміли ідею, чи не так?
Як ми це використовуємо?
Це повне коло публікації до початкового питання про те, як ми можемо використовувати apply_filters для post_content щоразу, коли нам потрібно вставити або оновити публікацію.
Отже, припустимо, що у вас є вміст, який ви хочете застосувати (або додати) до значення вмісту публікації. Ви можете зробити щось на зразок цього :
<?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;
Але це поганий тон. Замість цього ви зробите це :
<?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 );
Ось як це робить WordPress.
Висновок
Отже, враховуючи всю інформацію та код, наведений вище, ви повинні бути добре озброєні не тільки для того, щоб переконатися, що ви належним чином фільтруєте дані, які будуть вставлені в базу даних, ви маєте знання, необхідні для визначення ваших фільтрів і застосування їх до будь-які дані, які ви вважаєте за потрібне.
Але приклади для цього – вміст для іншої публікації.
Тим часом, якщо ви працюєте з вмістом публікації, переконайтеся, що ви належним чином фільтруєте дані, перш ніж кинути їх у базу даних.