Podziel zawartość i galerię


22

Czy istnieje sposób na podzielenie treści postu i krótkiego kodu galerii. Chcę wyświetlać galerię poza moją normalną treścią bez względu na to, jak i gdzie jest ona umieszczona. Mogę użyć tego, aby uzyskać sam shortcode:

if(has_shortcode(get_the_content(), 'gallery')){
    $pattern = get_shortcode_regex(); 
    preg_match("/$pattern/s", get_the_content(), $matches);
    echo do_shortcode($matches[0]);
}

Ale to nie działa, jeśli krótki kod galerii nie jest pierwszą instancją. Czy istnieje sposób na całkowite podzielenie treści i galerii?


Edycja: Mam pół-rozwiązanie, ale wydaje się, że jest to długa, kręta droga do rozwiązania tego. Najpierw pobiera pierwszy krótki kod w poście (który musi zostać naprawiony, ponieważ chcę tylko krótki kod „Galeria”), a następnie usuwa wszystkie krótkie kody z treści (ponownie, nie tak naprawdę, co chcę zrobić.

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

Edycja nr 2 - Ok, w poście udało mi się uzyskać tylko skróty galerii. Dodałem również filtr, aby usunąć formularz shortcode galerii the_content()- problem polega na tym, że niekoniecznie usuwa on shortcode, ponieważ go publikuje, ale nie pozwala mi na uruchomienie „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); 

Pętla

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

w Loop zwróci mój krótki kod Dwa razy (jestem na jednej stronie, powinien być zapętlony dwa razy - więc nie działa do_shortcode ()). Nie pewny dlaczego.


1
Czy rozważałeś dodanie osobnego meta boxu WYSYWIG tylko dla galerii? Możesz wtedy zawsze po to poprosić the_content(). Jednak trudniejsze, jeśli istnieje już wiele takich stron.
GhostToast,

Zgadzam się, że jest taka możliwość, ale starałem się uniknąć potrzeby kolejnego dużego edytora - starając się, aby było to tak proste i bezpośrednie, jak to możliwe. Chciałbym móc (oczywiście bez wtyczki) dodać metabox galerii lub coś podobnego.
Howdy_McGee

Dlaczego nie skorzystasz z rozwiązania Korzystanie
fuxia

Odpowiedzi:


24

Otwarty dla każdego, kto może to uprościć, ale oto, co wymyśliłem, że zadziałało dla mnie.

Po pierwsze - pobierz galerię, używając get_post_gallery(), jak tylko zacznie się pętla:

<?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() Funkcja - 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;
}

Zasoby:

Przepełnienie stosu:

Co pierwotnie zaczynałem, co nie działało zgodnie z oczekiwaniami:


4

Podstawowe wyrażenia regularne o krótkim kodzie

Zasadniczo możemy to zrobić za pomocą Regex - w rzeczywistości nawet z Regex dostarczonym przez core get_shortcode_regex().

Najpierw musimy pobrać tagi shortcode i zbudować wyrażenie regularne. Funkcja podstawowa get_shortcode_regex()niestety nie daje szansy na wprowadzenie argumentu, więc zostalibyśmy z wyrażeniem regularnym pasującym do każdego krótkiego kodu, co jest niepożądane, ponieważ chcemy jedynie celować na ten [gallery]krótki kod.

// 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'] )
) );

Złap wszystkie galerie

Następnie potrzebujemy Regex, który łapie wszystkie galerie. Dlatego dzwonimy, preg_match_all()ponieważ zwróci wszystkie 0dopasowania dla shortcode galerii jako tablicę z indeksem (reszta będzie częściowymi dopasowaniami i może zostać zignorowana).

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

Teraz $galleries[0]zawiera szereg tagów shortcode galerii.

Treść bez galerii

Następną rzeczą, którą musimy zrobić, to usunąć wszystkie [gallery]skróty z treści. Wykorzystamy ponownie ten sam Regex i uruchomimy go get_the_content(). Oczywiście stosujemy the_contentfiltr, ponieważ podczas renderowania można było dodać krótki kod poprzez wywołanie zwrotne.

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

$contentZmienna posiada obecnie nasze treści.

Przykład wywołania zwrotnego w celu zmiany treści

lub: Jak podzielić zawartość na galerie i resztę postu

Możemy łatwo po prostu zastąpić treść naszą nową treścią podczas oddzwaniania:

$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() )
);

które najpierw dodałyby wszystkie galerie, a następnie dodały naszą zawartość bez galerii, obie oddzielone regułą poziomą. To tylko punkt wyjścia.


stosując różne metody, jak w wordpress.stackexchange.com/questions/193511/... . kiedy próbuję kodu, dostaję błędy php - czy możesz spojrzeć?
Adeerlike

Który kod? Jakie błędy? Proszę o szczegóły. To jest rozwój, a nie zgadywanie.
kaiser


2

To nie powinno być takie skomplikowane. Poniższy kod można w razie potrzeby skrócić do kilku wierszy.

Podejście 1. Uzyskaj czystą treść postu, usuwając wszystkie skróty, w tym jeden z galerii z treści postu.

Uwaga: wszystkie pozostałe skróty zostaną usunięte z posta. Jeśli nie umieścisz tam niestandardowych skrótów, to podejście jest dla Ciebie.

Załóżmy, że jesteś w pętli 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.

Załóżmy, że Cię nie ma

$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);

Podejście 2. Usuń tylko [gallery]krótki kod, zachowaj wszystkie pozostałe kody.

Opiera się na wewnętrznej realizacji tego, jak [gallery]wygląda krótki kod, który może zostać zmieniony przez zespół WP, więc może nie jest tak przyszłościowy, jak pierwsze podejście:

W pętli WP

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

Z tego

$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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.