Как автоматически обернуть элемент вокруг iframe или embed в контенте?
Я хочу, чтобы WordPress автоматически оборачивал div вокруг любого iframe
или embed
, когда они используются в the_content
... как этого можно достичь?

Если я не ошибаюсь, чтобы фильтр работал, последняя строка должна быть: add_filter( 'embed_oembed_html', 'wrap_embed_with_div', 10, 4 );

Последний параметр в add_filter — это accepted_args, целое число, обозначающее количество аргументов, принимаемых функцией, в данном случае это 3.

это верно, @user23385, 4-й аргумент был бы $post_id
. тогда как в вашем ответе вы используете только аргумент 1. так что можно безопасно пропустить 10
(значение по умолчанию) и 3
, так как вам нужен только 1
, и это также было бы значением по умолчанию.. (но тогда вам также нужно удалить $url
и $attr
из вашей функции) спасибо за ответ, именно то, что мне нужно было :)

С помощью фильтров WordPress. Добавьте это в ваш functions.php:
function div_wrapper($content) {
// находим все iframe и embed
$pattern = '~<iframe.*</iframe>|<embed.*</embed>~';
preg_match_all($pattern, $content, $matches);
foreach ($matches[0] as $match) {
// оборачиваем найденный iframe в div
$wrappedframe = '<div>' . $match . '</div>';
// заменяем оригинальный iframe на обернутый в контенте
$content = str_replace($match, $wrappedframe, $content);
}
return $content;
}
add_filter('the_content', 'div_wrapper');

Извините за поздний ответ, я был в командировке... это выглядит очень перспективно, я попробую и отпишусь о результатах.

Это отлично работает, но есть ли способ ограничить обертку, чтобы она выводилась только один раз после обнаружения первого iframe или встроенного объекта?...

Вы можете использовать preg_match вместо preg_match_all, чтобы получить только один результат. Или переписать foreach с break после первой итерации. Или вообще не использовать foreach, а просто взять первое совпадение ($match = $matches[0]). Главное - сначала проверьте, есть ли вообще совпадения.

Это просто охренительно! Я использовал это, чтобы сделать видео адаптивными с помощью вспомогательного класса Bootstrap: $wrappedframe = '<div class="embed-responsive embed-responsive-16by9">' . $match . '</div>';
