WordPress.org

Make WordPress Core

Ticket #18432: wp.getPost.3.patch

File wp.getPost.3.patch, 6.6 KB (added by maxcutler, 6 years ago)
  • wp-includes/class-wp-xmlrpc-server.php

     
    6464                        'wp.getMediaItem'               => 'this:wp_getMediaItem',
    6565                        'wp.getMediaLibrary'    => 'this:wp_getMediaLibrary',
    6666                        'wp.getPostFormats'     => 'this:wp_getPostFormats',
     67                        'wp.getPost'                    => 'this:wp_getPost',
    6768
    6869                        // Blogger API
    6970                        'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs',
     
    17021703                return $formats;
    17031704        }
    17041705
     1706        /**
     1707         * Prepares term data for return in an XML-RPC object
     1708         *
     1709         * @param array $term The unprepared term data
     1710         * @return array The prepared term data
     1711         */
     1712        function prepare_term( $term ) {
     1713                $_term = (array) $term;
     1714
     1715                return apply_filters( 'xmlrpc_prepare_term', $_term, $term );
     1716        }
     1717
     1718        function prepare_post( $post, $fields ) {
     1719                // holds the data for this post. built up based on $fields
     1720                $_post = array( 'post_id' => $post['ID'] );
     1721
     1722                // prepare common post fields
     1723                $post_fields = array(
     1724                        'post_title' => $post['post_title'],
     1725                        'post_date' => new IXR_Date(mysql2date( 'Ymd\TH:i:s', $post['post_date'], false )),
     1726                        'post_date_gmt' => new IXR_Date(mysql2date( 'Ymd\TH:i:s', $post['post_date_gmt'], false )),
     1727                        'post_modified' => new IXR_Date(mysql2date( 'Ymd\TH:i:s', $post['post_modified'], false )),
     1728                        'post_modified_gmt' => new IXR_Date(mysql2date( 'Ymd\TH:i:s', $post['post_modified_gmt'], false )),
     1729                        'post_status' => $post['post_status'],
     1730                        'post_type' => $post['post_type'],
     1731                        'post_slug' => $post['post_name'],
     1732                        'post_author' => $post['post_author'],
     1733                        'post_password' => $post['post_password'],
     1734                        'post_excerpt' => $post['post_excerpt'],
     1735                        'post_content' => $post['post_content'],
     1736                        'link' => post_permalink( $post['ID'] ),
     1737                        'comment_status' => $post['comment_status'],
     1738                        'ping_status' => $post['ping_status'],
     1739                        'sticky' => ($post['post_type'] === 'post' && is_sticky( $post['ID'] ) ),
     1740                );
     1741
     1742                // Consider future posts as published
     1743                if ( $post_fields['post_status'] === 'future' )
     1744                        $post_fields['post_status'] = 'publish';
     1745
     1746                // Fill in blank post format
     1747                $post_fields['post_format'] = get_post_format( $post['ID'] );
     1748                if ( empty( $post_fields['post_format'] ) )
     1749                        $post_fields['post_format'] = 'standard';
     1750
     1751                // Merge requested $post_fields fields into $_post
     1752                if ( in_array( 'post', $fields ) ) {
     1753                        $_post = array_merge( $_post, $post_fields );
     1754                } else {
     1755                        $requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) );
     1756                        $_post = array_merge( $_post, $requested_fields );
     1757                }
     1758
     1759                $all_taxonomy_fields = in_array( 'taxonomies', $fields );
     1760
     1761                if ( $all_taxonomy_fields || in_array( 'terms', $fields ) ) {
     1762                        $post_type_taxonomies = get_object_taxonomies( $post['post_type'] , 'names' );
     1763                        $terms = wp_get_object_terms( $post['ID'], $post_type_taxonomies );
     1764                        $_post['terms'] = array();
     1765                        foreach ( $terms as $term ) {
     1766                                $_post['terms'][] = $this->prepare_term( $term );
     1767                        }
     1768                }
     1769
     1770                // backward compatiblity
     1771                if ( $all_taxonomy_fields || in_array( 'tags', $fields ) ) {
     1772                        $tagnames = array();
     1773                        $tags = wp_get_post_tags( $post['ID'] );
     1774                        if ( !empty( $tags ) ) {
     1775                                foreach ( $tags as $tag )
     1776                                        $tagnames[] = $tag->name;
     1777                                $tagnames = implode( ', ', $tagnames );
     1778                        } else {
     1779                                $tagnames = '';
     1780                        }
     1781                        $_post['tags'] = $tagnames;
     1782                }
     1783
     1784                // backward compatiblity
     1785                if ( $all_taxonomy_fields || in_array( 'categories', $fields ) ) {
     1786                        $categories = array();
     1787                        $catids = wp_get_post_categories( $post['ID'] );
     1788                        foreach($catids as $catid) {
     1789                                $categories[] = get_cat_name($catid);
     1790                        }
     1791                        $_post['categories'] = $categories;
     1792                }
     1793
     1794                if ( in_array( 'custom_fields', $fields ) )
     1795                        $_post['custom_fields'] = $this->get_custom_fields( $post['ID'] );
     1796
     1797                if ( in_array( 'enclosure', $fields ) ) {
     1798                        $_post['enclosure'] = array();
     1799                        $enclosures = (array) get_post_meta( $post['ID'], 'enclosure' );
     1800                        if ( ! empty ( $enclosures ) ) {
     1801                                $encdata = explode("\n", $enclosures[0]);
     1802                                $_post['enclosure']['url'] = trim(htmlspecialchars($encdata[0]));
     1803                                $_post['enclosure']['length'] = (int) trim($encdata[1]);
     1804                                $_post['enclosure']['type'] = trim($encdata[2]);
     1805                        }
     1806                }
     1807
     1808                return apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields );
     1809        }
     1810
     1811        /**
     1812         * Retrieve a post.
     1813         *
     1814         * The optional $fields parameter specifies what fields will be included
     1815         * in the response array. This should be a list of field names. 'post_id' will
     1816         * always be included in the response regardless of the value of $fields.
     1817         *
     1818         * Instead of, or in addition to, individual field names, conceptual group
     1819         * names can be used to specify multiple fields. The available conceptual
     1820         * groups are 'post' (all basic fields), 'taxonomies', 'custom_fields',
     1821         * and 'enclosure'.
     1822         *
     1823         * @uses wp_get_single_post()
     1824         * @param array $args Method parameters. Contains:
     1825         *  - int     $post_id
     1826         *  - string  $username
     1827         *  - string  $password
     1828         *  - array   $fields optional
     1829         * @return array contains (based on $fields parameter):
     1830         *  - 'post_id'
     1831         *  - 'post_title'
     1832         *  - 'post_date'
     1833         *  - 'post_date_gmt'
     1834         *  - 'post_modified'
     1835         *  - 'post_modified_gmt'
     1836         *  - 'post_status'
     1837         *  - 'post_type'
     1838         *  - 'post_slug'
     1839         *  - 'post_author'
     1840         *  - 'post_password'
     1841         *  - 'post_excerpt'
     1842         *  - 'post_content'
     1843         *  - 'link'
     1844         *  - 'comment_status'
     1845         *  - 'ping_status'
     1846         *  - 'sticky'
     1847         *  - 'custom_fields'
     1848         *  - 'terms'
     1849         *  - 'categories'
     1850         *  - 'tags'
     1851         *  - 'enclosure'
     1852         */
     1853        function wp_getPost( $args ) {
     1854                $this->escape( $args );
     1855
     1856                $blog_id            = (int) $args[0];
     1857                $username           = $args[1];
     1858                $password           = $args[2];
     1859                $post_id            = (int) $args[3];
     1860
     1861                if ( isset( $args[4] ) )
     1862                        $fields = $args[4];
     1863                else
     1864                        $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' );
     1865
     1866                if ( ! $user = $this->login( $username, $password ) )
     1867                        return $this->error;
     1868
     1869                do_action( 'xmlrpc_call', 'wp.getPost' );
     1870
     1871                $post = wp_get_single_post( $post_id, ARRAY_A );
     1872
     1873                if ( empty( $post["ID"] ) )
     1874                        return new IXR_Error( 404, __( 'Invalid post ID.' ) );
     1875
     1876                $post_type = get_post_type_object( $post['post_type'] );
     1877                if( ! current_user_can( $post_type->cap->edit_posts, $post_id ) )
     1878                        return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ));
     1879
     1880                return $this->prepare_post( $post, $fields );
     1881        }
     1882
    17051883        /* Blogger API functions.
    17061884         * specs on http://plant.blogger.com/api and http://groups.yahoo.com/group/bloggerDev/
    17071885         */