WP Oembed не передает переменную "autoplay=1"

14 дек. 2010 г., 20:17:41
Просмотры: 15.5K
Голосов: 8

У меня возникла следующая проблема:

Я передаю эту ссылку через произвольное поле: http://www.youtube.com/watch?v=E6P1Q-UycHA&autoplay=1

(обратите внимание на autoplay=1)

Но когда я загружаю видео в своей теме с помощью wp_oembed_get... видео отображается нормально, но параметр autoplay=1, который я передаю, не учитывается.

Мне нужно, чтобы видео воспроизводилось автоматически при загрузке страницы.

Есть идеи?

Спасибо, Ален Фонтен

1
Комментарии

Попробуйте этот ответ:

http://stackoverflow.com/a/16801334/2721050

Это было очень полезно для меня

Erez Lieberman Erez Lieberman
22 февр. 2015 г. 15:26:22
Все ответы на вопрос 8
0

Это не совсем аргументы как для YouTube, скорее аргументы для самого WordPress.

Один из способов обработки — получить доступ к вашему аргументу позже внутри фильтра и изменить HTML-вывод.

Передайте массив аргументов:

wp_oembed_get( 'http://www.youtube.com/watch?v=', array( 'autoplay' => 1 ) );

И фильтр:

add_filter('oembed_result','oembed_result', 10, 3);

function oembed_result($html, $url, $args) {

    // $args содержит пользовательский аргумент
    // модифицируйте $html по необходимости

    return $html;
}
15 дек. 2010 г. 09:17:38
1

Я знаю, что этот вопрос довольно старый, но у меня есть рабочее решение, которое, как мне кажется, может быть полезно для тех, кто ищет эту информацию и не находит её в Google.

Это решение было протестировано в WordPress 3.7.1+:

/**
 * Добавляет параметр `autoplay` к встроенным YouTube видео через oEmbed
 */
function wpse5362_autoplay_youtube_oembed( $provider, $url, $args ) {
    if (strpos($provider, 'youtube')!==FALSE) {
        $provider = add_query_arg('autoplay', 1, $provider);
    }

    return $provider;
}
add_filter('oembed_fetch_url', 'wpse5362_autoplay_youtube_oembed', 10, 3);

Добавьте этот код в файл functions.php вашей темы, чтобы все YouTube видео, добавленные через oEmbed, автоматически проигрывались.


Как это работает

В файле class-oembed.php на строке 212, метод fetch() применяет фильтр oembed_fetch_url, позволяя изменять URL.

Чтобы избежать добавления ненужных параметров к другим провайдерам oEmbed, мы проверяем наличие строки "youtube" в URL провайдера — также можно проверить наличие "vimeo" и/или других видео-сервисов — и, если строка найдена, добавляем аргумент autoplay в строку запроса.

23 дек. 2013 г. 00:01:13
Комментарии

Это решение не работает для меня. Оно добавляет &autoplay=1 к URL провайдера. Это НЕ src iframe, и система oembed YouTube не переносит этот параметр. Значение теряется во время _fetch_with_format, который вызывается после oembed_fetch_url. Возможно, раньше это работало, но YouTube изменил их oembed API?

Radley Sustaire Radley Sustaire
22 нояб. 2016 г. 03:19:20
0

Перекрестная публикация моего ответа с https://stackoverflow.com/a/55053642/799327, надеюсь, это нормально, так как вопрос от того же автора:


Итак, после некоторых исследований, лучший способ сделать это — использовать хук фильтра oembed_fetch_url, чтобы добавить дополнительные аргументы к URL-запросу oEmbed. Моей конкретной целью было разрешить параметр autoplay, но этот метод легко адаптировать под любые необходимые аргументы oEmbed.

Сначала добавьте это в ваш functions.php:

<?php
/**
 * Добавление параметров к oEmbed
 * @src https://foxland.fi/adding-parameters-to-wordpress-oembed/
 * @src https://github.com/WordPress/WordPress/blob/ec417a34a7ce0d10a998b7eb6d50d7ba6291d94d/wp-includes/class-oembed.php#L553
 */
$allowed_args = ['autoplay'];

function koa_oembed_args($provider, $url, $args) {
    global $allowed_args;

    $filtered_args = array_filter(
        $args,
        function ($key) use ($allowed_args) {
            return in_array($key, $allowed_args);
        },
        ARRAY_FILTER_USE_KEY
    );

    foreach ($filtered_args as $key => $value) {
        $provider = add_query_arg($key, $value, $provider);
    }

    return $provider;
}

add_filter('oembed_fetch_url', 'koa_oembed_args', 10, 3);

Эта функция берет сгенерированный URL oEmbed и соответствующие аргументы, проверяет их против жестко заданного списка разрешенных аргументов, в данном случае ['autoplay']. Если она находит какие-либо из этих ключевых слов в аргументах, переданных фильтру oEmbed, она добавляет их с заданным значением к URL oEmbed.

Затем все, что вам нужно сделать, это добавить параметр oEmbed к вашему шорткоду в редакторе WordPress, например:

[embed autoplay="true"]https://vimeo.com/1234567890/1234567890[/embed]

Имейте в виду, что класс oEmbed в WordPress использует postmeta как кэш для этих запросов, поэтому, если вы уже встраивали целевой URL ранее, вам, возможно, придется очистить кэш postmeta каким-либо образом или добавить к целевому URL строку для сброса кэша. Если ссылка уже в кэше, хук фильтра не сработает.

Надеюсь, это объяснение понятно, так как я считаю, что это довольно полезная функция, которую удивительно сложно реализовать.

8 мар. 2019 г. 00:14:19
1

Это мое решение в functions.php

function embed_responsive_autoplay($code){
    if(strpos($code, 'youtu.be') !== false || strpos($code, 'youtube.com') !== false){
        $return = preg_replace('@embed/([^"&]*)@', 'embed/$1&showinfo=0&autoplay=1', $code);
        return '<div class="embed-container">' . $return . '</div>';
    }
    return '<div class="embed-container">' . $code . '</div>';
}

add_filter( 'embed_oembed_html', 'embed_responsive_autoplay');
add_filter( 'video_embed_html', 'embed_responsive_autoplay' ); // Jetpack

наслаждайтесь

12 дек. 2014 г. 18:30:32
Комментарии

Пожалуйста, не выгружайте блок кода как есть, возможно, [отредактируйте] его и добавьте некоторые пояснения.

Mayeenul Islam Mayeenul Islam
13 дек. 2014 г. 07:01:54
5

Все параметры после первого должны передаваться в виде массива аргументов.

Пример можно посмотреть на странице кодекса.
http://codex.wordpress.org/Function_Reference/wp_oembed_get

Если вы пытаетесь взять значение произвольного поля и преобразовать его в embed-код для видео (как если бы вы вставили его в контент), то можно сделать так:

/*
   N - замените на реальный ID записи
   key - замените на ключ произвольного поля (название)
*/
$data = get_post_meta( N, 'key', true );
if( $data )
   echo apply_filters( 'the_content', $data );

Конечно, в этом случае к данным будет применено несколько фильтров, которые вам, возможно, не нужны, но способ тем не менее рабочий.

14 дек. 2010 г. 22:56:13
Комментарии

К сожалению, wp_oembed_get принимает только два аргумента: 'width' и 'height'

John P Bloch John P Bloch
14 дек. 2010 г. 23:00:45

Видимо, этот аргумент передать не получится.. по крайней мере, не через wp_oembed_get..

t31os t31os
14 дек. 2010 г. 23:10:26

Да, насколько я знаю (хотя могу ошибаться), YouTube API для oEmbed вообще не поддерживает этот параметр.

John P Bloch John P Bloch
14 дек. 2010 г. 23:56:32

Я немного покопался во встраивании, и насколько я могу судить (как вы и сказали), единственные аргументы, которые передаются, — это высота и ширина.. (легко проверить, вызвать функцию с переданным массивом, с autoplay не работает, а width и height работают).

t31os t31os
15 дек. 2010 г. 00:05:49

Спасибо всем, придется искать другое решение.

criticerz criticerz
15 дек. 2010 г. 06:44:44
0

После всех исследований я нашел вот это. Ниже приведен код.

function iweb_modest_youtube_player( $html, $url, $args ) {
    return str_replace( '?feature=oembed', '? 
    feature=oembed&modestbranding=1&showinfo=0&rel=0', $html );
}
add_filter( 'oembed_result', 'iweb_modest_youtube_player', 10, 3 );

Автор кода: https://gist.github.com/mustardBees/7704269#file-functions-php.

Спасибо!

17 окт. 2018 г. 14:18:49
0

Не уверен, нужно ли это еще, но я оставлю ответ здесь

<?php
/**
 * Скрипт ACF oEmbed с параметрами плеера 
 * @link https://www.advancedcustomfields.com/resources/oembed/
 */

$video = get_field('video');

// используем preg_match для поиска src в iframe
preg_match('/src="(.+?)"/', $video, $matches);
$src = $matches[1];

// добавляем дополнительные параметры к src iframe
$params = array(
    'background'    => 1,
    'autoplay'      => 1,
    'controls'      => 0,
    'loop'          => 0,
    'color'         => '178395',
    'title'         => 0,
    'byline'        => 0,
    'portrait'      => 0,
    'rel'           => 0,
    'showinfo'      => 0,
);

$new_src = add_query_arg($params, $src);                
$video = str_replace($src, $new_src, $video);

// добавляем дополнительные атрибуты к html iframe
$attributes = 'frameborder="0"';

$video = str_replace('></iframe>', ' ' . $attributes . '></iframe>', $video);

if($video) :
    echo '<div class='video-wrapper'>'.$iframe.'</div>';
endif;

также доступно как Gist: https://gist.github.com/zachakbar/3100e093cb8484d47586a259f9f960dc

9 февр. 2023 г. 22:37:34
3
-7

Это можно легко исправить, изменив функцию wp_oembed_get() в файле wp-includes/media.php следующим образом:

function wp_oembed_get( $url, $args = '' ) {
    // Вручную создаем IFRAME с отключенными связанными видео и включенным автовоспроизведением
    if(preg_match("/youtube.com\/watch\?v=([^&]+)/i", $url, $aMatch)){
        return '<iframe width="560" height="315" src="http://www.youtube.com/embed/' . $aMatch[1] . '?rel=0&autoplay=1" frameborder="0" allowfullscreen></iframe>';
    }

    require_once( ABSPATH . WPINC . '/class-oembed.php' );
    $oembed = _wp_oembed_get_object();
    return $oembed->get_html( $url, $args );
}
12 апр. 2012 г. 10:33:23
Комментарии

Также не забудьте выполнить следующий SQL-запрос после внесения изменений, чтобы обновить встроенный контент:

DELETE FROM wp_postmeta WHERE meta_key LIKE 'oembed%'

interimpulso interimpulso
12 апр. 2012 г. 10:38:13

После этого вы больше не сможете обновлять WordPress. Не рекомендуется.

fuxia fuxia
13 апр. 2012 г. 04:32:47

Изменение ядра — это просто плохая идея.

Philip Downer Philip Downer
1 апр. 2013 г. 20:57:48