Извлеките первый OEMBed URL
Вопрос
Я хочу извлечь первый OEMBED URL, вставленного в содержание поста, чтобы поместить метагин из заголовка или в других местах, как способ создать его иначе, чем остальная часть контента.
Решение
Я предполагаю, что вы заинтересованы только в первом URL -адресе, который на самом деле преуспевает в обнаружении реальных данных OEMBED. Система OEMBED обрабатывает все ссылки, которые он находит, но не каждая ссылка будет, очевидно, будет иметь OEMBED для этого.
Фильтр, который вы захотите использовать, - это Embed_oembed_html, и он получает HTML, кэшированный OEMBED, URL, любые атрибуты на вставке и post_id, что важно для вашего кода.
add_filter('embed_oembed_html', 'my_function',10,4);
function my_function( $cache, $url, $attr, $post_ID ) {
global $my_previous_post_id;
if ($my_previous_post_id != $post_ID) {
// post ID changed, so this is the first oembed for the post
// do something with $url
$my_previous_post_id = $post_ID;
}
return $cache; // it's important that you return the $cache value as-is
}
Теперь вся система OEMBED работает одновременно с короткими кодами: во время вызова фильтра_ -контента. Так что, если вы хотите взять вещи для заголовка, вам придется запустить основной цикл в заголовке, запустите фильтр_Контента через значение get_the_content (), а затем вызовите rewind_posts (), чтобы перемотать запрос обратно в начало фактического Главная петля позже на странице.
Такое поведение вызывает проблемы с плагинами (например, галерея NextGen), которые делают глупости, когда вы запускаете петлю в заголовке. Там нет никакого отношения вокруг этого, но факт в том, что эти плагины фундаментально сломаны, и вы не можете исправить их проблемы. Я все время получаю такой отчет с SFC-Share и SFC-подобным (потому что они тоже вытягивают контент, чтобы вставить в заголовок). Честно говоря, вы ничего не можете с этим поделать.
Другие советы
Попробуй это:
function get_first_oembed($id) {
$meta = get_post_custom($id);
foreach ($meta as $key => $value)
if (false !== strpos($key, 'oembed'))
return $value[0];
}
Похоже, что встраивания хранятся как визуализированные блоки HTML, поэтому, если вам нужна только ссылка, вам также необходимо извлечь его.
Я попробовал ответ от @Rarst, но на самом деле это не очень стабильное решение проблемы. Если вы попытаетесь var_dump
а $meta
var выше, вы заметите, что есть по крайней мере друг друга мета _oembed_time_xxxxxxxxxxxx
что, вероятно, для разрушения кеша.
А также, когда я удалил лифунскую ссылку из содержания поста, кэшированные мета -струны не были удалены, что я не хотел.
Так что я копаю немного глубже в нативных кодах WP wp-includes/class-oembed.php
а также wp-includes/class-wp-embed.php
и придумал гораздо более твердое решение:
function get_first_oembed_from_content( $content ) {
if ( preg_match( '|^\s*(https?://[^\s"]+)\s*$|im', $content, $matches ) ) {
return wp_oembed_get( $matches[1] );
}
return false;
}
Рисунок корпорации копируется из нативного WP_Embed:autoembed()
функция, так что это самый надежный.
Отсюда легко изменить эту функцию и извлечь только первый URL.