Conteúdo dividido e galeria

21

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 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]);
}

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

Editar: Eu tenho uma semi-solução, mas parece uma maneira longa de lidar com isso. Primeiro, ele pega o primeiro shortcode no post (que precisa ser corrigido, pois eu só quero o shortcode "Gallery") e, em seguida, 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; ?>

Editar # 2 - Ok, consegui obter apenas códigos de acesso da galeria na postagem. Eu também adicionei um filtro para remover o formulário shortcode da galeria the_content() - o problema é que ele não está necessariamente removendo o shortcode, pois ele não o permite executar "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 loop

<?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 Twice (estou em uma única página, deve estar em loop duas vezes - por isso não está executando do_shortcode ()). Não tenho certeza do porquê.

    
por Howdy_McGee 06.11.2013 / 21:52
fonte

3 respostas

22

Aberto a qualquer um que possa simplificar isso, mas aqui está o que eu criei que funcionou para mim.

A primeira coisa é a primeira - acesse a galeria, usando get_post_gallery() , assim que o loop for iniciado:

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

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

por Howdy_McGee 07.11.2013 / 00:03
fonte
4

Expressões regulares de shortcode do núcleo

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

Primeiro, precisamos pegar as tags shortcode e construir uma regex. A função principal get_shortcode_regex() infelizmente não oferece nenhuma chance de lançar um argumento para que fôssemos deixados com um regex que corresponda a cada shortcode, o que é indesejado, já que queremos apenas segmentar o [gallery] shortcode.

// 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á todos os Correspondências para o shortcode da galeria como array com um 0 index (o restante será correspondências parciais e poderá ser ignorado).

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

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

O conteúdo sem galerias

A próxima coisa que precisamos fazer é remover todos os códigos de% [gallery] do conteúdo. Vamos usar o mesmo Regex novamente e rodar em get_the_content() . É claro que aplicamos o filtro the_content , já que o shortcode pode 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 variável $content agora conté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 o restante do post

Poderíamos facilmente substituir o conteúdo por 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 primeiro adicionaria todas as galerias, depois adicionaria nosso conteúdo sem galerias, ambas separadas por uma regra horizontal. Este é apenas um ponto de partida.

    
por kaiser 06.04.2014 / 18:44
fonte
0

Não deve ser tão complicado. O código abaixo pode ser reduzido a algumas linhas quando desejar.

Abordagem 1. Obtenha o conteúdo da postagem limpa removendo todos os códigos de acesso, incluindo o de galeria, do conteúdo da postagem.

NB: todos os outros códigos de acesso serão removidos da postagem. Se você não colocar códigos de acesso personalizados, a abordagem é para você.

Suponha que você esteja no loop do 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ê esteja 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 [gallery] shortcode, mantenha todos os outros códigos de acesso.

Depende da realização interna de como o [gallery] shortcode se parece, que pode ser alterado pela equipe do WP, então talvez não como prova futura da 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);
    
por bob-12345 12.10.2017 / 11:04
fonte