Contenido dividido y galería

22

¿Hay alguna manera 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 se coloque. 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 galería completamente?


Editar: Tengo una solución parcial, pero parece una forma larga de hacerlo. Primero toma el primer shortcode en la publicación (que debe corregirse ya que solo quiero el shortcode "Galería") y luego elimina todos los shortcodes del contenido (de nuevo, 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; ?>

Edición n. ° 2 : Ok, solo he podido obtener códigos abreviados de la galería en la publicación. También he agregado un filtro para eliminar el formulario de shortcode de la galería the_content(): el problema es que no necesariamente elimina el shortcode 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); 

El lazo

<?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 dos veces (estoy en una sola página, debería repetirse dos veces, por lo que no se ejecuta do_shortcode ()). No estoy seguro de por qué.

Howdy_McGee
fuente
1
¿Has considerado agregar un meta box WYSYWIG separado solo para la galería? Entonces siempre puedes pedir eso después the_content(). Más complicado si ya hay muchas páginas como esta, sin embargo.
GhostToast
Estoy de acuerdo en que es una posibilidad, pero estaba tratando de evitar la necesidad de otro gran editor, tratando de hacerlo lo más simple y directo posible. Desearía poder (sin un complemento, por supuesto) simplemente tener un metabox de agregar galería o algo similar.
Howdy_McGee
¿Por qué no utiliza la solución de Usar preg_replace para separar la galería del contenido?
fuxia

Respuestas:

24

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

Lo primero es lo primero: obtenga 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; ?>

strip_shortcode_gallery() Función - 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:

Desbordamiento de pila:

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

Howdy_McGee
fuente
4

Core shortcode Expresiones regulares

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

Primero tenemos que tomar las etiquetas de código corto y construir una expresión regular. get_shortcode_regex()Lamentablemente, la función principal no ofrece la oportunidad de presentar un argumento, por lo que nos quedaría con una expresión regular que coincida con todos y cada uno de los códigos cortos, lo que no es deseado ya que solo queremos apuntar al [gallery]código corto.

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

Atrapa todas las galerías

Luego necesitamos un Regex que capture todas las galerías. Por lo tanto, estamos llamando, preg_match_all()ya que devolverá todas las coincidencias para el shortcode de la galería como una matriz con un 0índice (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 variedad de etiquetas de código corto de galería.

El contenido sin galerías.

Lo siguiente que debemos hacer es eliminar todos los [gallery]códigos cortos del contenido. Usaremos el mismo Regex nuevamente y lo ejecutaremos get_the_content(). Por supuesto, aplicamos el the_contentfiltro ya que el shortcode podría haberse agregado a través de una devolución de llamada en el momento del renderizado.

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

La $contentvariable ahora contiene nuestro contenido.

Ejemplo de devolución de llamada para alterar el contenido

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

Podríamos reemplazar fácilmente 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 sólo un punto de partida.

emperador
fuente
usando un enfoque diferente como en wordpress.stackexchange.com/questions/193511/… . cuando pruebo tu código me salen errores de php, ¿puedes echar un vistazo?
Adeerlike
Cual codigo Que errores Detalle, por favor. Esto es desarrollo, no juegos de adivinanzas.
kaiser
código y detalles en enlace> wordpress.stackexchange.com/questions/193511/…
Adeerlike
2

No debería ser tan complicado. El código a continuación se puede acortar a un par de líneas si lo desea.

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

NB: 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.

Suponga que está en el bucle de 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.

Asume 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 [gallery]shortcode, mantenga todos los demás shortcodes.

Se basa en la realización interna de cómo se [gallery]ve el shortcode, que puede ser cambiado por el equipo de WP, por lo que tal vez no sea una prueba futura como el primer enfoque:

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 el

$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
fuente