apply_filters ('the_content', $ content) против do_shortcode ($ content)


21

Допустим, у меня есть опция темы или пользовательская текстовая область постмета. Теперь я хочу выполнить несколько коротких кодов, общие тексты, изображения и т. Д.

Что будет лучшей практикой и почему?

Опция 1:

$content = //my text area data;
echo apply_filters('the_content', $content);

Вариант 2:

$content = //my text area data;
echo do_shortcode($content);

Пожалуйста, объясните мне, какой из них будет лучшей практикой и почему.

РЕДАКТИРОВАТЬ

Позвольте мне описать сценарий в деталях. Я разрабатываю темы для клиентов с их требованиями. Иногда мне нужно добавить метаданные поста для записей / страниц / пользовательских типов постов, чтобы они могли добавлять шорткоды (слайдер, контактную форму и т. Д.) Или просто текст. Это текстовое поле.

Чтобы шорткод работал, я использую опцию 1 . Теперь я слышал от кого-то, что это неправильный путь, и я должен использовать do_shortcode. Но они не дали мне объяснения, почему это неправильно. Вот почему я спрашиваю.

Весь этот процесс можно выполнить в текстовом редакторе wp по умолчанию. Но мне нужно создать эти опции для конкретного шаблона, это то, что хотят мои клиенты.

Ответы:


16

ВОПРОС И ОТВЕТ

Иногда возникают такие вопросы, которые вас раздражают и снова выслеживают в дальнейшей жизни, и это один из таких вопросов.

Этот вопрос заставил меня задуматься об альтернативном решении проблемы. Как я уже говорил, настраиваемые поля и мета-блоки предназначены для хранения небольших фрагментов метаданных, а не в качестве расширения для публикации контента, где вы можете выполнять шорткод и функции. Кроме того, как я уже говорил, ваш метод неверен и не должен использоваться

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

Это моя идея:

СЦЕНАРИЙ:

ПРИМЕЧАНИЕ: это можно изменить, чтобы удовлетворить любые потребности

В одном посте пользователь хочет / требует динамически показывать пользовательский контент после поста в соответствии со своими потребностями. Это должно быть динамичным. Содержание должно быть пользовательским запросом, и пользователь должен выбрать, что показывать, когда он хочет, и что он хочет.

ВОЗМОЖНОЕ РЕШЕНИЕ:

Шорткоды здесь не будут работать, так как шорткоды не могут быть выполнены в пользовательских полях. Ни один из них не будет do_shortcodeработать, так как он не динамический и жестко запрограммированный, чего мы не хотим. Как и в вашем вопросе, мы собираемся использовать пользовательские поля. Еще раз подчеркиваю, не используйте настраиваемое поле для выполнения пользовательского запроса или шорткоды

ПЛАН:

Мы будем использовать настраиваемое поле для сохранения только аргументов нашего запроса, вот и все. Итак, мы создаем настраиваемое поле с именем custom_query_arguments. На экране вашего редактора постов вы увидите свое настраиваемое поле, готовое к использованию.

Следующим шагом будет добавление пользовательских аргументов запроса в наше поле. Допустим, нам нужно показать 3 сообщения из категории 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 );
// check if the custom field has a value
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
Питер спасибо за объяснение. Я уже знаю, что. Но я спрашивал, какой вариант будет более точным, если цель состоит только в том, чтобы выводить шорткоды из текстовой области опций публикации мета / темы. Я использую option1 для получения отфильтрованного контента, и это стало моей привычкой. И используя вариант 1, даже просто напечатать шорткод из текстового файла. Так спрашивал.
— тн Суфи

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

Где находится это текстовое поле, оно такое же, как на экране редактора внутренней части страницы
— Питер Гусен

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

Извините, но тогда все это не имеет смысла. Почему вы хотите использовать шорткоды в пользовательских полях. Зачем тогда вообще использовать шорткоды.
— Питер Гусен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.