Dividir conteúdo e galeria

22

Existe uma maneira de dividir o conteúdo da postagem e o código curto da galeria. Quero exibir a galeria fora do meu conteúdo normal, não importa como ou onde ela é colocada. Eu posso usar isso para obter o próprio código de acesso:

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

Mas isso não funciona se o código curto da galeria não for a primeira instância. Existe uma maneira de dividir meu conteúdo e galeria completamente?


Edit: Eu tenho uma semi-solução, mas parece um longo caminho a percorrer. Primeiro ele pega o primeiro código de acesso na postagem (que precisa ser corrigido, pois eu quero apenas o código de acesso "Galeria") e remove todos os códigos de acesso do conteúdo (novamente, não é exatamente o que eu quero fazer).

<?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 - Ok, eu consegui apenas códigos de acesso da galeria no post. Também adicionei um filtro para remover o formulário de código de acesso da galeria the_content()- o problema é que ele não está necessariamente removendo o código de acesso, pois ele é publicado, mas não está permitindo que eu execute "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); 

O laço

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

no The Loop ele retornará meu código curto duas vezes (estou em uma única página, deve ser repetida duas vezes - portanto, não está executando do_shortcode ()). Não sei por que.

Howdy_McGee
fonte
1
Você já pensou em adicionar uma meta box WYSYWIG separada apenas para a galeria? Você pode sempre pedir isso depois the_content(). Mais complicado, se já houver muitas páginas como essa, no entanto.
GhostToast
Concordo que é uma possibilidade, mas estava tentando evitar a necessidade de outro grande editor - tentando torná-lo o mais simples e direto possível. Eu gostaria de poder (sem um plugin, é claro) ter apenas uma metabox de galeria adicional ou algo semelhante.
Howdy_McGee
Por que você não usa a solução de Using preg_replace para separar a galeria do the_content?
fuxia

Respostas:

24

Aberto a qualquer pessoa que possa simplificar isso, mas eis o que eu criei que funcionou para mim.

O primeiro é o primeiro - obtenha a galeria, usando get_post_gallery()assim que o loop iniciar:

<?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() Função - 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;
}

Recursos:

Stackoverflow:

O que eu estava saindo originalmente, que não funcionou como o esperado:

Howdy_McGee
fonte
4

Expressões regulares do shortcode principal

Basicamente, podemos fazer isso com um Regex - na verdade, mesmo com o Regex fornecido pelo core by get_shortcode_regex().

Primeiro, precisamos pegar as tags shortcode e criar uma regex. get_shortcode_regex()Infelizmente, a função principal não oferece chance de apresentar um argumento, para que fiquemos com um regex que corresponda a todo e qualquer código abreviado, o que é indesejável, pois queremos apenas segmentar o [gallery]código abreviado.

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

Pegue todas as galerias

Em seguida, precisamos de um Regex que capture todas as galerias. Portanto, estamos chamando, preg_match_all()pois ele retornará todas as correspondências para o código de acesso da galeria como matriz com um 0índice (o restante será correspondências parciais e pode ser ignorado).

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

Agora $galleries[0]contém uma variedade de tags de shortcode da galeria.

O conteúdo sem galerias

A próxima coisa que precisamos fazer é remover todos os [gallery]códigos de acesso do conteúdo. Vamos usar o mesmo Regex novamente e executá-lo get_the_content(). É claro que aplicamos o the_contentfiltro, pois o código de acesso poderia ter sido adicionado por meio de um retorno de chamada no momento da renderização.

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

A $contentvariável agora mantém nosso conteúdo.

Exemplo de retorno de chamada para alterar o conteúdo

ou: como você pode dividir o conteúdo em galerias e no restante da postagem

Poderíamos facilmente substituir o conteúdo pelo nosso novo conteúdo durante um retorno de chamada:

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

que adicionaria primeiro todas as galerias e, em seguida, nosso conteúdo sem galerias, ambos separados por uma regra horizontal. Isto é só um ponto de partida.

kaiser
fonte
usando uma abordagem diferente, como em wordpress.stackexchange.com/questions/193511/… . Quando tento seu código, recebo erros de php - você pode dar uma olhada?
Adeerlike
Qual código? Que erros? Detalhe, por favor. Isso é desenvolvimento, não jogos de adivinhação.
Kaiser
código adn detalhes no link> wordpress.stackexchange.com/questions/193511/...
Adeerlike
2

Não deve ser tão complicado. O código abaixo pode ser reduzido para duas linhas, se desejar.

Abordagem 1. Obtenha o conteúdo limpo da publicação removendo todos os códigos de acesso, incluindo a galeria do conteúdo da publicação.

Nota: todos os outros códigos de acesso serão removidos da publicação. Se você não colocar códigos de acesso personalizados lá, a abordagem será a sua.

Suponha que você esteja no loop 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.

Suponha que você está fora

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

Abordagem 2. Remova apenas o [gallery]código curto, mantenha todos os outros códigos curtos.

Baseia-se na realização interna da aparência do [gallery]código de acesso, que pode ser alterado pela equipe do WP, portanto, talvez não seja uma prova futura do que a primeira abordagem:

No loop WP

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

Fora disso

$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);
bob-12345
fonte