apply_filters('the_content', $content) против do_shortcode($content)
Допустим, у меня есть опция темы или текстовая область в произвольных полях записи. Теперь я хочу выполнить несколько шорткодов, обычный текст, изображения и т.д.
Какой вариант будет лучшей практикой и почему?
Вариант 1:
$content = //данные из текстовой области;
echo apply_filters('the_content', $content);
Вариант 2:
$content = //данные из текстовой области;
echo do_shortcode($content);
Пожалуйста, объясните, какой вариант является лучшей практикой и почему.
ДОПОЛНЕНИЕ
Позвольте описать сценарий более подробно. Я разрабатываю темы для клиентов согласно их требованиям. Иногда мне нужно добавлять произвольные поля для записей/страниц/произвольных типов записей, чтобы они могли добавлять шорткоды (слайдер, контактную форму и т.д.) или просто обычный текст. Это текстовое поле.
Чтобы шорткоды работали, я использую вариант 1. Недавно я услышал от кого-то, что это неправильный способ, и что следует использовать do_shortcode
. Но мне не объяснили, почему это неправильный способ. Именно поэтому я спрашиваю.
Весь этот процесс можно выполнить в стандартном текстовом редакторе WordPress. Но мне нужно создать эти опции для специфического использования в шаблонах, именно это хотят мои клиенты.

ВОПРОС И ОТВЕТ ПЕРЕСМОТРЕННЫЕ
Иногда встречаются вопросы, которые преследуют вас и возвращаются позже в жизни, и это один из таких вопросов.
Этот вопрос заставил меня задуматься об альтернативном решении проблемы. Как я уже говорил, пользовательские поля и метабоксы предназначены для хранения небольших метаданных, а не для расширения содержимого записи, где можно выполнять шорткоды и функции. Кроме того, ваш метод некорректен и не должен использоваться.
Мне показалось интересным в вашем посте то, что вы использовали пользовательские поля и метабоксы для непреднамеренного отображения пользовательского контента из ввода пользователя. Поэтому я задумался о возможном способе сделать это правильно, используя данные пользовательских полей и метабоксов.
Вот моя идея:
СЦЕНАРИЙ:
ПРИМЕЧАНИЕ: Это можно изменить в соответствии с любыми потребностями
В отдельной записи пользователь хочет/требует динамически отображать пользовательский контент после записи, чтобы удовлетворить свои потребности. Это должно быть динамическим. Контент должен быть пользовательским запросом, и пользователь должен иметь возможность выбирать, что показывать, когда он хочет и что он хочет.
ВОЗМОЖНОЕ РЕШЕНИЕ:
Шорткоды здесь не подойдут, так как их нельзя выполнять в пользовательских полях. Также do_shortcode
не подойдет, так как он не динамичен и жестко закодирован, что нам не нужно. Как и в вашем вопросе, мы будем использовать пользовательское поле. Еще раз подчеркиваю, не используйте пользовательское поле для выполнения пользовательского запроса или шорткодов.
ПЛАН:
Мы будем использовать пользовательское поле только для сохранения аргументов нашего запроса; и все. Итак, мы создаем пользовательское поле под названием custom_query_arguments
. На экране редактора записи вы теперь увидите свое пользовательское поле, готовое к использованию.
Следующим шагом будет добавление наших аргументов пользовательского запроса в поле. Допустим, нам нужно показать три записи из категории 1, отсортированные по заголовку. Тогда наши аргументы запроса должны выглядеть так (в строковом формате):
'posts_per_page=3&cat=1&orderby=title'
Это то, что вы должны ввести в свое пользовательское поле. После ввода сохраните значение вашего пользовательского поля.
Далее нужно построить пользовательский запрос в файле single.php. Нам нужно получить значение из нашего пользовательского поля, которое фактически является аргументами нашего запроса, и передать его в новый экземпляр WP_Query
для получения записей. Также нам нужно проверить, есть ли у нас значение, сохраненное в этом пользовательском поле; если пользовательское поле пустое, ничего не показывать.
КОД:
Вы можете попробовать что-то вроде этого в файле single.php сразу после записи.
$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// Проверяем, есть ли значение в пользовательском поле
if( ! empty( $args ) ) {
$q = new WP_Query( $args );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata();
}
}
Если пользователь хочет удалить пользовательский запрос, он может просто удалить значение пользовательского поля и оставить его пустым. Если ему нужно показать тот же запрос, но из категории 10 и всего 5 записей, он может просто заменить исходное значение следующим:
'posts_per_page=5&cat=10&orderby=title'
НЕСКОЛЬКО ЗАМЕЧАНИЙ:
Важно использовать правильный синтаксис и формат при вводе информации в эти пользовательские поля и метабоксы. Ошибки синтаксиса или неверная информация приведут к нежелательному выводу или даже к фатальным ошибкам. Важно сообщить об этом вашим клиентам.
ОРИГИНАЛЬНЫЙ ОТВЕТ
Я не понимаю, что вы пытаетесь сделать, но, судя по всему, это две разные вещи.
ВАРИАНТ 1
apply_filters('the_content', $content);
используется для применения фильтров контента к необработанному содержимому записи, которое обычно берется из $post->post_content
. Эти фильтры включают известный фильтр wp_autop
, который добавляет теги p
к the_content()
apply_filters('the_content', $content);
обычно используется вместе с get_posts
, где работают непосредственно с объектами WP_Post
без использования setup_postdata( $post )
, что делает доступными для использования шаблонные теги, такие как the_content()
.
ВАРИАНТ 2
do_shortcode
используется для добавления шорткода в любом месте файлов шаблонов вне текстового редактора на экране редактирования страницы в бэкенде, фактически фильтруя шорткоды через их хуки.
Правильное использование следующее.
Пример: Добавление шорткода галереи в файле шаблона
echo do_shortcode( '[gallery]' )
РЕДАКТИРОВАНИЕ 1
Из ваших комментариев я бы вообще не использовал шорткод.
Если вы не собираетесь добавлять шорткод через текстовый редактор, а собираетесь добавить его напрямую (жестко закодировать) через do_shortcode
в файле шаблона, я бы просто добавил функцию в шаблон.
Пример:
Если у вас есть следующая функция шорткода,
function footag_func( $atts ) {
return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );
Вы можете просто вызвать функцию напрямую в шаблоне:
echo footag_func();
Это намного быстрее, так как шорткод не нужно разбирать.
РЕДАКТИРОВАНИЕ 2
Честно говоря, вы полностью делаете это неправильно, судя по вашему редактированию. Поэтому я не мог понять ваш первоначальный вопрос.
Иногда мне нужно добавлять метаданные записи на записи/страницы/пользовательские типы записей, чтобы они могли добавлять шорткоды (слайдер, контактная форма и т. д.) или просто простой текст. Это текстовое поле.
Чтобы шорткод работал, я использую вариант 1.....
Пользовательские поля не являются текстовыми полями и, конечно же, не предназначены для выполнения шорткодов и, тем более, слайдеров или контактных форм. Пользовательские поля никогда не должны использоваться для замены текстового редактора в записях и страницах.
Как я уже говорил, apply_filters('the_content', $content);
предназначен для применения форматирования к необработанному содержимому записи.
У вас есть два выбора здесь:
Использовать
do_shortcode
напрямую в файлах шаблонов, что я бы не рекомендовал, так как использование функции быстрее, так как шорткод не нужно разбирать.Использовать шорткод напрямую в текстовом редакторе для конкретной страницы/записи
Я настоятельно рекомендую вам по-новому взглянуть на вашу структуру и то, чего вы хотите достичь. Пользовательские поля не являются текстовыми редакторами и не могут выполнять шорткоды или слайдеры.
Моя рекомендация — возможно, посмотреть в сторону пользовательских виджетов или системы, которую можно использовать с пользовательскими полями.

Питер, спасибо за объяснение. Я уже это знаю. Но я спрашивал, какой вариант будет более точным, если цель - просто вывести шорткоды из текстового поля мета-данных поста/опций темы. Я использую вариант 1 для получения отфильтрованного контента, и это вошло у меня в привычку. И я использую вариант 1 даже для простого вывода шорткода из текстового поля. Поэтому и спросил.

Я видел правку. Я понял вашу точку зрения. Но мой сценарий другой. Это выглядит так: есть текстовое поле/область и несколько шорткодов. Теперь пользователь может поместить любой из шорткодов в эту область. Поэтому я не могу напрямую использовать функцию. Мне нужно оставить эту часть динамической.

Где находится это текстовое поле, такое же, как в редакторе страниц в админке?

Это может быть мета-данными записи. Или это может быть опцией темы. Я использую фильтр the_content для обоих случаев.

Извините, но тогда это не имеет смысла. Зачем вам использовать шорткоды в произвольных полях. И зачем вообще тогда использовать шорткоды.

apply_filter('the_content')
выполняет все фильтры, подключенные к выводу контента в WordPress, такие как do_shortcode
, wp_autop
и другие.
apply_filters
— это вполне подходящий способ достичь желаемого, однако если вам нужно только преобразование shortcode
без других фильтров, используйте второй вариант из вашего вопроса.
