Creating a blog from scratch with PHP - Part 5 Sidebar, Categories and Archives

David Carr

3 min read - 6th Mar, 2014

Table of Contents

Blog Series


This tutorial is extending the Creating a blog from scratch with PHP with that in mind I will only be covering new pieces of code and not the whole codebase.

This part will cover adding categories to posts.

Demo: https://demos.dcblog.dev/simpleblog-sidebar

admin demo: http://www.dcblog.dev/demos/simpleblog-sidebar/admin

username: demo
password: demo

First the templates will need updating to be in 2 column the first column will be called main and the second will be called sidebar.

Open style/main.css and replace #wrapper with:

#wrapper {
    margin:auto;
    width:960px;
}

#main {
    float:left;
    width:640px;
    margin-right:20px;
}

#sidebar {
    float:right;
    width:300px;
}

For all pages add the following structure:

<div id='main'>

    <!-- php code here -->

</div>

<div id='sidebar'>
    <?php require('sidebar.php'); ?>
</div>

Next create a new file called sidebar.php

Sidebar.php will contain all the sidebar content.

Latest Posts

To add a latest posts section loop through the posts table and set a limit for how many record to display

<h1>Recent Posts</h1>
<hr />

<ul>
<?php
$stmt = $db->query('SELECT postTitle, postSlug FROM blog_posts_seo ORDER BY postID DESC LIMIT 5');
while($row = $stmt->fetch()){
    echo '<li><a href="'.$row['postSlug'].'">'.$row['postTitle'].'</a></li>';
}
?>
</ul>

For categories it's the same as above query the cats table and loop through.

<h1>Catgories</h1>
<hr />

<ul>
<?php
$stmt = $db->query('SELECT catTitle, catSlug FROM blog_cats ORDER BY catID DESC');
while($row = $stmt->fetch()){
    echo '<li><a href="c-'.$row['catSlug'].'">'.$row['catTitle'].'</a></li>';
}
?>
</ul>

For archives loop through the posts table return the month and year for each month use a  GROUP BY to merge identical results.

In the loop create a link in the href needs a custom slug creating that will be a- then the month then the year for instance:  a-2-2014, a new rule will need to be added to the .htaccess file to point the link to archives.php 

<ul>
<?php
$stmt = $db->query("SELECT Month(postDate) as Month, Year(postDate) as Year FROM blog_posts_seo GROUP BY Month(postDate), Year(postDate) ORDER BY postDate DESC");
while($row = $stmt->fetch()){
    $monthName = date("F", mktime(0, 0, 0, $row['Month'], 10));
    $slug = 'a-'.$row['Month'].'-'.$row['Year'];
    echo "<li><a href='$slug'>$monthName</a></li>";
}
?>
</ul>

Next update .htaccess and add the following above on line 5

RewriteRule ^a-(.*)-(.*)$ archives.php?month=$1&amp;year=$2 [L]

This will point a-3-2014 to archives.php?month=3&year=2014

Next create a new file called archives.php

Copy the content of index.php to this file.
Replace the query this the following, this will collect the data from a $_GET request then display all posts that match the date range.

//collect month and year data
$month = $_GET['month'];
$year = $_GET['year'];

//set from and to dates
$from = date('Y-m-01 00:00:00', strtotime("$year-$month"));
$to = date('Y-m-31 23:59:59', strtotime("$year-$month"));

$stmt = $db->prepare('SELECT postID, postTitle, postSlug, postDesc, postDate FROM blog_posts_seo WHERE postDate >= :from AND postDate <= :to ORDER BY postID DESC');
$stmt->execute(array(
    ':from' => $from,
    ':to' => $to
));

Upload the files, All done, the blog now has a sidebar with categories, latest posts and archives.

0 comments
Add a comment

Copyright © 2024 DC Blog - All rights reserved.