WordPress, не понимаю apply_filters

397
03 мая 2017, 12:18

Начал изучать написание плагинов для Wordpress.

Кусок кода из урока.

Добавляет в конце поста запись - плагин работает.

Не могу понять откуда берется значение $content. Если я комментирую первую строку, то код все равно отрабатывает.

Я так понимаю, что apply_filters('the_content', $content) берет содержимое поста и дальше функция msp_helloworld_post_footer добавляет в конец содержимого текст. После этого add_filter обновляет пост с новым содержимым.

Однако, почему если убрать первую строку, плагин все равно работает?

$content = apply_filters('the_content', $content);
function msp_helloworld_post_footer($content) {
$content .= "<div class='msp-helloworld-post-footer'><p>Hello, I'm your custom post footer</p></div>";
return $content;
}
add_filter('the_content', 'msp_helloworld_post_footer', 100);
Answer 1

Базовая особенность WordPress - так называемые хуки, или зацепки. Вызов add_filter в вашем примере сообщает WordPress, что надо добавить фильтр на некое его внутреннее событие, называемое the_content. При возникновении этого события Wordpress вызовет вашу функцию, которую вы назвали msp_helloworld_post_footer.

И этот функционал будет работать вне зависимости от того, есть в вашем коде первая строка или нет.

Сама функция add_filter в момент ее вызова ничего не делает. Она лишь записывает в некий внутренний массив хуков WordPress информацию о том, что при наступлении данного события надо вызвать определённую пользовательскую функцию.

Аналогично работают вызовы add_action - они добавляют некое пользовательское действие, которое вызывается в нужный момент. Каждый хук (фильтр или действие) имеет свой список параметров, которые передаются в пользовательскую функцию.

Разберем более подробно, что и когда происходит в вашем примере.

Первая строка - берет некую переменную $content, пропускает ее через фильтр msp_helloworld_post_footer и возвращает результат в ту же переменную $content. При этом с содержимым поста ничего не происходит. Поэтому, есть первая строка в примере, или ее нет - неважно.

add_filter сообщает ядру WordPress, что в нужный момент необходимо вызвать вашу функцию фильтрации контента msp_helloworld_post_footer. На этом выполнение кода в примере заканчивается. Никаких изменений в тело поста не вносится!

Далее, в определенный момент своей работы, ядро WordPress приступает к обработке хука the_content (например, перед выводом контента поста на экран). Ядро просматривает внутренний массив хуков, обнаруживает там, что для хука the_content надо вызвать функцию msp_helloworld_post_footer и делает это, передавая параметром контент поста, который оно собирается выводить на экран. Ваша функция получает контент, обрабатывает его, возвращает в ядро. Ядро выводит измененный контент на экран.

Так, если вкратце, все это и работает.

Во многом именно благодаря наличию механизма хуков WordPress предлагает столь гибкий функционал.

Полный перечень хуков (а их более 2000) можно посмотреть здесь.

READ ALSO
Как работать с MailRu API?

Как работать с MailRu API?

Хотелось бы через mailgetUnreadCount получать количество непрочитаных сообщений для нотификатора

319
Почему не работает функция Simple HTML DOM в цикле?

Почему не работает функция Simple HTML DOM в цикле?

Такая проблема, копирую список стримов с сайта через SimpleHTMLDOMПроблема в том, что список размещен на нескольких страницах-категориях

603
Получить имя пользователя WordPress

Получить имя пользователя WordPress

Пишу плагин, и необходимо получить имя текущего пользователяПодскажите пожалуйста как это сделать? Плагин уже установлен на сайт, осталось...

496