Skip to content

Commit

Permalink
Adds blog sitemap generation
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobemerick committed Jan 1, 2016
1 parent cde30c0 commit ad560a6
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 8 deletions.
16 changes: 11 additions & 5 deletions public/blog/.htaccess
@@ -1,9 +1,15 @@
ExpiresActive On
ExpiresDefault A0
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A0

<FilesMatch "\.(css|gif|ico|jpeg)$">
ExpiresDefault A604800
</FilesMatch>
<FilesMatch "\.(css|gif|ico|jpeg)$">
ExpiresDefault A604800
</FilesMatch>

<FilesMatch "\.xml$">
ExpiresDefault A3600
</FilesMatch>
</IfModule>

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
Expand Down
136 changes: 133 additions & 3 deletions script/cron/generate-sitemaps.php
Expand Up @@ -6,14 +6,17 @@
use Thepixeldeveloper\Sitemap\Url;
use Thepixeldeveloper\Sitemap\Urlset;

use Jacobemerick\Web\Domain\Blog\Post\MysqlPostRepository as BlogPostRepository;
use Jacobemerick\Web\Domain\Blog\Tag\MysqlTagRepository as BlogTagRepository;

/**
* Helper function to build each sitemap
*
* @param array $entries
* @param string $domain
* @return boolean
*/
function buildSitemap(array $entries, $domain, $folder) {
$buildSitemap = function (array $entries, $domain, $folder) {
$urlSet = new Urlset();
foreach ($entries as $path => $entry) {
$url = new Url("{$domain}{$path}"); // todo better detection of domain by env
Expand All @@ -34,9 +37,136 @@ function buildSitemap(array $entries, $domain, $folder) {
fclose($sitemapHandle);

rename($tempSitemap, $finalSitemap);
};


/*********************************************
* blog.jacobemerick.com
*********************************************/
$reduceToMostRecentBlogPost = function ($recentPost, $post) {
if (is_null($recentPost)) {
return $post;
}
$postDate = new DateTime($post['date']);
$recentPostDate = new DateTime($recentPost['date']);
return ($postDate > $recentPostDate) ? $post: $recentPost;
};

$blogPostsPerPage = 10;

$blogPostRepository = new BlogPostRepository($container['db_connection_locator']);
$activeBlogPosts = $blogPostRepository->getActivePosts();
$mostRecentBlogPost = array_reduce($activeBlogPosts, $reduceToMostRecentBlogPost);

// todo these post-level dates should be accurate to H:i:s
$entryArray = [
'/' => [
'lastmod' => (new DateTime($mostRecentBlogPost['date']))->format('Y-m-d'),
'changefreq' => 'daily',
'priority' => .9,
]
];
for ($i = 2; (($i - 1) * $blogPostsPerPage) < count($activeBlogPosts); $i++) {
$entryKey = "/{$i}/";
$entryArray += [
$entryKey => [
'lastmod' => (new DateTime($mostRecentBlogPost['date']))->format('Y-m-d'),
'changefreq' => 'daily',
'priority' => .1,
]
];
}

$blogCategoryArray = [
'hiking',
'personal',
'web-development',
];

foreach ($blogCategoryArray as $blogCategory) {
$blogCategoryPosts = array_filter($activeBlogPosts, function ($post) use ($blogCategory) {
return $post['category'] == $blogCategory;
});
$mostRecentBlogCategoryPost = array_reduce($blogCategoryPosts, $reduceToMostRecentBlogPost);

$entryKey = "/{$blogCategory}/";
$entryArray += [
$entryKey => [
'lastmod' => (new DateTime($mostRecentBlogCategoryPost['date']))->format('Y-m-d'),
'changefreq' => 'daily',
'priority' => .3,
]
];

for ($i = 2; (($i - 1) * $blogPostsPerPage) < count($blogCategoryPosts); $i++) {
$entryKey = "/{$blogCategory}/{$i}/";
$entryArray += [
$entryKey => [
'lastmod' => (new DateTime($mostRecentBlogCategoryPost['date']))->format('Y-m-d'),
'changefreq' => 'daily',
'priority' => .1,
]
];
}
}

$blogTagRepository = new BlogTagRepository($container['db_connection_locator']);
$blogTags = $blogTagRepository->getAllTags();
foreach ($blogTags as $blogTag) {
$blogPostsWithTag = $blogPostRepository->getActivePostsByTag($blogTag['id']);
if (count($blogPostsWithTag) < 1) {
continue;
}

$mostRecentBlogTagPost = array_reduce($blogPostsWithTag, $reduceToMostRecentBlogPost);

$entryKey = "/tag/{$blogTag['tag']}/";
$entryArray += [
$entryKey => [
'lastmod' => (new DateTime($mostRecentBlogTagPost['date']))->format('Y-m-d'),
'changefreq' => 'daily',
'priority' => .1,
]
];

for ($i = 2; (($i = 1) * $blogPostsPerPage) < count($blogPostsWithTag); $i++) {
$entryKey = "/tag/{$blogTag['tag']}/{$i}/";
$entryArray += [
$entryKey => [
'lastmod' => (new DateTime($mostRecentBlogTagPost['date']))->format('Y-m-d'),
'changefreq' => 'daily',
'priority' => .1,
]
];
}
}

$reversedBlogPosts = array_reverse($activeBlogPosts);
foreach ($reversedBlogPosts as $blogPost) {
$entryKey = "/{$blogPost['category']}/{$blogPost['path']}/";
$entryArray += [
$entryKey => [
'lastmod' => (new DateTime($blogPost['date']))->format('Y-m-d'), // todo this should be based on comment
'changefreq' => 'weekly',
'priority' => .8,
],
];
}

// site.jacobemerick.com
$entryArray += [
'/about/' => [
'lastmod' => (new DateTime('December 20, 2015'))->format('Y-m-d'),
'changefreq' => 'monthly',
'priority' => .2,
]
];

$buildSitemap($entryArray, 'http://blog.jacobemerick.com', 'blog');


/*********************************************
* site.jacobemerick.com
*********************************************/
$entryArray = [
'/' => [
'lastmod' => (new DateTime('December 20, 2015'))->format('Y-m-d'),
Expand All @@ -60,4 +190,4 @@ function buildSitemap(array $entries, $domain, $folder) {
],
];

buildSitemap($entryArray, 'http://site.jacobemerick.com', 'site');
$buildSitemap($entryArray, 'http://site.jacobemerick.com', 'site');

0 comments on commit ad560a6

Please sign in to comment.