Cómo mostrar un caption de shortcode en otro lugar que no sea the_content
Quiero desactivar los captions de shortcode para las entradas en uno de mis temas, y mostrar el contenido en otro lugar, como en una barra lateral.
Las imágenes no están subidas a WordPress, pero están enlazadas usando la funcionalidad del editor de añadir imagen -> desde URL, lo que resulta en el siguiente shortcode:
[caption id="" align="alignnone" width="300" caption="Leonard Nimoy ha hecho muchas más cosas que solo interpretar al Sr. Spock"]<a href="http://example.com/nimoy"><img src="http://example.com/uploads/nimoy.jpg" alt="Leonard Nimoy con traje negro" title="Leonard Nimoy" width="300" height="228" /></a>[/caption]
¿Alguna idea? Supongo que usando un filtro en img_caption_shortcode
de alguna manera, pero no sé si ese es el enfoque correcto.
Prueba esto:
$caption_info = array();
add_filter( 'img_caption_shortcode', 'capture_caption', 10, 3 );
function capture_caption( $blank = '', $attr, $content ) {
global $caption_info;
$caption_info[] = array('attr' => $attr, 'content' => $content );
return ' ';
}
Guardará la información de todos los subtítulos en la variable global $caption_info
y suprimirá su visualización en el contenido (se devuelve un espacio porque el resultado del filtro se ignora si está vacío).

Genial. Sabía que de alguna manera funcionaría. ¿Debería agregar un condicional is_singular()
a esto?

Bueno, eso depende de cómo quieras que funcione exactamente. En esta forma se activará en cada llamada de la función img_caption_shortcode()
que impulsa los shortcodes [caption]
y [wp_caption]
. Si deseas omitir en algunas condiciones, verifícalas y devuelve un valor vacío ''
en la función.

Lo he implementado, pero al hacer global $caption_info; var_dump($caption_info);
en mi single.php obtengo array(0) {}
. ¿Alguna idea?

Momento tonto, pero yo mismo tropecé con eso, así que... La variable se llena solo después de que el contenido se muestra y los shortcodes se ejecutan. ¿Estás haciendo esto después de the_content()
?

Acabo de descubrir esto yo mismo, y estaba a punto de hacer esa pregunta, lol. Hacer esto: $content = apply_filters('the_content',get_the_content());
antes en la página ayuda. Entonces puedo simplemente hacer echo $content
donde iría the_content()
. Aún así se siente como un truco. ¿Hay alguna manera de hacer que ese filtro se ejecute antes?

Probablemente hay varias formas de manejar esto. Yo intentaría recuperar el contenido (sin asignarlo a una variable) y eliminar el filtro de img_caption_shortcode
para que no se ejecute y duplique la información cuando se muestre el contenido real. También podría simplemente recuperar el contenido y buscar shortcodes con regex, pero el código sería algo completamente diferente.
