Время от времени, когда я работаю с уже существующим исходным кодом или выполняю аудит кода, я вижу, как другие модифицируют содержимое записи объекта записи следующим образом :
<?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 к части информации, вы говорите 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 это делает.
Вывод
Таким образом, учитывая всю приведенную выше информацию и код, вы должны быть хорошо вооружены не только для того, чтобы убедиться, что вы правильно фильтруете данные, которые будут вставлены в базу данных, у вас есть знания, необходимые для определения ваших фильтров и их применения к любые данные, которые вы считаете нужными.
Но примеры для этого — содержание для другого поста.
Тем временем, если вы работаете с пост-контентом, убедитесь, что вы правильно фильтруете данные, прежде чем добавлять их в базу данных.