Розділити вміст і галерею


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; ?>

Редагувати №2 - Гаразд, мені вдалося отримати лише короткі коди галереї у публікації. Я також додав фільтр для видалення форми the_content()короткого коду галереї - проблема полягає в тому, що він не обов'язково видаляє короткий код, оскільки він публікує його, але він не дозволяє мені запустити "do_shortcode ()"

Функції.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>

у Loop він поверне мій короткий код двічі (я на одній сторінці, повинен бути циклічний двічі - так що його не працює do_shortcode ()). Не знаю чому.


1
Чи розглядали ви, як додати окремий метабокс WYSYWIG лише для галереї? Потім ви могли завжди зателефонувати на це після the_content(). Однак складніше, якщо таких сторінок вже багато.
GhostToast

Я погоджуюсь, що це можливо, але я намагався уникнути необхідності іншого великого редактора - намагався зробити його максимально простим і прямим вперед. Я б хотів, щоб я міг (без плагіна, звичайно) просто додати метабокс галереї або щось подібне.
Howdy_McGee

Відповіді:


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() Функція - function.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, наданим ядром 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'] )
) );

Лови всі галереї

Далі нам потрібен Regex, який охоплює всі галереї. Тому ми закликаємо, 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 - чи можете ви, будь ласка, подивитися?
Adeerlike

Який код? Які помилки? Детально, будь ласка. Це розвиток, а не вгадування ігор.
кайзер

Код і подробиці коду за посиланням> wordpress.stackexchange.com/questions/193511/…
Adeerlike

2

Це не повинно бути так складно. Код нижче може бути скорочений до пари рядків за бажанням.

Підхід 1. Отримайте чистий вміст публікації, видаливши зі змісту публікації всі шорткоди, включаючи галерею.

Примітка: всі інші штрихові коди будуть видалені з посади. Якщо ви не розміщуєте там спеціальні штрих-коди, то підхід саме для вас.

Припустимо, ви знаходитесь у циклі 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.