Вопрос

Я хочу извлечь первый 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top