Сплит контент и галерея


22

Есть ли способ разделить содержание поста и короткий код галереи. Я хочу отображать галерею вне моего обычного контента независимо от того, как и где он размещен. Я могу использовать это, чтобы получить сам шорткод:

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 ()). Не уверен почему.


1
Вы рассматривали возможность добавления отдельного мета-блока WYSYWIG только для галереи? Вы могли бы тогда всегда призывать это после the_content(). Однако сложнее, если таких страниц уже много.
GhostToast

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

Почему бы вам не использовать решение « Использование preg_replace» для отделения галереи от the_content?
fuxia

Ответы:


24

Открыто для любого, кто может упростить это, но вот то, что я придумал, сработало для меня.

Перво-наперво - получите галерею, используя get_post_gallery(), как только цикл начнется:

<?php if( have_posts() ) : ?>

    <?php while( have_posts() ) :
            the_post();
            $gallery = get_post_gallery();
            $content = strip_shortcode_gallery( get_the_content() );
    ?>

        <div id="content">
            <?php echo $content; ?>
        </div> <!-- id="content" -->

        <div id="gallery">
            <?php echo $gallery; ?>
        </div> <!-- id="gallery" -->

    <?php endwhile; ?>

<?php endif; ?>

strip_shortcode_gallery() Функция - functions.php

function strip_shortcode_gallery( $content ) {
    preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER );

    if ( ! empty( $matches ) ) {
        foreach ( $matches as $shortcode ) {
            if ( 'gallery' === $shortcode[2] ) {
                $pos = strpos( $content, $shortcode[0] );
                if( false !== $pos ) {
                    return substr_replace( $content, '', $pos, strlen( $shortcode[0] ) );
                }
            }
        }
    }

    return $content;
}

Ресурсы:

Переполнение стека:

Из чего я исходил, который не сработал, как ожидалось:


4

Основной шорткод Регулярные выражения

По сути, мы можем сделать это с помощью Regex - фактически даже с помощью Regex, предоставляемого core by get_shortcode_regex().

Сначала нам нужно получить теги шорткода и создать регулярное выражение. К get_shortcode_regex()сожалению, основная функция не дает возможности добавить аргумент, поэтому у нас останется регулярное выражение, соответствующее каждому короткому коду, что нежелательно, так как мы хотим использовать только [gallery]шорткод.

// Get all tags as Array
$tags = $GLOBALS['shortcode_tags'];
// remove the gallery-shortcode; 'gallery' is the key
unset( $tags['gallery'] );
// retrieve all shortcodes (but not 'gallery') separated by a vertical pipe char/the "or" Regex char
$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );

Поймать все галереи

Далее нам нужно регулярное выражение, которое ловит все галереи. Поэтому мы вызываем, так preg_match_all()как он возвращает все совпадения для шорткода галереи в виде массива с 0индексом (остальные будут частичными совпадениями и могут быть проигнорированы).

$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );

Теперь $galleries[0]содержит массив тегов шорткода галереи.

Содержание без галерей

Следующее, что нам нужно сделать, это удалить все [gallery]шорткоды из контента. Мы снова будем использовать тот же Regex и запустить его get_the_content(). Конечно, мы применяем the_contentфильтр, поскольку шорткод мог быть добавлен посредством обратного вызова во время рендеринга.

$content = preg_replace_callback(
    "/$pattern/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

$contentПеременная теперь держит наше содержание.

Пример обратного вызова для изменения содержимого

или: Как вы можете разделить контент на галереи и остальную часть поста

Мы можем легко заменить контент нашим новым контентом во время обратного вызова:

$tags = $GLOBALS['shortcode_tags'];
unset( $tags['gallery'] );

$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );
$pattern = get_shortcode_regex();

preg_match_all( "/{$pattern}/s", get_the_content(), $galleries );

echo $galleries;
echo "<hr>";
echo preg_replace_callback(
    "/{$pattern}/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

который сначала добавит все галереи, а затем добавит наш контент без галерей, которые разделены горизонтальным правилом. Это только отправная точка.


используя другой подход, как в wordpress.stackexchange.com/questions/193511/… . когда я пробую ваш код, я получаю php ошибки - не могли бы вы взглянуть?
Aleerlike

Какой код? Какие ошибки? Подробно, пожалуйста. Это разработка, а не игра в догадки.
Кайзер

код и подробности в ссылке> wordpress.stackexchange.com/questions/193511/…
Adeerlike

2

Это не должно быть слишком сложным. Приведенный ниже код может быть сокращен до нескольких строк по желанию.

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

NB: все остальные шорткоды будут удалены с поста. Если вы не размещаете там собственные шорткоды, то подход для вас.

Предположим, вы находитесь в цикле WP

$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // This is your cleaned content
$glry = get_post_gallery(); // and here is the gallery.

Предположим, вы вышли

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',strip_shortcodes($my_post->post_content));
$glry = get_post_gallery($my_postid);

Подход 2. Удалите только [gallery]шорткод, оставьте все остальные шорткоды в.

Полагается на внутреннюю реализацию того, как [gallery]выглядит шорткод, который может быть изменен командой WP, поэтому, возможно, не такой надежный, как первый подход:

В цикле WP

$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // This is your cleaned content
$glry = get_post_gallery();

Из этого

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',preg_replace('/\[gallery.*\]/', '', $my_post->post_content));
$glry = get_post_gallery($my_postid);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.