utopianfool's
LIVE PUBLIC RSS FEED
Codepen RSS Feeds
It all started with a facination of really simple syndication and codepen collections. The original idea was to automatically grab and show the collections in my codepen profile, so I could keep adding them in codepen and they would be updated on other sites. Surely they might have a feed to tap into?
Turns out that all users have:
- RSS feeds for activity
- A Public Pens feed https://codepen.io/utopianfool/public/feed
- and Editor Picked Pens: https://codepen.io/picks/feed
- and each collection also has an RSS feed https://codepen.io/collection/DwQgjz/feed
Fetching and Parsing with Javascript
After furiously searching over several web pages and codepens, then testing other code with my own tweaks I came accross this post “How to Fetch and Parse RSS Feeds in JavaScript” by CSS-Tricks. This was the golden nugget I was looking for.
const RSS_URL = `https://codepen.io/utopianfool/public/feed`;
fetch(RSS_URL)
.then(response => response.text())
.then(str => new window.DOMParser().parseFromString(str, "text/xml"))
.then(data => {
console.log(data);
const items = data.querySelectorAll("item");
let html = ``;
items.forEach(el => {
html += `
<article>
<img src="${el.querySelector("link").innerHTML}/image/large.png" alt="">
<h2>
<a href="${el.querySelector("link").innerHTML}" target="_blank" rel="noopener noreferrer">
${el.querySelector("title").innerHTML}
</a>
</h2>
</article>
`;
});
document.querySelector('#out').insertAdjacentHTML("beforeend", html);
});You could just grab this and plonk it straight in the page if you wrap it in <script></script> tags and add a div with an id=”out” and it will render the feed. But this is going to get tedious if we are going to embed it on multiple pages, so a WordPress shortcode was the next step.
Making it a Custom Sortcode
Several parts to this. Create a file called something like custom-shortcodes.php, this will house our shortcode script:
<?php
function codepen_rss_feed() {
if( is_single() ) {
?>
<h1 class="codepen-feed-title"><i class="fa fa-codepen" aria-hidden="true"></i> utopianfool's<br /><span>LIVE PUBLIC RSS FEED</span></h1>
<hr />
<div id="out" class="codepen-feed"></div>
<?php
wp_enqueue_script( 'codepen-rss', get_stylesheet_directory_uri() . '/js/codepen-rss.js');
}
}You may notice that the javascript that’s fetching the RSS feed is in its own file called codepen-rss.js.
Create that file, copy the fetch script from above and save it into /js/codepen-rss.js
Note: get_stylesheet_directory_uri() is used here to enqueue the javascript file because it is in a child theme. If it were in a parent theme you would use get_template_directory_uri() instead.
Note:The function is wraped in an if statement so that the shortcode will only run on a post page ‘is_single(). This shortcode caused no end of trouble breaking the backend until conditional tags came to the rescue.
Now we can include our custom-shortcodes.php file in the main functions.php
/**
* custom shortcodes
*/
include('partials/custom-shortcodes.php');and then register our shortcode.
/**
* Register shortcodes
*/
function register_shortcodes(){
add_shortcode('codepenrss', 'codepen_rss_feed');
}
add_action( 'init', 'register_shortcodes');Here we are calling the codepen_rss_feed() function from the custom-shortcodes.php file and assigning the shortcode name ‘codepenrss’. Now we can use the shortcode to display our feed on any post page.
[codepenrss]
You will probably want to put your own style spin on it. Below is the css used for this example feed and a good starting point:
/* Codepen RSS feed */
.codepen-feed-title {
text-align: center;
}
.codepen-feed-title span {
font-size: 0.8rem;
}
.codepen-feed {
margin: 1rem;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
grid-gap: 2rem;
background: transparent;
}
.codepen-feed img {
max-width: 100%;
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);
}
.codepen-feed article {
background: #e6e6e6;
border-radius: 4px;
border: 1px solid rgba(0, 0, 0, 0.16);
overflow: hidden;
}
.codepen-feed article a {
text-decoration: none;
color: #455A64;
}
.codepen-feed article a:hover, .codepen-feed article a:focus {
color: #2196F3;
}
.codepen-feed article h2 {
text-transform: uppercase;
font-size: 1.8rem;
font-weight: 600;
line-height: 30px;
padding: 1rem 1rem;
margin: 0;
}Further reading
- WordPress Shortcodes -> A complete guide
- Creating shortcodes with parameters
- WordPress conditional tags