introduce post & comment classes, props skeltoac, See #12267

git-svn-id: http://svn.automattic.com/wordpress/trunk@13187 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
wpmuguru 2010-02-18 01:52:37 +00:00
parent d472b153ca
commit 79f04413f4
2 changed files with 102 additions and 0 deletions

View File

@ -1696,4 +1696,102 @@ class WP_MatchesMapRegex {
} }
// A factory and constructor that upgrades stdClass "rows" to WordPress classes.
class wp_row {
// Factory. Call statically to upgrade a stdClass object to its specialized class: $o = wp_row::get($row).
function get($row) {
if ( is_a($row, 'wp_row') || is_subclass_of($row, 'wp_row') )
return $row;
if ( is_array($row) )
$row = (object) $row;
$class = 'wp_row';
if ( isset($row->post_type) ) {
if ( class_exists("wp_" . $row->post_type) )
$class = "wp_" . $row->post_type;
else
$class = "wp_post";
} elseif ( isset($row->comment_type) ) {
if ( class_exists("wp_" . $row->comment_type) )
$class = "wp_" . $row->comment_type;
else
$class = "wp_comment";
}
if ( function_exists("apply_filters") ) {
$filtered_class = apply_filters("wp_row_class", $class, $row);
if ( class_exists($filtered_class) )
$class = $filtered_class;
}
return call_user_func(array($class, 'get'), $row);
}
function wp_row(&$row) {
return $this->__construct($row);
}
function __construct($row) {
if ( is_array($row) )
$row = (object) $row;
foreach ( (array) $row as $k => $v )
$this->$k = $row->$k;
}
}
class wp_post extends wp_row {
// Factory
function get($post) {
if ( $post = get_post($post) )
return new wp_post($post);
else
return new WP_Error(404, "Post not found.");
}
function id() { return $this->ID; }
function post_id() { return $this->ID; }
function type_id() { return 'post-' . $this->ID; }
function classes($class='') { return join( ' ', get_post_class( $class, $this->id() ) ); }
function permalink() { return get_permalink($this); }
function title() { return get_the_title($this); }
function date($format='') { return; }
function time($format='') { return get_the_time($format, $this); }
function author() { $authordata = get_userdata($this->post_author); return $authordata->display_name; }
function content() { return get_content($this); }
}
class wp_comment extends wp_row {
// Factory
function get($comment) {
if ( $comment = get_comment($comment) )
return new wp_comment($comment);
else
return new WP_Error(404, "Comment not found.");
}
function id() { return $this->comment_ID; }
function post_id() { return $this->comment_post_ID; }
function type_id() { return 'comment-' . $this->comment_ID; }
function classes($class='') { return join( ' ', get_comment_class( $class, $this->id() ) ); }
function permalink() { return get_comment_link($this); }
function title() { return sprintf(__("Comment on %s"), get_the_title($this->post_id())); }
function time($format='') { return mysql2date($format?$format:get_option('time_format'), $this->comment_date); }
function date($format='') { return date($format?$format:get_option('date_format'), $this->time('U')); }
function author() { return $this->comment_author; }
function excerpt() { return $this->comment_content; }
function content() { return get_comment_content($this); }
}
function is_post($object) {
return is_a('wp_post', $object);
}
function is_comment($object) {
return is_a('wp_comment', $object);
}
?> ?>

View File

@ -2302,6 +2302,10 @@ class WP_Query {
if ( !$q['suppress_filters'] ) if ( !$q['suppress_filters'] )
$this->posts = apply_filters('posts_results', $this->posts); $this->posts = apply_filters('posts_results', $this->posts);
// Turn each row into a classed object, e.g. wp_post, wp_comment.
if ( is_array($this->posts) )
$this->posts = array_map(array('wp_row', 'get'), $this->posts);
if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) { if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
$cjoin = apply_filters('comment_feed_join', ''); $cjoin = apply_filters('comment_feed_join', '');
$cwhere = apply_filters('comment_feed_where', "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'"); $cwhere = apply_filters('comment_feed_where', "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'");