Dividir contenido y galería

21

¿Hay alguna forma de dividir el contenido de la publicación y el código corto de la galería? Quiero mostrar la galería fuera de mi contenido normal, sin importar cómo o dónde esté colocada. Puedo usar esto para obtener el shortcode en sí:

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

Pero esto no funciona si el código corto de la galería no es la primera instancia. ¿Hay alguna manera de dividir mi contenido y mi galería completamente?

Editar: Tengo una semi-solución, pero parece ser una manera larga y complicada de hacerlo. Primero toma el primer código abreviado en la publicación (que debe solucionarse ya que solo quiero el código abreviado "Galería") y luego elimina todos los códigos cortos del contenido (nuevamente, no es realmente lo que quiero hacer).

<?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 : está bien, solo he podido obtener los códigos cortos de la galería en la publicación. También agregué un filtro para eliminar la forma del código corto de la galería the_content() . El problema es que no necesariamente elimina el código corto ya que lo publica, pero no me permite ejecutar "do_shortcode ()"

Funciones.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); 

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

en The Loop devolverá mi código corto Twice (estoy en una sola página, debería estar en bucle dos veces, por lo que no se ejecuta do_shortcode ()). No estoy seguro de por qué.

    
pregunta Howdy_McGee 06.11.2013 - 21:52

3 respuestas

22

Abierto a cualquiera que pueda simplificar esto, pero esto es lo que se me ocurrió que funcionó para mí.

Lo primero es lo primero: obtén la galería, utilizando get_post_gallery() , tan pronto como comience el ciclo:

<?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; ?>
Función

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

Recursos:

Stackoverflow:

De lo que me estaba yendo originalmente, que no funcionó como se esperaba:

respondido por el Howdy_McGee 07.11.2013 - 00:03
4

Expresiones regulares del shortcode del núcleo

Básicamente, podemos hacerlo con un Regex, incluso con el Regex proporcionado por core por get_shortcode_regex() .

Primero necesitamos tomar las etiquetas de código corto y construir una expresión regular. Lamentablemente, la función principal get_shortcode_regex() no ofrece ninguna posibilidad de lanzar un argumento, por lo que nos quedaría con una expresión regular que coincida con todos y cada uno de los códigos de acceso, lo que no es deseable, ya que solo queremos apuntar al código corto de [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'] )
) );

Captura todas las galerías

A continuación necesitamos un Regex que capture todas las galerías. Por lo tanto, estamos llamando a preg_match_all() , ya que devolverá todas las coincidencias para el shortcode de la galería como una matriz con un índice 0 (el resto serán coincidencias parciales y se pueden ignorar).

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

Ahora $galleries[0] contiene una matriz de etiquetas de código abreviado de galería.

El contenido sin galerías

Lo siguiente que debemos hacer es eliminar todos los códigos cortos de [gallery] del contenido. Volveremos a utilizar el mismo Regex y lo ejecutaremos en get_the_content() . Por supuesto, aplicamos el filtro the_content , ya que el código abreviado se pudo haber agregado a través de una devolución de llamada en el momento del procesamiento.

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

La variable $content ahora contiene nuestro contenido.

Ejemplo de devolución de llamada para modificar el contenido

o: cómo puedes dividir el contenido en galerías y el resto de la publicación

Podríamos simplemente reemplazar el contenido con nuestro nuevo contenido durante una devolución de llamada:

$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 primero agregaría todas las galerías, luego agregaría nuestro contenido sin galerías, ambas separadas por una regla horizontal. Esto es solo un punto de partida.

    
respondido por el kaiser 06.04.2014 - 18:44
0

No debería ser tan complicado. El código a continuación se puede reducir a un par de líneas en el deseo.

Enfoque 1. Obtenga el contenido limpio de la publicación eliminando todos los códigos cortos, incluida la galería uno del contenido de la publicación.

Nota: todos los demás códigos cortos se eliminarán de la publicación. Si no coloca códigos cortos personalizados allí, entonces el enfoque es para usted.

Supongamos que estás en el bucle 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.

Supongamos que estás fuera

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

Enfoque 2. Elimine solo el código corto [gallery] , mantenga todos los demás códigos cortos en.

Se basa en la realización interna de cómo se ve el código corto [gallery] , que puede ser cambiado por el equipo de WP, así que tal vez no sea una prueba tan futura como la primera aproximación:

En el bucle WP

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

Fuera de él

$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);
    
respondido por el bob-12345 12.10.2017 - 11:04

Lea otras preguntas en las etiquetas