WordPress.org

Make WordPress Core

Ticket #12267: WP_Object_Factory.12267.diff

File WP_Object_Factory.12267.diff, 6.8 KB (added by filosofo, 4 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?>