Cómo envolver automáticamente un elemento alrededor de un iframe o embed en el contenido
Me gustaría que WordPress envuelva automáticamente un div alrededor de cualquier iframe
o embed
cuando se usan en the_content
... ¿cómo se puede lograr esto?

Si no me equivoco, para que el filtro funcione, la última línea debería ser: add_filter( 'embed_oembed_html', 'wrap_embed_with_div', 10, 4 );

El último parámetro en add_filter es accepted_args, que es un entero que indica el número de argumentos aceptados por la función, que en este caso es 3.

es correcto @user23385, el 4to argumento sería $post_id
. mientras que en tu respuesta solo usas el argumento 1. así que sería seguro omitir el 10
(por defecto) y el 3
ya que solo necesitas 1
y eso también sería por defecto.. (pero entonces también necesitarías eliminar $url
y $attr
en tu función) gracias por la respuesta, exactamente lo que necesitaba :)

Con los filtros de WordPress. Añade esto a tu functions.php:
function div_wrapper($content) {
// coincide con cualquier iframe
$pattern = '~<iframe.*</iframe>|<embed.*</embed>~';
preg_match_all($pattern, $content, $matches);
foreach ($matches[0] as $match) {
// envuelve el iframe coincidente con un div
$wrappedframe = '<div>' . $match . '</div>';
// reemplaza el iframe original con el nuevo en el contenido
$content = str_replace($match, $wrappedframe, $content);
}
return $content;
}
add_filter('the_content', 'div_wrapper');

Disculpas por la respuesta tardía, he estado fuera por trabajo... esto parece muy prometedor, lo probaré y daré retroalimentación.

Esto funciona genial, pero ¿hay alguna manera de limitar el wrapper para que solo se muestre una vez después de detectar el primer iframe u objeto incrustado?...

Podrías usar preg_match en lugar de preg_match_all para obtener solo un resultado. O reescribir el foreach para que se interrumpa después de la primera iteración. O no usar un foreach y simplemente obtener la primera coincidencia ($match = $matches[0]). Solo asegúrate de verificar si obtuviste alguna coincidencia primero.

¡Esto es jodidamente increíble! Lo usé para asegurar que los videos sean responsivos con la clase helper de bootstrap: $wrappedframe = '<div class="embed-responsive embed-responsive-16by9">' . $match . '</div>';

Esta solución terminó siendo más simple y útil más adelante, después de darme cuenta de que la función PHP estaba abarcando un espectro demasiado amplio de iframes en todo el sitio.
