Last active
August 29, 2015 14:05
-
-
Save bradyvercher/8eaefa5f99922ab2fb89 to your computer and use it in GitHub Desktop.
Rough proof of concept to display blog posts similar to a topic view in a forum. Save the file as a plugin and drop the [discussion] shortcode in a page.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Plugin Name: Discussion View | |
* Version: 0.1.0 | |
* Description: Display blog posts similar to a the topic view in a forum. | |
* Author: Brady Vercher | |
*/ | |
class DiscussionView { | |
public function load() { | |
add_action( 'init', array( $this, 'init' ) ); | |
add_action( 'wp_head', array( $this, 'styles' ) ); | |
} | |
public function init() { | |
add_shortcode( 'discussion', array( $this, 'shortcode_handler' ) ); | |
} | |
public function shortcode_handler( $attr = array() ) { | |
global $wpdb; | |
$sql = "SELECT c.comment_post_ID, c.comment_author, d.max_date as comment_date, p.post_title, p.comment_count, u.display_name | |
FROM $wpdb->comments c | |
INNER JOIN ( SELECT comment_post_ID, MAX( comment_date ) max_date FROM $wpdb->comments GROUP BY comment_post_ID ) d | |
INNER JOIN $wpdb->posts p | |
INNER JOIN $wpdb->users u | |
ON c.comment_post_ID=d.comment_post_ID AND c.comment_date=d.max_date AND c.comment_post_ID=p.ID AND p.post_author=u.ID | |
WHERE c.comment_approved='1' AND comment_type='' AND post_status='publish' AND post_password='' AND post_type='post' | |
ORDER BY comment_date DESC | |
LIMIT 30"; | |
$topics = $wpdb->get_results( $sql ); | |
ob_start(); | |
if ( ! empty( $topics ) ) { | |
?> | |
<table cellpadding="0" cellspacing="0" border="0" class="discussion-view"> | |
<thead> | |
<tr> | |
<th>Post Title</th> | |
<th style="text-align: center">Comments</th> | |
<th>Last Commenter</th> | |
<th>Last Comment (CST)</th> | |
</tr> | |
</thead> | |
<tbody id="the-list"> | |
<?php foreach ( $topics as $topic ) : ?> | |
<tr class="<?php echo $this->get_row_classes( $topic ); ?>"> | |
<td> | |
<a href="<?php echo get_permalink( $topic->comment_post_ID ); ?>#comments"><?php echo $topic->post_title; ?></a> | |
<span class="dv-post-author"><em>by <?php echo $topic->display_name; ?></em></span> | |
</td> | |
<td class="dv-comment-count"><?php echo $topic->comment_count; ?></td> | |
<td><?php echo $topic->comment_author; ?></td> | |
<td class="dv-datetime"><?php echo $this->format_datetime( $topic->comment_date ); ?></td> | |
</tr> | |
<?php endforeach; ?> | |
</tbody> | |
</table> | |
<?php | |
} else { | |
echo '<div class="user_content"><p>No comments yet!</p></div>'; | |
} | |
return ob_get_clean(); | |
} | |
public function get_row_classes( $topic ) { | |
$classes = array(); | |
if ( mysql2date( 'Y-m-j', $topic->comment_date) == date( 'Y-m-j', current_time( 'timestamp', 1 ) ) ) { | |
$classes[] = 'today'; | |
} | |
return implode( ' ', $classes ); | |
} | |
public function format_datetime( $datetime ) { | |
$date = mysql2date( 'Y-m-j', $datetime ); | |
if ( $date == date( 'Y-m-j', current_time( 'timestamp', 1 ) ) ) { | |
$display = 'Today ' . mysql2date( 'g:i A', $datetime ); | |
} elseif ( $date == date( 'Y-m-j', current_time( 'timestamp', 1 ) - 60*60*24 ) ) { | |
$display = 'Yesterday '. mysql2date( 'g:i A', $datetime ); | |
} else { | |
$display = date( 'M j, Y g:i A', strtotime( $datetime ) ); | |
} | |
return $display; | |
} | |
public function styles() { | |
?> | |
<style type="text/css"> | |
.discussion-view { width: 100%; border-collapse: collapse; border: 1px solid #e1dfd6; border-width: 1px 1px 0 1px;} | |
.discussion-view th { padding: 8px 5px; color: #444; font-weight: bold; background-color: #f3f3ea;} | |
.discussion-view tbody tr:nth-child(odd) { background-color: #f6f6f6;} | |
.discussion-view tbody tr.today td a { font-weight: bold;} | |
.discussion-view tbody tr.today td.dv-datetime { font-weight: bold;} | |
.discussion-view td { padding: 5px; border: 1px solid #e1dfd6; border-width: 1px 1px 1px 0;} | |
.discussion-view td.dv-comment-count { text-align: center;} | |
.discussion-view td .dv-post-author { display: block;} | |
</style> | |
<?php | |
} | |
} | |
$discussion_view = new DiscussionView(); | |
add_action( 'plugins_loaded', array( $discussion_view, 'load' ) ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment