juanfra91
Curioso
Usuário com poucas negociações! Use sempre o saldo do ForoBeta!
Se você tem uma playlist com 40 vídeos e quer 40 posts no WordPress, cada um com seu título, descrição, miniatura como imagem destacada e o vídeo embutido, fazer isso à mão toma a sua tarde inteira. Veja como fazer de graça com a API do YouTube e um script PHP.
Parte 1: faça você mesmo com a YouTube Data API
Você precisa de:
Os passos:
Salve como
O que vai acontecer com você:
Parte 1: faça você mesmo com a YouTube Data API
Você precisa de:
- Uma chave da YouTube Data API v3 (grátis no Google Cloud Console → APIs e serviços → Credenciais). Cada página de playlist e cada lote de 50 vídeos gasta 1 unidade; a cota padrão é de 10.000 por dia, então uma playlist de algumas centenas de vídeos não é problema.
- WP-CLI no servidor, para rodar o script com
wp eval-file. - O ID da playlist: o que vem depois de
list=na URL.
Os passos:
playlistItems.listretorna os IDs de 50 em 50, comnextPageTokenenquanto houver mais.videos.listcom até 50 IDs juntos traz título, descrição, tags, miniaturas e duração (playlistItems não traz a duração nem todas as tags).- Se a URL do YouTube ficar sozinha em uma linha do conteúdo, o WordPress a converte em player (oEmbed). Não é preciso iframe.
media_sideload_image()sobe a miniatura para a biblioteca eset_post_thumbnail()a define como destacada. Salvando a URL de origem em um campo personalizado, os posts não se repetem.
Salve como
import-playlist.php:
PHP:
<?php
// Se corre con: wp eval-file import-playlist.php
$key = 'TU_CLAVE_DE_API';
$playlist = 'PL_ID_DE_TU_PLAYLIST';
require_once ABSPATH . 'wp-admin/includes/media.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/image.php';
function yt( $endpoint, $args ) {
$url = add_query_arg( array_filter( $args ), "https://www.googleapis.com/youtube/v3/$endpoint" );
$res = wp_remote_get( $url, [ 'timeout' => 20 ] );
if ( is_wp_error( $res ) ) WP_CLI::error( $res->get_error_message() );
return json_decode( wp_remote_retrieve_body( $res ), true );
}
// 1. Todos los IDs de la playlist, 50 por página
$ids = []; $token = '';
do {
$page = yt( 'playlistItems', [ 'part' => 'contentDetails', 'maxResults' => 50,
'playlistId' => $playlist, 'pageToken' => $token, 'key' => $key ] );
foreach ( $page['items'] ?? [] as $item ) $ids[] = $item['contentDetails']['videoId'];
$token = $page['nextPageToken'] ?? '';
} while ( $token );
// 2 y 3. Detalles de a 50, un borrador por video
foreach ( array_chunk( $ids, 50 ) as $batch ) {
$data = yt( 'videos', [ 'part' => 'snippet,contentDetails', 'id' => implode( ',', $batch ), 'key' => $key ] );
foreach ( $data['items'] ?? [] as $v ) {
$url = 'https://www.youtube.com/watch?v=' . $v['id'];
if ( get_posts( [ 'post_type' => 'post', 'post_status' => 'any', 'fields' => 'ids',
'meta_key' => '_source_url', 'meta_value' => $url ] ) ) continue; // ya importado
$s = $v['snippet'];
$post_id = wp_insert_post( [
'post_title' => $s['title'],
'post_content' => $url . "\n\n" . $s['description'],
'post_status' => 'draft',
'tags_input' => array_slice( $s['tags'] ?? [], 0, 5 ),
] );
// 4. Miniatura como imagen destacada (maxres no existe en todos los videos)
$thumb = $s['thumbnails']['maxres']['url'] ?? $s['thumbnails']['high']['url'];
$img = media_sideload_image( $thumb, $post_id, $s['title'], 'id' );
if ( ! is_wp_error( $img ) ) set_post_thumbnail( $post_id, $img );
// La duración viene en ISO 8601 (PT4M13S); se guarda en segundos
$d = new DateInterval( $v['contentDetails']['duration'] );
update_post_meta( $post_id, 'duration', $d->d * 86400 + $d->h * 3600 + $d->i * 60 + $d->s );
update_post_meta( $post_id, '_source_url', $url );
WP_CLI::log( "Borrador $post_id: {$s['title']}" );
}
}
O que vai acontecer com você:
- Os vídeos privados ou apagados aparecem na playlist, mas não em
videos.list: são pulados automaticamente. - Muitos vídeos antigos não têm
maxresdefault.jpg; por isso o fallback parahigh. - A chave, só do lado do servidor e restrita à YouTube Data API no Cloud Console.
- Você pode rodá-lo todo dia por cron: com a verificação de
_source_urlele só adiciona os vídeos novos.
Última edição por um moderador: