Desde abril de 2015 YouTube cambió la estructura de su API y de sus Feeds y muchos scripts antiguos dejaron de funcionar. Con la siguiente función actualizada de PHP podrás tomar el último video publicado en tu canal de YouTube.

Lo único que necesitamos tener es el Feed RSS del canal que desde hace un tiempo ya no está tan a la vista en la interfaz de YouTube, ignoro si estará por ahí escondido el pequeño icono anaranjado pero por si a caso no está por ningun lado lo puedes sacar desde el código fuente de la página de inicio de tu usuario de YouTube, es decir, de aquí:

El Feed RSS está en la URI con el siguiente formato. Para ejemplificar, en este artículo usaremos el canal cuyo ID es UCDokoFcraNxdN2ED8shN27A.

https://www.youtube.com/feeds/videos.xml?channel_id=UCDokoFcraNxdN2ED8shN27A
Lenguaje del código: Access log (accesslog)

Si analizamos el código fuente del Feed, veremos la siguiente estructura:

<feed> <link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=UCDokoFcraNxdN2ED8shN27A"/> <id>yt:channel:UCDokoFcraNxdN2ED8shN27A</id> <yt:channelId>UCDokoFcraNxdN2ED8shN27A</yt:channelId> <title>Historia de Mesoamérica</title> <link rel="alternate" href="https://www.youtube.com/channel/UCDokoFcraNxdN2ED8shN27A"/> <author> <name>Historia de Mesoamérica</name> <uri> https://www.youtube.com/channel/UCDokoFcraNxdN2ED8shN27A </uri> </author> <published>2020-08-05T20:37:21+00:00</published> <entry> <id>yt:video:LDYNsnLWYRQ</id> <yt:videoId>LDYNsnLWYRQ</yt:videoId> <yt:channelId>UCDokoFcraNxdN2ED8shN27A</yt:channelId> <title>Olmecas de La Venta</title> <link rel="alternate" href="https://www.youtube.com/watch?v=LDYNsnLWYRQ"/> <author> <name>Historia de Mesoamérica</name> <uri> https://www.youtube.com/channel/UCDokoFcraNxdN2ED8shN27A </uri> </author> <published>2020-08-06T22:00:21+00:00</published> <updated>2020-08-06T22:38:50+00:00</updated> <media:group> <media:title>Olmecas de La Venta</media:title> <media:content url="https://www.youtube.com/v/LDYNsnLWYRQ?version=3" type="application/x-shockwave-flash" width="640" height="390"/> <media:thumbnail url="https://i1.ytimg.com/vi/LDYNsnLWYRQ/hqdefault.jpg" width="480" height="360"/> <media:description/> <media:community> <media:starRating count="9" average="4.11" min="1" max="5"/> <media:statistics views="296"/> </media:community> </media:group> </entry> <entry>....</entry> </feed>
Lenguaje del código: XQuery (xquery)

En cada nodo <entry> se encuentra la información de un video. Los Feed RSS de YouTube contienen 15 entries, lo que significa que podemos ver los últimos 15 videos subidos al canal. Como en nuestro caso solo nos interesa el último video, nos enfocaremos en el primer entry, o dicho de otro modo, el entry[0].

Para acceder a la información del <entry>[0] podemos usar la clase SimpleXMLElement. Quedaría así:

$youtube = new SimpleXMLElement('https://www.youtube.com/feeds/videos.xml?channel_id=UCDokoFcraNxdN2ED8shN27A', 0, true); $entry = $youtube->entry[0];
Lenguaje del código: PHP (php)

Como ya hemos analizado en otras ocasiones, el primer parámetro del constructor de SimpleXMLElement es un string que contiene una cadena XML o la ruta a un archivo XML. El segundo parámetro es un Integer de opciones (en este caso no lo necesitamos) y el tercer parámetro es un Boolean para indicar si el primer parámetro es un ruta de archivo o no (como en este caso sí es, enviamos un true).

De ese modo en la variable $youtube creamos un objeto que contiene todo el documento XML. Y en la variable $entry guardamos el valor del primer <entry> .

En este primer podemos encontrar toda la información del último video (título, descripción, número de reproducciones, fecha de publicación, etc), pero lo que es más importante, podemos ver su ID que es en realidad lo único que necesitamos para poder incrustar el reproductor.

Pero hay un problema, el ID del video se encuentra en un nodo con el namespace yt:

<yt:videoId>LDYNsnLWYRQ</yt:videoId>
Lenguaje del código: XQuery (xquery)

Si tratamos de obtener el valor de forma directa, no tendremos resultado, por lo que la siguiente línea no funcionará:

$videoID = $entry->videoID;
Lenguaje del código: PHP (php)

La solución a esto está en cargar los namespaces del documento y guardarlos en otra variable para poder acceder a sus nodos mediante ella. Algo así:

$ns = $entry->getNameSpaces(true);
Lenguaje del código: PHP (php)

La función SimpleXMLElement::getNameSpaces retorna en un Array los namespaces usados en el documento. En este caso, como el documento XML contiene 3 namespaces, esta función retornará lo siguiente:

Array ( [] => http://www.w3.org/2005/Atom [yt] => http://www.youtube.com/xml/schemas/2015 [media] => http://search.yahoo.com/mrss/ )
Lenguaje del código: XQuery (xquery)

Lo que haremos ahora será obtener los hijos del nodo entry que pertenezcan al namespace yt

$yt = $entry->children($ns['yt']);
Lenguaje del código: PHP (php)

La función SimpleXMLElement::children sin parámetros regresa todos los nodos hijos que no tengan namespace. Pero como le enviamos de prámetros un namespace, entonces nos regresará todos los hijos que pertenezcan a ese namespace. En este caso, sería algo así:

SimpleXMLElement Object ( [videoId] => <code>LDYNsnLWYRQ</code> [channelId] => UCDokoFcraNxdN2ED8shN27A )
Lenguaje del código: XQuery (xquery)

Ahora sí podemos sacar directamente el ID del video del siguiente modo:

$v = $yt->videoId;
Lenguaje del código: PHP (php)

Bien, teniendo claro todo lo anterior, pasamos a desarrollar la función completa.

<?php function youtube(){ try{ $youtube = new SimpleXMLElement('https://www.youtube.com/feeds/videos.xml?channel_id=UCDokoFcraNxdN2ED8shN27A', 0, true); $entry = $youtube->entry[0]; $ns = $entry->getNameSpaces(true); $yt = $entry->children($ns['yt']); $v = $yt->videoId; echo '<iframe src="https://www.youtube.com/embed/'.$v.'?rel=0&amp;showinfo=0" allowfullscreen="allowfullscreen" width="560" height="315" frameborder="0"></iframe>'; } catch(Exception $e){} }
Lenguaje del código: HTML, XML (xml)

En esta función únicamente cambiarías la ruta del Feed RSS por la de tu canal y opcionalmente los parámetros del reproductor (width y height). Todo está dentro de un bloque try-catch para evitar lanzar errores a la hora de leer la fuente XML. Si notamos, la función imprime el código de embed de YouTube. De manera que para poder usarlo, basta con llamar a la función:

<?php youtube() ?>
Lenguaje del código: PHP (php)

Listo, con eso basta para poder mostrar el último video publicado en tu canal (o bueno, en cualquier canal) dentro de tu página web o blog.