Вопрос или проблема
Это немного сложно без публикации кучи кода, но мой вопрос заключается в следующем: Каковы преимущества фильтрации через apply_filters('the_content', 'anything');
, и учитывая мой пример цикла, я фильтрую the_content
чрезмерно или неэффективно, или есть лучший способ?
Я спрашиваю, потому что только что попробовал плагин Shareaholic, который, как предполагается, обнаруживает конец поста и вставляет социальные ссылки. Однако в моем цикле я обнаруживаю, что он вставляет себя каждый раз, когда вызывается apply_filters('the_content', 'anything');
, что в моем случае происходит довольно часто.
Поскольку я новички в WP и PHP, а Shareaholic – это устоявшийся сервис, я просто предполагаю, что эти проблемы возникли из-за незнания с моей стороны. У Shareaholic есть шорткод, который я могу внедрить непосредственно в шаблон, но я просто хочу получить общую обратную связь / подтверждение / критику моего подхода и любые идеи о том, как можно упростить или что может вызывать проблему.
Мой цикл выглядит примерно так:
<?php /* Начало цикла */ ?>
<?php while (have_posts()) : the_post(); ?>
<?php function_for_post_banner() /* фильтры 'the_content' для добавления баннера поста */ ?>
<?php get_template_part('templates/loop', 'switch');
/* Switch проверяет тип поста и применяет условную разметку, обрабатывает медиа для каждого типа поста и вызывает 'the_content' специфичный для каждого случая. */ ?>
<? fuction_attachements();
/* выполняет условное форматирование с вложениями поста, например изображения, медиа и документы, все фильтруются через the_content */ ?>
<?php /* Конец цикла */ ?>
Буду признателен за любые советы по этому поводу — спасибо.
Вы хотите добавить фильтр в очередь фильтров для the_content
:
add_filter('the_content', 'anything');
Ядро WordPress затем вызывает apply_filters
внутри функции the_content
, чтобы запустить все фильтры в очереди:
function the_content( $more_link_text = null, $strip_teaser = false) {
$content = get_the_content( $more_link_text, $strip_teaser );
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
.
Ответ или решение
Правильное использование фильтрации через the_content
Введение
WordPress предоставляет мощный механизм фильтрации контента, одним из ключевых элементов которого является функция apply_filters('the_content', $content)
. Эта функция позволяет интегрировать внешние плагины и собственные функции для изменения содержимого постов перед его отображением. Тем не менее, новичкам может быть сложно правильно использовать этот механизм, особенно в контексте обработки циклов и взаимодействия с плагинами, например, Shareaholic.
Зачем использовать фильтрацию the_content
?
Фильтры в WordPress позволяют:
- Модифицировать контент: Вы можете добавлять, изменять или удалять элементы из контента поста.
- Создавать переиспользуемые функции: Одна и та же функция может работать в разных местах, если она используется через
add_filter
. - Упрощать контроль над контентом: Упрощение управления содержимым, особенно если необходимо изменить его логическую структуру.
Почему возникает проблема с многократной фильтрацией?
В вашем случае, если вы вызываете фильтр apply_filters('the_content', 'anything')
многократно в цикле, это может привести к тому, что плагин, такой как Shareaholic, будет добавлять свои элементы несколько раз. Это происходит потому, что каждый вызов apply_filters
будет применяться к текущему контенту, который уже может содержать ранее добавленные элементы.
Ваш цикл, описанный выше, вызывает функцию apply_filters
несколько раз в рамках одной итерации, что приводит к неправильному поведению плагина. Каждый раз, когда apply_filters
вызывается, Shareaholic будет добавлять свои ссылки, что считается избыточным.
Как оптимизировать ваш код?
-
Вызов
the_content
один раз: Вместо многократного примененияapply_filters
, ограничьтесь вызовомthe_content
единожды в конце ваших действий в цикле. Это может выглядеть следующим образом:<?php while (have_posts()) : the_post(); ?> <?php function_for_post_banner(); ?> <?php get_template_part('templates/loop', 'switch'); ?> <?php function_attachements(); ?> <?php the_content(); // Вызовите 'the_content' один раз в конце ?> <?php endwhile; ?>
-
Фильтрация только при необходимости: Поставьте фильтры и вызовы
apply_filters
туда, где они действительно нужны, чтобы избежать избыточной нагрузки. -
Убедитесь, что вы правильным образом используете
add_filter
: Применение фильтров должно происходить в файлах функций вашей темы или плагина, и оно должно быть четко оформлено, чтобы избежать путаницы.
Заключение
Фильтрация через the_content
является мощным инструментом в WordPress, однако неправильное её применение может привести к неожиданным результатам, как в вашем случае с плагином Shareaholic. Оптимизация вашего кода с учётом вышеуказанных рекомендаций не только улучшит производительность вашего сайта, но и устранит проблемы с дублированием содержимого. Надеюсь, эти замечания помогут вам справиться с трудностями и наберитесь опыта в использовании WordPress и PHP!