Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
12
respostas

Refatoração de código PHP

Eu fiz o curso da Alura de tema do Wordpress, mas já faz tempo e se não me engano é utilizado um tema existente, então eu estou tentando adaptar algumas coisas de um site que eu faço e estava vendo uma forma de adicionar vídeos do Youtube, encontrei um tutorial, mas são várias playlists e fica repetitivo, o que eu poderia fazer?

<?php
$api_key = 'your-api-key'; //não repete
$playlist_id =  'playlist_id';  //tem várias
$playlist_id1=  'playlist_id'
$playlist_id 2=  'playlist_id'
$api_url = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=25&playlistId='. $playlist_id . '&key=' . $api_key;//repete
$api_url1 = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=25&playlistId='. $playlist_id1 . '&key=' . $api_key;

$playlist = json_decode(file_get_contents($api_url));
$playlist1 = json_decode(file_get_contents($api_url1));
?>

Tutorial de origem: https://thedebuggers.com/retrieve-playlist-videos-youtube-api/

12 respostas

Gisele, boa tarde!

Eu refatorei o código percebendo que tem muita coisa que se repete, o meu primeiro pensamento foi usar estruturas de repetição, pra isso eu usei arrays, pelo fato de serem iteráveis, ficando assim:

<?php
$api_key = 'your-api-key';
$idList = ['playlist_id','playlist_id']
$urlList = [];
forEach ($idList as $id) {
    $newUrl = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=25&playlistId='. $id . '&key=' . $api_key;
      array_push($urlList, $newUrl);
}
$playlists = [];

forEach ($urlList as $url) {
      array_push($playlists, json_decode(file_get_contents($url));
}
?>

Espero ter ajudado e bons estudos!

Obrigada, pensei nisso, mas e depois pra mim utilizar pra mostrar cada lista, não sei como fica o escopo no PHP, mas eu preciso listar cada playlist separada. Fica

$playlist[0]?

($playlist->items //aqui?

<ul>
<?php foreach($playlist->items AS $item): ?>
  <li><img src="<?php echo $item->snippet->thumbnails->default->url; ?>"> <h4><?php echo $item->snippet->title;  ?></h4></li>
<?php endforeach; ?>
</ul>

Gisele, boa tarde!

No caso ficaria sem o [] assim

<?php foreach($playlist AS $item): ?>
  <li><img src="<?php echo $item->snippet->thumbnails->default->url; ?>"> <h4><?php echo $item->snippet->title;  ?></h4></li>
<?php endforeach; ?>

$playlist sem identificar qual delas ou eu estou perdendo alguma coisa? Eu identifico qual é qual pelo nome da variável, se eu fizer o loop, como eu identifico? É um array de listas, mas eu preciso listar cada uma separadamente, por isso eu falei do [0][1][2]... São várias listas que eu estava listando assim:

$playlist_id1 = 'xxxxxxxxxxxx'; 
$playlist_id2 = 'yyyyyyyyyyyy';

$api_url1 = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,id&order=date&maxResults=3&playlistId='. $playlist_id1 . '&key=' . $api_key;

$api_url2 = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,id&order=date&maxResults=3&playlistId='. $playlist_id2 . '&key=' . $api_key;

 $playlist1 = json_decode(file_get_contents($api_url1));
 $playlist2 = json_decode(file_get_contents($api_url2));

<h4>Título 1</h4>
                        <ul>           
                            <?php 
                                 foreach($playlist1->items AS $item): 
                            ?>  
                            <li class="video-thumbnail"><a target="_blank" href='<?php echo 'https://www.youtube.com/watch?v='.$item->snippet->resourceId->videoId ?>'><img src="<?php echo $item->snippet->thumbnails->medium->url; ?>"></a></li>
                            <?php endforeach; ?>
                         </ul>
<h4>Título 2</h4>
         <ul>           
                   <?php 
                     foreach($playlist2->items AS $item): 
                    ?>  
                  <li class="video-thumbnail"><a target="_blank" href='<?php echo 'https://www.youtube.com/watch?v='.$item->snippet->resourceId->videoId ?>'><img src="<?php echo $item->snippet->thumbnails->medium->url; ?>"></a></li>
                    <?php endforeach; ?>
                  </ul>

Eu tentei colocar os loops e playlists, mas não sei direito como funciona arrays no PHP, porque eu acostumei com Javascript e o foreach é diferente.

$playlist2->items AS $item

url -> informações -> um item

É isso?

$playlists->items AS $item

Não funciona

solução!

O problema é separar cada playlist no for eu acho, porque quando eu utilizei somente uma playlist não ocorria esse erro, eu nunca precisei utilizar um array dessa forma no PHP.

<?php 
             $api_key = 'chave';
             $idList = ['chave1','chave2'];
             $urlList = [];
                     forEach ($idList as $id) {
              $newUrl = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=3&playlistId='. $id . '&key=' . $api_key;
                                  array_push($urlList, $newUrl);
                            }                            
                            //print_r($urlList); 
                  $playlists = [];
                    forEach ($urlList as $url) {
                                  array_push($playlists, json_decode(file_get_contents($url)));
                            }
?>
  <?php 
                foreach($playlists->items AS $item):                                
                  ?>  
                            <li class="video-thumbnail"><a target="_blank" href='<?php echo 'https://www.youtube.com/watch?v='.$item->snippet->resourceId->videoId ?>'><img src="<?php echo $item->snippet->thumbnails->medium->url; ?>"></a></li>
                            <?php endforeach; ?>
                         </ul>                  

Erro:

Warning : Invalid argument supplied for foreach() in

Gisele, boa tarde!

Isso está ocorrendo pois a chave items, não existe dentro de $playlists.

Me perdoa, eu marquei como solucionado sem querer agora, mas continuo aqui para ajudar!

Oi, então eu estou testando para ver o que a API devolve, eu tinha esquecido o que era o console.log() do PHP, é o print_r().

Utilizando esse comando print_r($playlists[0]), ele me devolve o exemplo abaixo e pode ver que tem [items] logo no inicio e quando eu tento print_r($playlists[0]->items) ele devolve um Array[0], só que eu não consigo ver mais depois disso print_r($playlists[0]->items->id), retorna um erro :

Fatal error
: Uncaught Error: Cannot use object of type stdClass as array in C:\xampp\htdocs\wordpress

Olha o resultado de uma playlist:

stdClass Object ( [kind] => youtube#playlistItemListResponse [etag] => "8jEFfXBrqiSrcF6Ee7MQuz8XuAM/qpJ1i01CgbJ7EDSRUfrWBYkAsi8" [nextPageToken] => CAMQAA [pageInfo] => stdClass Object ( [totalResults] => 414 [resultsPerPage] => 3 ) **[items]** => Array ( [0] => stdClass Object ( [kind] => youtube#playlistItem [etag] => "8jEFfXBrqiSrcF6Ee7MQuz8XuAM/CYibgFTGHxuRZFDi5mO0QEnI8wg" [id] => UEx4SXEyMUx1c3hYN3BGRzV2TTI0OFp3NEt4dHFtazhvZy5EODk5RTI0RkMzQ0M2NTA0 [snippet] => stdClass Object ( [publishedAt] => 2019-08-28T23:07:29.000Z [channelId] => UC5XG4yYM-_DQ-3HPRuam76Q [title] => Legalidade | Trailer Oficial [description] => Legalidade | Trailer Oficial Confira o trailer de #Legalidade Somos o melhor destino para quem busca trailers assim que eles são lançados. Se você é fã de cinema como a gente, INSCREVA-SE e receba todas as novidades dos seus filmes favoritos!

Não tem como deletar as mensagens, criei outro tópico para não atrapalhar.

Gisele, pode criar sim!

Cria e manda o link dele aqui que eu dou continuidade lá

Acredito ter entendido o que está ocorrendo,

O playlist[0] possui uma atibuto items, mas não o playlist, para isso basta mudar para ficar assim:

<?php
foreach ($playlists AS $video):
?>  
    <li class="video-thumbnail"><a target="_blank" href='<?php echo 'https://www.youtube.com/watch?v=' . $video->items->snippet->resourceId->videoId ?>'><img src="<?php echo $video->items->snippet->thumbnails->medium->url; ?>"></a></li>
<?php endforeach; ?>
</ul>                  
?>

Não resolveu, aqui o link, e parece que tem um ?> a mais. https://cursos.alura.com.br/forum/topico-array-de-objetos-e-array-de-arrays-no-php-90932