Есть ли способ разделить содержание поста и короткий код галереи. Я хочу отображать галерею вне моего обычного контента независимо от того, как и где он размещен. Я могу использовать это, чтобы получить сам шорткод:
if(has_shortcode(get_the_content(), 'gallery')){
$pattern = get_shortcode_regex();
preg_match("/$pattern/s", get_the_content(), $matches);
echo do_shortcode($matches[0]);
}
Но это не работает, если короткий код галереи не первый экземпляр. Есть ли способ полностью разделить мой контент и галерею?
Редактировать: у меня есть полу-решение, но кажется, что это долгий путь. Сначала он захватывает первый шорткод в посте (который нужно исправить, так как я хочу только шорткод «Галерея»), затем удаляет все шорткоды из контента (опять же, не совсем то, что я хочу сделать.
<?php if(has_shortcode(get_the_content(), 'gallery')) : ?>
<?php
$pattern = get_shortcode_regex();
preg_match("/$pattern/s", get_the_content(), $matches);
?>
<div id="content">
<?php echo strip_shortcodes(get_the_content()); ?>
</div>
<div id="gallery">
<?php echo do_shortcode($matches[0]); ?>
</div>
<?php endif; ?>
Edit # 2 - Хорошо, я смог получить только шорткоды галереи в посте. Я также добавил фильтр для удаления формы шорткода галереи the_content()
- проблема в том, что он не обязательно удаляет шорткод, так как он публикует его, но он не позволяет мне запускать "do_shortcode ()"
functions.php
function remove_gallery($content) {
global $post;
if($post->post_type == 'artcpt')
remove_shortcode('gallery', $content);
return $content;
}
add_filter( 'the_content', 'remove_gallery', 6);
Петля
<?php preg_match('/\[gallery ids=[^\]]+\]/', get_the_content(), $matches); ?>
<div id="content">
<?php the_content(); ?>
</div>
<div id="gallery">
<?php echo do_shortcode($matches[0]); ?>
</div>
в Цикле он вернет мой короткий код Дважды (я на одной странице, должен быть зациклен дважды - поэтому он не выполняет do_shortcode ()). Не уверен почему.
источник
the_content()
. Однако сложнее, если таких страниц уже много.Ответы:
Открыто для любого, кто может упростить это, но вот то, что я придумал, сработало для меня.
Перво-наперво - получите галерею, используя
get_post_gallery()
, как только цикл начнется:strip_shortcode_gallery()
Функция - functions.phpРесурсы:
Переполнение стека:
Из чего я исходил, который не сработал, как ожидалось:
источник
Основной шорткод Регулярные выражения
По сути, мы можем сделать это с помощью Regex - фактически даже с помощью Regex, предоставляемого core by
get_shortcode_regex()
.Сначала нам нужно получить теги шорткода и создать регулярное выражение. К
get_shortcode_regex()
сожалению, основная функция не дает возможности добавить аргумент, поэтому у нас останется регулярное выражение, соответствующее каждому короткому коду, что нежелательно, так как мы хотим использовать только[gallery]
шорткод.Поймать все галереи
Далее нам нужно регулярное выражение, которое ловит все галереи. Поэтому мы вызываем, так
preg_match_all()
как он возвращает все совпадения для шорткода галереи в виде массива с0
индексом (остальные будут частичными совпадениями и могут быть проигнорированы).Теперь
$galleries[0]
содержит массив тегов шорткода галереи.Содержание без галерей
Следующее, что нам нужно сделать, это удалить все
[gallery]
шорткоды из контента. Мы снова будем использовать тот же Regex и запустить егоget_the_content()
. Конечно, мы применяемthe_content
фильтр, поскольку шорткод мог быть добавлен посредством обратного вызова во время рендеринга.$content
Переменная теперь держит наше содержание.Пример обратного вызова для изменения содержимого
или: Как вы можете разделить контент на галереи и остальную часть поста
Мы можем легко заменить контент нашим новым контентом во время обратного вызова:
который сначала добавит все галереи, а затем добавит наш контент без галерей, которые разделены горизонтальным правилом. Это только отправная точка.
источник
Это не должно быть слишком сложным. Приведенный ниже код может быть сокращен до нескольких строк по желанию.
Подход 1. Получите чистый контент публикации, удалив все шорткоды, включая галерею, из содержимого публикации.
NB: все остальные шорткоды будут удалены с поста. Если вы не размещаете там собственные шорткоды, то подход для вас.
Предположим, вы находитесь в цикле WP
Предположим, вы вышли
Подход 2. Удалите только
[gallery]
шорткод, оставьте все остальные шорткоды в.Полагается на внутреннюю реализацию того, как
[gallery]
выглядит шорткод, который может быть изменен командой WP, поэтому, возможно, не такой надежный, как первый подход:В цикле WP
Из этого
источник