WordPress.org

Make WordPress Core

Ticket #18433: wp.getPosts.6.patch

File wp.getPosts.6.patch, 7.0 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.getPosts'                   => 'this:wp_getPosts',
    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 posts.
     1813         *
     1814         * The optional $filter parameter modifies the query used to retrieve posts.
     1815         * Accepted keys are 'post_type', 'post_status', 'number', 'offset',
     1816         * 'orderby', and 'order'.
     1817         *
     1818         * The optional $fields parameter specifies what fields will be included
     1819         * in the response array.
     1820         *
     1821         * @uses wp_get_recent_posts()
     1822         * @see wp_getPost() for more on $fields
     1823         * @see get_posts() for more on $filter values
     1824         *
     1825         * @param array $args Method parameters. Contains:
     1826         *  - int     $blog_id
     1827         *  - string  $username
     1828         *  - string  $password
     1829         *  - array   $filter optional
     1830         *  - array   $fields optional
     1831         * @return array cntains a collection of posts.
     1832         */
     1833        function wp_getPosts( $args ) {
     1834                $this->escape( $args );
     1835
     1836                $blog_id    = (int) $args[0];
     1837                $username   = $args[1];
     1838                $password   = $args[2];
     1839                $filter     = isset( $args[3] ) ? $args[3] : array();
     1840
     1841                if ( isset( $args[4] ) )
     1842                        $fields = $args[4];
     1843                else
     1844                        $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' );
     1845
     1846                if ( !$user = $this->login( $username, $password ) )
     1847                        return $this->error;
     1848
     1849                do_action( 'xmlrpc_call', 'wp.getPosts' );
     1850
     1851                $query = array();
     1852
     1853                if ( isset( $filter['post_type'] ) ) {
     1854                        $post_type = get_post_type_object( $filter['post_type'] );
     1855                        if( !( (bool)$post_type ) )
     1856                                return new IXR_Error( 403, __( 'The post type specified is not valid' ) );
     1857
     1858                        if( ! current_user_can( $post_type->cap->edit_posts ) )
     1859                                return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type' ));
     1860                        $query['post_type'] = $filter['post_type'];
     1861                }
     1862
     1863                if ( isset( $filter['post_status'] ) ) {
     1864                        $query['post_status'] = $filter['post_status'];
     1865                }
     1866
     1867                if ( isset ( $filter['number'] ) ) {
     1868                        $query['number'] = absint( $filter['number'] );
     1869                }
     1870
     1871                if ( isset ( $filter['offset'] ) ) {
     1872                        $query['offset'] = absint( $filter['offset'] );
     1873                }
     1874
     1875                if ( isset ( $filter['orderby'] ) ) {
     1876                        $query['orderby'] = $filter['orderby'];
     1877
     1878                        if ( isset ( $filter['order'] ) ) {
     1879                                $query['order'] = $filter['order'];
     1880                        }
     1881                }
     1882
     1883                do_action('xmlrpc_call', 'wp.getPosts');
     1884
     1885                $posts_list = wp_get_recent_posts( $query );
     1886
     1887                if ( !$posts_list )
     1888                        return array( );
     1889
     1890                // holds all the posts data
     1891                $struct = array();
     1892
     1893                foreach ( $posts_list as $post ) {
     1894                        $post_type = get_post_type_object( $post['post_type'] );
     1895                        if( !current_user_can( $post_type->cap->edit_posts, $post['ID'] ) )
     1896                                continue;
     1897
     1898                        $struct[] = $this->prepare_post( $post, $fields );
     1899                }
     1900
     1901                return $struct;
     1902        }
     1903
    17051904        /* Blogger API functions.
    17061905         * specs on http://plant.blogger.com/api and http://groups.yahoo.com/group/bloggerDev/
    17071906         */