Separar Contenido y Galería en WordPress
¿Existe alguna manera de separar el contenido del post y el shortcode 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 shortcode de la galería no es la primera instancia. ¿Hay alguna manera de separar completamente mi contenido y la galería?
Edición: Tengo una semi-solución pero parece un método demasiado complicado. Primero obtiene el primer shortcode en el post (que necesita ser ajustado ya que solo quiero el shortcode de "Galería") luego elimina todos los shortcodes del contenido (de nuevo, no es exactamente 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 #2 - Ok, he podido obtener solo los shortcodes de galería en el post. También he añadido un filtro para remover el shortcode de galería de the_content()
- el problema es que no está eliminando completamente el shortcode ya que lo muestra, pero no me permite ejecutar "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);
El 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 El Loop me devuelve el shortcode dos veces (estoy en una página single, debería aparecer dos veces - así que no está ejecutando do_shortcode()). No estoy seguro por qué.

Abierto a cualquiera que pueda simplificar esto, pero aquí está lo que se me ocurrió y que funcionó para mí.
Primero lo primero: obtener la galería usando get_post_gallery()
, tan pronto como comience el loop:
<?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:
Lo que originalmente estaba usando, pero no funcionó como se esperaba:

Expresiones Regulares para shortcodes del núcleo
Básicamente podemos hacer eso con una expresión regular - de hecho incluso con la expresión regular proporcionada por el núcleo mediante get_shortcode_regex()
.
Primero necesitamos obtener las etiquetas de shortcode y construir una expresión regular. La función del núcleo get_shortcode_regex()
lamentablemente no ofrece la posibilidad de pasar un argumento, por lo que nos quedaríamos con una expresión regular que coincide con todos los shortcodes, lo cual no es deseado ya que solo queremos apuntar al shortcode [gallery]
.
// Obtener todas las etiquetas como un Array
$tags = $GLOBALS['shortcode_tags'];
// eliminar el shortcode de galería; 'gallery' es la clave
unset( $tags['gallery'] );
// recuperar todos los shortcodes (excepto 'gallery') separados por un carácter de barra vertical/el carácter "or" de Regex
$tags = join( '|', array_map(
'preg_quote',
array_keys( $GLOBALS['shortcode_tags'] )
) );
Capturar todas las galerías
A continuación, necesitamos una expresión regular que capture todas las galerías. Por lo tanto, llamamos a preg_match_all()
ya que devolverá todas las coincidencias para el shortcode de galería como un array con un índice 0
(el resto serán coincidencias parciales y pueden ignorarse).
$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );
Ahora $galleries[0]
contiene un array de etiquetas de shortcode de galería.
El contenido sin galerías
Lo siguiente que necesitamos hacer es eliminar todos los shortcodes [gallery]
del contenido. Usaremos la misma expresión regular nuevamente y la ejecutaremos en get_the_content()
. Por supuesto, aplicamos el filtro the_content
ya que los shortcodes podrían haberse agregado mediante una devolución de llamada en el momento de renderizado.
$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 fácilmente 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() )
);
lo que primero agregaría todas las galerías, luego agregaría nuestro contenido sin galerías, ambos separados por una regla horizontal. Esto es solo un punto de partida.

usando un enfoque diferente como en http://wordpress.stackexchange.com/questions/193511/formatting-post-content-to-exclude-gallery. Cuando intento tu código obtengo errores de PHP - ¿puedes echar un vistazo?

¿Qué código? ¿Qué errores? Detalles, por favor. Esto es desarrollo, no juegos de adivinanza.

código y detalles en el enlace > http://wordpress.stackexchange.com/questions/193511/formatting-post-content-to-exclude-gallery

No debería ser tan complicado. El código a continuación puede acortarse a un par de líneas si se desea.
Enfoque 1. Obtener el contenido limpio del post eliminando todos los shortcodes, incluyendo el de galería del contenido del post.
Nota: todos los demás shortcodes serán eliminados del post. Si no utilizas shortcodes personalizados allí, entonces este enfoque es para ti.
Asume que estás dentro del loop de WordPress
$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // Este es tu contenido limpio
$glry = get_post_gallery(); // y aquí está la galería.
Asume que estás fuera del loop
$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. Eliminar solo el shortcode [gallery]
, mantener todos los demás shortcodes.
Se basa en la implementación interna de cómo luce el shortcode [gallery]
, lo cual puede ser cambiado por el equipo de WordPress, por lo que quizás no sea tan resistente al futuro como el primer enfoque:
Dentro del loop de WordPress
$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // Este es tu contenido limpio
$glry = get_post_gallery();
Fuera del loop
$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);
