Quantcast
Channel: Active questions tagged youtube-api - Stack Overflow
Viewing all articles
Browse latest Browse all 3638

WordPress shortcode should return Instagram, YouTube, and Twitch posts sorted by date

$
0
0

I am trying to make a shortcode that takes my Twitch, YouTube and Instagram posts all in one place and sorts them by the date posted, but for some reason it doesn't work. I will comment out the credentials, but I can ensure that the problem lies elsewhere, because I have tested them individually and gotten them to work individually.

<?php/*Plugin Name:  Social media crawlerDescription:  Version:      1.0Author:       License:      GPL2License URI:  https://www.gnu.org/licenses/gpl-2.0.htmlDomain Path:  /languages*/function fetch_youtube_videos($atts) {    // Extract shortcode attributes    $atts = shortcode_atts(array('channel_id' => '***', // Default channel ID (if any)'max_results' => 5, // Default number of videos to show'date' => '2010-01-01', // Default starting date in yyyy-mm-dd format    ), $atts);    $api_key = '***';    $publishedAfter = $atts['date'] . 'T00:00:00Z';    $api_url = 'https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=' . $atts['channel_id'] .'&maxResults=' . $atts['max_results'] . '&publishedAfter=' . $publishedAfter .'&order=date&type=video&key=' . $api_key;    // Make the API request    $response = wp_remote_get($api_url);    // Check for error in the response    if (is_wp_error($response)) {        return []; // Return an empty array in case of error    }    // Decode the response    $body = wp_remote_retrieve_body($response);    $data = json_decode($body);    // Check if data items exist    if (!isset($data->items)) {        return []; // Return an empty array if no videos are found    }    // Initialize the posts array    $posts = [];    // Loop through each video and append to the posts array    foreach ($data->items as $item) {        $title = $item->snippet->title;        $video_id = $item->id->videoId;        $video_url = 'https://www.youtube.com/watch?v=' . $video_id;        $embed_url = 'https://www.youtube.com/embed/' . $video_id; // URL for embedding        $publishedAt = $item->snippet->publishedAt; // Video publication date        // Construct the HTML content for the video        $html = '<div class="youtube-video">' .'<iframe width="560" height="315" src="' . esc_url($embed_url) . '" title="' . esc_attr($title) . '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>' .'<p><a href="' . esc_url($video_url) . '" target="_blank">' . esc_html($title) . '</a></p>' .'</div>';        // Add to the posts array        $posts[] = ['date' => $publishedAt,'html' => $html        ];    }    // Return the array of posts    return $posts;}function fetch_instagram_posts($atts) {    // Extract shortcode attributes    $atts = shortcode_atts(['limit' => 10, // Default number of Instagram posts to show    ], $atts);    $fields = "id,caption,media_type,media_url,permalink,thumbnail_url,timestamp,username";    $token = "*";    $limit = $atts['limit'];    $json_feed_url = "https://graph.instagram.com/me/media?fields={$fields}&access_token={$token}&limit={$limit}";    $json_feed = @file_get_contents($json_feed_url);    if ($json_feed === FALSE) {        return []; // Return an empty array in case of error    }    $contents = json_decode($json_feed, true);    $posts = [];    foreach ($contents["data"] as $post) {        $username = isset($post["username"]) ? $post["username"] : "";        $caption = isset($post["caption"]) ? $post["caption"] : "";        $media_url = isset($post["media_url"]) ? $post["media_url"] : "";        $permalink = isset($post["permalink"]) ? $post["permalink"] : "";        $media_type = isset($post["media_type"]) ? $post["media_type"] : "";        $timestamp = isset($post["timestamp"]) ? $post["timestamp"] : "";        // Construct the HTML content for the post        $html = "<div class='ig_post_container'><div>";        if ($media_type == "VIDEO") {            $html .= "<video controls style='width:100%; display: block !important;'><source src='{$media_url}' type='video/mp4'>Your browser does not support the video tag.</video>";        } else {            $html .= "<img src='{$media_url}' />";        }        $html .= "</div><div class='ig_post_details'><div><strong>@{$username}</strong> {$caption}</div><div class='ig_view_link'><a href='{$permalink}' target='_blank'>View on Instagram</a></div></div></div>";        // Add to the posts array        $posts[] = ['date' => $timestamp,'html' => $html        ];    }    // Return the array of posts    return $posts;}function fetch_twitch_videos($atts) {    // Extract shortcode attributes    $atts = shortcode_atts(['date' => '1970-01-01', // Use a very old date as default to ensure all clips are shown unless specified    ], $atts);    $clientID = '*';    $clientSecret = '*';    $tokenUrl = 'https://id.twitch.tv/oauth2/token';    // Parameters for the token request    $params = ['client_id' => $clientID,'client_secret' => $clientSecret,'grant_type' => 'client_credentials',    ];    // Initialize cURL session for the token request    $ch = curl_init($tokenUrl);    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    // Execute the token request    $response = curl_exec($ch);    if (curl_errno($ch) || ($httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE)) !== 200) {        curl_close($ch);        return []; // Return an empty array in case of error    }    curl_close($ch);    $tokenData = json_decode($response, true);    if (!isset($tokenData['access_token'])) {        return []; // Return an empty array if token not obtained    }    // Use the obtained access token to make the actual API request    $accessToken = $tokenData['access_token'];    $broadcasterUserId = '*'; // Example broadcaster's user ID    $videoClipsUrl = "https://api.twitch.tv/helix/clips?broadcaster_id=$broadcasterUserId";    $headers = ['Authorization: Bearer ' . $accessToken,'Client-Id: ' . $clientID,    ];    // Initialize cURL session for the API request    $ch = curl_init($videoClipsUrl);    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    // Execute the API request    $response = curl_exec($ch);    if (curl_errno($ch) || ($httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE)) !== 200) {        curl_close($ch);        return []; // Return an empty array if the request failed    }    curl_close($ch);    $videoClipsData = json_decode($response, true);    if (!isset($videoClipsData['data']) || empty($videoClipsData['data'])) {        return []; // Return an empty array if no videos are found    }    // Prepare posts array    $posts = array_map(function ($clip) {        $clipDate = $clip['created_at'];        $html = '<iframe src="' . $clip['embed_url'] . '&parent=*" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="620"></iframe>';        return ['date' => $clipDate,'html' => $html,        ];    }, $videoClipsData['data']);    // Filter posts based on the 'date' attribute    $minDateTimestamp = strtotime($atts['date']);    $filteredPosts = array_filter($posts, function ($post) use ($minDateTimestamp) {        return strtotime($post['date']) >= $minDateTimestamp;    });    return array_values($filteredPosts); // Re-index the array and return}function social_wall_shortcode($atts) {    ob_start();    // Assuming fetching functions have been modified to return arrays    $youtubePosts = fetch_youtube_videos($atts);    $instagramPosts = my_instagram_feed_shortcode($atts);    $twitchPosts = display_twitch_videos($atts);    // Aggregate posts    $allPosts = array_merge($youtubePosts, $instagramPosts, $twitchPosts);    // Sort posts by date    usort($allPosts, function($a, $b) {        return strtotime($a['date']) <=> strtotime($b['date']);    });    // Generate HTML output    echo '<div class="social-wall-container">';    foreach ($allPosts as $post) {        echo $post['html']; // Each post's HTML content    }    echo '</div>';    $content = ob_get_clean();    return $content;}// Register the modified shortcode with WordPressadd_shortcode('social_wall', 'social_wall_shortcode');

Viewing all articles
Browse latest Browse all 3638

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>