WordPress.org

Make WordPress Core

Ticket #12267: WP_Object_Factory.12267.diff

File WP_Object_Factory.12267.diff, 6.8 KB (added by filosofo, 8 years ago)
  • wp-includes/query.php

     
    23042304
    23052305                // Turn each row into a classed object, e.g. wp_post, wp_comment.
    23062306                if ( is_array($this->posts) )
    2307                         $this->posts = array_map(array('wp_row', 'get'), $this->posts);
     2307                        $this->posts = array_map(array('WP_Object_Factory', 'create'), $this->posts);
    23082308
    23092309                if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
    23102310                        $cjoin = apply_filters('comment_feed_join', '');
  • wp-includes/classes.php

     
    707707        }
    708708}
    709709
     710class WP_Object_Factory {
     711        /* static */ function create($object = null) {
     712                if ( is_a($object, 'WP_Object') )
     713                        return $object;
     714
     715                if ( is_array($object) )
     716                        $object = (object) $object;
     717
     718                if (
     719                        isset($object->post_type) &&
     720                        class_exists('WP_' . $object->post_type)
     721                ) {
     722                        $object_type = 'WP_' . $object->post_type;
     723                } elseif (
     724                        isset($object->comment_type) &&
     725                        class_exists('WP_' . $object->comment_type)
     726                ) {
     727                        $object_type = 'WP_' . $object->comment_type;
     728                } else {
     729                        $object_type = false;
     730                }
     731
     732                $object_type = apply_filters('wp_object_class', $object_type, $object);
     733
     734                if ( false != $object_type ) {
     735
     736                        $_object = new $object_type($object);
     737                       
     738                        if ( is_subclass_of( $_object, 'WP_Object' ) ) {
     739                                return $_object;
     740                        }
     741
     742                }
     743
     744                return $object;
     745        }
     746}
     747
     748/* abstract */ class WP_Object {
     749        var $_id;
     750        var $_title;
     751        var $_content;
     752        var $_object_type;
     753
     754        function WP_Object($object = null) {
     755                return $this->__construct($object);
     756        }
     757
     758        function __construct($object = null) {
     759                foreach( (array) $object as $n => $v )
     760                        $this->$n = $v;
     761               
     762                $mapped_properties = array(
     763                        'comment_content' => 'content',
     764                        'comment_date' => 'date',
     765                        'comment_date_gmt' => 'date_gmt',
     766                        'comment_ID' => 'id',
     767                        'ID' => 'id',
     768                        'post_content' => 'content',
     769                        'post_date' => 'date',
     770                        'post_date_gmt' => 'date_gmt',
     771                        'post_title' => 'title',
     772                );
     773
     774                $mapped_properties = apply_filters('wp_object_mapped_properties', $mapped_properties, $this->_object_type, $object);
     775
     776                        foreach( $mapped_properties as $db_prop => $obj_prop ) {
     777                                if ( isset( $object->$db_prop ) ) {
     778                                        $this->set_property($obj_prop, $object->$db_prop);
     779                                }
     780                        }
     781
     782        }
     783
     784        function get_id() {
     785                return (int) $this->_id;       
     786        }
     787
     788        function get_title() {
     789                return $this->_title;
     790        }
     791
     792        function get_content() {
     793                return $this->_content;
     794        }
     795
     796        function get_object_type() {
     797                return $this->_object_type;
     798        }
     799
     800        function set_property($name = '', $value = null) {
     801                $property_name = '_' . preg_replace('/[^a-z0-9_]/', '', strtolower($name));
     802                $this->$property_name = $value;
     803        }
     804}
     805
     806class WP_Page extends WP_Post {
     807        var $_object_type = 'page';     
     808}
     809
     810class WP_Post extends WP_Object {
     811        var $_object_type = 'post';     
     812
     813        function WP_Post($object = null) {
     814                return $this->__construct($object);
     815        }
     816
     817        function __construct($object = null) {
     818                if ( is_numeric($object) ) {
     819                        $object = get_post($object);
     820                }
     821
     822                return parent::__construct($object);
     823        }
     824}
     825
     826class WP_Comment extends WP_Object {
     827        var $_object_type = 'comment';
     828
     829        function WP_Comment($object = null) {
     830                return $this->__construct($object);
     831        }
     832
     833        function __construct($object = null) {
     834                if ( is_numeric($object) ) {
     835                        $object = get_comment($object);
     836                }
     837
     838                return parent::__construct($object);
     839        }
     840}
     841
     842
    710843/**
    711844 * Check whether variable is a WordPress Error.
    712845 *
     
    16961829
    16971830}
    16981831
    1699 // A factory and constructor that upgrades stdClass "rows" to WordPress classes.
    1700 class wp_row {
    1701         // Factory. Call statically to upgrade a stdClass object to its specialized class: $o = wp_row::get($row).
    1702         function get($row) {
    1703                 if ( is_a($row, 'wp_row') || is_subclass_of($row, 'wp_row') )
    1704                         return $row;
    1705 
    1706                 if ( is_array($row) )
    1707                         $row = (object) $row;
    1708 
    1709                 $class = 'wp_row';
    1710                 if ( isset($row->post_type) ) {
    1711                         if ( class_exists("wp_" . $row->post_type) )
    1712                                 $class = "wp_" . $row->post_type;
    1713                         else
    1714                                 $class = "wp_post";
    1715                 } elseif ( isset($row->comment_type) ) {
    1716                         if ( class_exists("wp_" . $row->comment_type) )
    1717                                 $class = "wp_" . $row->comment_type;
    1718                         else
    1719                                 $class = "wp_comment";
    1720                 }
    1721 
    1722                 if ( function_exists("apply_filters") ) {
    1723                         $filtered_class = apply_filters("wp_row_class", $class, $row);
    1724                         if ( class_exists($filtered_class) )
    1725                                 $class = $filtered_class;
    1726                 }
    1727 
    1728                 return call_user_func(array($class, 'get'), $row);
    1729         }
    1730 
    1731         function wp_row(&$row) {
    1732                 return $this->__construct($row);
    1733         }
    1734 
    1735         function __construct($row) {
    1736                 if ( is_array($row) )
    1737                         $row = (object) $row;
    1738 
    1739                 foreach ( (array) $row as $k => $v )
    1740                         $this->$k = $row->$k;
    1741         }
    1742 }
    1743 
    1744 class wp_post extends wp_row {
    1745         // Factory
    1746         function get($post) {
    1747                 if ( $post = get_post($post) )
    1748                         return new wp_post($post);
    1749                 else
    1750                         return new WP_Error(404, "Post not found.");
    1751         }
    1752 
    1753         function id() { return $this->ID; }
    1754         function post_id() { return $this->ID; }
    1755         function type_id() { return 'post-' . $this->ID; }
    1756         function classes($class='') { return join( ' ', get_post_class( $class, $this->id() ) ); }
    1757 
    1758         function permalink() { return get_permalink($this); }
    1759         function title() { return get_the_title($this); }
    1760         function date($format='') { return; }
    1761         function time($format='') { return get_the_time($format, $this); }
    1762         function author() { $authordata = get_userdata($this->post_author); return $authordata->display_name; }
    1763         function content() { return get_content($this); }
    1764 }
    1765 
    1766 class wp_comment extends wp_row {
    1767         // Factory
    1768         function get($comment) {
    1769                 if ( $comment = get_comment($comment) )
    1770                         return new wp_comment($comment);
    1771                 else
    1772                         return new WP_Error(404, "Comment not found.");
    1773         }
    1774 
    1775         function id() { return $this->comment_ID; }
    1776         function post_id() { return $this->comment_post_ID; }
    1777         function type_id() { return 'comment-' . $this->comment_ID; }
    1778         function classes($class='') { return join( ' ', get_comment_class( $class, $this->id() ) ); }
    1779 
    1780         function permalink() { return get_comment_link($this); }
    1781         function title() { return sprintf(__("Comment on %s"), get_the_title($this->post_id())); }
    1782         function time($format='') { return mysql2date($format?$format:get_option('time_format'), $this->comment_date); }
    1783         function date($format='') { return date($format?$format:get_option('date_format'), $this->time('U')); }
    1784         function author() { return $this->comment_author; }
    1785         function excerpt() { return $this->comment_content; }
    1786         function content() { return get_comment_content($this); }
    1787 }
    1788 
    1789 function is_post($object) {
    1790         return is_a('wp_post', $object);
    1791 }
    1792 
    1793 function is_comment($object) {
    1794         return is_a('wp_comment', $object);
    1795 }
    1796 
    17971832?>