WordPress.org

Make WordPress Core

Ticket #12267: presentable.diff

File presentable.diff, 9.3 KB (added by andy, 8 years ago)

Moved to presentable.php, cleaner, more methods.

  • wp-settings.php

     
    128128require( ABSPATH . WPINC . '/media.php' );
    129129require( ABSPATH . WPINC . '/http.php' );
    130130require( ABSPATH . WPINC . '/widgets.php' );
     131require( ABSPATH . WPINC . '/presentable.php' );
    131132
    132133// Load multisite-specific files.
    133134if ( is_multisite() ) {
  • wp-includes/classes.php

     
    16961696
    16971697}
    16981698
    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 
    17971699?>
  • wp-includes/presentable.php

     
     1<?php
     2
     3// A base interface class with factory methods.
     4// Not to become an actual interface, nor an abstract class,
     5// because it can be instantiated in a last-ditch effort by the
     6// factory method to return something with the necessary methods.
     7class WP_Presentable {
     8        // A factory method that upgrades stdClass "rows" to their corresponding Presentable classes.
     9        // Learn about factories and other design patterns: http://www.ibm.com/developerworks/library/os-php-designptrns/
     10        /* public static */ function create($row) {
     11                if ( is_a($row, __CLASS__) )
     12                        return $row;
     13
     14                if ( is_array($row) )
     15                        $row = (object) $row;
     16
     17                if ( isset($row->post_type) ) {
     18                        if ( empty($row->post_type) )
     19                                $row->post_type = 'post';
     20                        $class = __CLASS__ . "_$row->post_type";
     21                        if ( !class_exists($class) )
     22                                $class = __CLASS__ . '_post';
     23                } elseif ( isset($row->comment_type) ) {
     24                        if ( empty($row->comment_type) )
     25                                $row->comment_type = 'comment';
     26                        $class = __CLASS__ . "_$row->comment_type";
     27                        if ( !class_exists($class) )
     28                                $class = __CLASS__ . "_comment";
     29                }
     30
     31                if ( function_exists("apply_filters") ) {
     32                        $filtered_class = apply_filters("WP_Presentable_class", $class, $row);
     33                        if ( class_exists($filtered_class) )
     34                                $class = $filtered_class;
     35                }
     36
     37                return new $class($row);
     38        }
     39
     40        function WP_Presentable($row) {
     41                return $this->__construct($row);
     42        }
     43
     44        // Takes an array or object and transfers its named properties to the new instance.
     45        function __construct($row) {
     46                if ( is_array($row) )
     47                        $row = (object) $row;
     48
     49                foreach ( (array) $row as $k => $v )
     50                        $this->$k = $row->$k;
     51        }
     52
     53        // Interface
     54
     55        function get_id() { } // post->ID, comment->comment_ID
     56        function get_type() { } // post, page, comment, pingback
     57        function get_supertype() { } // post, comment
     58
     59        function get_date($format='') { }
     60        function get_time($format='') { }
     61
     62        function get_url() { } // permalink
     63        function get_edit_url() { }
     64
     65        function get_title() { } // post_title, "Comment on post_title"
     66        function get_content() { }
     67        function get_excerpt() { }
     68
     69        function get_author_user_id() { } // int or false
     70        function get_author_name() { }
     71        function get_author_url() { } // from comment form or user profile
     72        function get_author_link() { }
     73        function get_author_archive_url() { }
     74        function get_author_archive_link() { }
     75
     76        function get_categories() { }
     77        function get_tags() { }
     78        function get_terms() { }
     79        function get_classes($classes='') { }
     80}
     81
     82class WP_Presentable_post extends WP_Presentable {
     83        function get_id() { return $this->ID; }
     84        function get_type() { return $this->post_type; }
     85        function get_supertype() { return 'post'; }
     86
     87        function get_date($format='') { }
     88        function get_time($format='') { }
     89
     90        function get_url() { } // permalink
     91        function get_edit_url() { }
     92
     93        function get_title() { return get_the_title($this); } // post_title, "Comment on post_title"
     94        function get_content() { }
     95        function get_excerpt() { }
     96
     97        function get_author_user_id() { } // int or false
     98        function get_author_name() { }
     99        function get_author_url() { } // from comment form or user profile
     100        function get_author_link() { }
     101        function get_author_archive_url() { }
     102        function get_author_archive_link() { }
     103
     104        function get_categories() { }
     105        function get_tags() { }
     106        function get_terms() { }
     107        function get_classes($classes='') { }
     108}
     109
     110class WP_Presentable_comment extends WP_Presentable {
     111        function get_id() { return $this->comment_ID; }
     112        function get_type() { return $this->comment_type; }
     113        function get_supertype() { return 'comment'; }
     114
     115        function get_date($format='') { return date($format?$format:get_option('date_format'), $this->get_time('U')); }
     116        function get_time($format='') { return mysql2date($format?$format:get_option('time_format'), $this->comment_date); }
     117
     118        function get_url() { return get_comment_link($this); } // permalink
     119        function get_edit_url() { }
     120
     121        function get_title() { return sprintf(__("Comment on %s"), get_the_title($this->comment_post_ID)); }
     122        function get_content() { return get_comment_text($this); }
     123        function get_excerpt() { return get_comment_excerpt($this); }
     124
     125        function get_author_user_id() { } // int or false
     126        function get_author_name() { }
     127        function get_author_url() { } // from comment form or user profile
     128        function get_author_link() { }
     129        function get_author_archive_url() { }
     130        function get_author_archive_link() { }
     131
     132        function get_categories() { }
     133        function get_tags() { }
     134        function get_terms() { }
     135        function get_classes($classes='') { }
     136
     137        function author() { return $this->comment_author; }
     138        function excerpt() { return $this->comment_content; }
     139}
     140
     141function is_post($object) {
     142        return is_a($object, 'WP_Presentable_post');
     143}
     144
     145function is_comment($object) {
     146        return is_a($object, 'WP_Presentable_comment');
     147}
     148
  • 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_Presentable', 'create'), $this->posts);
    23082308
    23092309                if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
    23102310                        $cjoin = apply_filters('comment_feed_join', '');