Solucionado (ver solução)
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