Когда oEmbed не удается, отобразить альтернативу

8

Я хочу указать альтернативное изображение, которое будет отображаться при сбое oEmbed.

Конкретный вариант использования - предложить альтернативу, когда Китай (или другие страны) блокируют YouTube. Мы знаем, что контент YouTube там не будет доступен, но хотим предоставить альтернативное изображение в этом случае.

Можно ли сделать код ошибки oEmbed доступным для этой цели?

Боб Истон
источник
Очень интересный вопрос К сожалению, у меня нет ответа для вас, но это определенно стоит посмотреть.
Питер Гусен
1
Я изучал эту проблему. Я прошел довольно глубоко, но я не нашел никакого решения. Проблема в том, что запрос oEmbed выполняется с веб-сервера, а не со стороны клиента. На сервере все в порядке, и вставленный HTML возвращается YouTube; то есть iframe, который загружает видео. Когда клиент пытается загрузить контент iframe, это когда контент блокируется. Насколько я понимаю, oEmbed не терпит неудачу, и мы ничего или очень мало можем сделать. Ожидая, что другие думают об этом.
Cybmeta
Я думаю, не уверен, что API oembed работает с RESTful API. Этот API возвращает ответ клиенту, как этот GET /photos/bees/2362225867/ HTTP/1.1 Host: flickr.com Accept: application/oembed+xml. Альтернативой по умолчанию является получение HTTP-кода ошибки, например 406 Not Acceptable. Это должно быть полезно для возврата сообщения.
Bueltge
@bueltge возвращенный ответ от oEmbed не отправляется клиенту. По крайней мере, для YouTube, как я сказал в своем комментарии. Запрос oEmbed выполняется на стороне сервера, YouTube возвращает <iframe>HTML, и это то, что встраивается в сообщение, и это то, что является сервером для клиента: a <iframe>. Когда клиент из Китая пытается загрузить контент, <iframe>он блокируется. Там нет ничего на стороне сервера. Я не тестировал с другими провайдерами oEmbed, но думаю, что все они работают одинаково. Фактически, если oEmbed будет выполнен на стороне клиента, никакого реального содержимого не будет.
Cybmeta
1
Единственная альтернатива, которую я вижу, - это проверить встроенный контент с помощью javascript. если вы не получаете видео iframe, вы можете показать что-то еще ...
jjarolim

Ответы:

1

Я думаю, что лучшее, что нужно сделать в этом случае, - это обернуть содержимое oEmbed divперед тем, как они будут отрисованы, а затем показать альтернативное изображение со background-imageсвойством CSS . Если видео загружается, то содержимое oEmbed будет закрывать фоновое изображение.

Вы можете добавить обертку, используя embed_oembed_htmlфильтр.

add_filter('embed_oembed_html', 'your_function_here');

Если вас беспокоит загрузка дополнительных элементов, вы можете выполнить проверку на стороне клиента с помощью JS, чтобы увидеть, загружен ли oEmbed, и, если нет, загрузить фоновое изображение в оболочку.

Вы можете сделать намного более сложным, добавив пользовательские поля для каждого видео, но это, по сути, суть.

Дарон Спенс
источник
0

Один из подходов может заключаться в том, чтобы сделать другой запрос, используя oEmbed на стороне сервера через прокси, который находится в Китае.

Таким образом, вы заранее знаете, будет ли сбой при обращении к ресурсу на клиенте. В начале запроса страницы вы можете определить, где географически расположен IP-адрес клиента, выполнить серверный вызов через прокси-сервер к ресурсу, например youtube, а затем использовать ошибку oEmbed, которую вы, вероятно, получите.

Вы могли бы взглянуть на Wonderproxy для достижения этого (я не связан с ними, но слышу хорошие вещи)

codecowboy
источник