The easiest way for that would be using a query string.
I'll assume that you are looking at a category page.
First we will add the buttons to the category page
<a href="?sortby=comment>Sort by Comment</a>
<a href="?sortby=views>Sort by Views</a>
<a href="?sortby=alphabet>Alphabetical</a>
This adds a query string to the URL of the page, now on the top of the category page we will add this code:
<?php
if (array_key_exists("sortby", $_GET) === true)
{
$newQuery = sortIt($_GET['sortby']);
}
?>
After that we will create a function that will sort the posts for us in the functions.php template
Since we have 3 sort types, we could use a switch case or a if-else statement. I will use if-else here.
<?php
function sortIt($sortType)
{
global $wp_query;
$cat_ID = get_query_var('cat');
if (strcmp($sortType, 'comment') == 0 )
{
$newQuery = new WP_Query( array( 'orderby' => 'comment_count' , 'cat' => $cat_ID, 'posts_per_page' => '10') );
}
if (strcmp($sortType, 'views') == 0 )
{
$newQuery = new WP_Query( array( 'meta_key' => 'views', 'orderby' => 'meta_value_num', 'order'=> 'DESC', 'cat' => $cat_ID, 'posts_per_page' => '10') );
}
if (strcmp($sortType, 'alphabetical') == 0 )
{
$newQuery = new WP_Query( array( 'orderby' => 'title' , 'cat' => $cat_ID, 'posts_per_page' => '10') );
}
return $newQuery;
}
?>
Wordpress does not have a native view count, I used an instruction that i read here.
Since we have all the necessary functions and variables, we need to override the query.
You will edit the loop so it goes like this:
<?php if ( $newQuery->have_posts() ) : while ( $newQuery->have_posts() ) : $newQuery->the_post(); ?>
That's it :)