WordPress.org

Make WordPress Core

Ticket #16476: class-wp-xmlrpc-server.php.diff

File class-wp-xmlrpc-server.php.diff, 13.4 KB (added by rofflox, 4 years ago)
  • class-wp-xmlrpc-server.php

     
    430430                return $struct; 
    431431        } 
    432432 
    433         /** 
    434          * Retrieve page. 
    435          * 
    436          * @since 2.2.0 
    437          * 
    438          * @param array $args Method parameters. 
    439          * @return array 
    440          */ 
    441         function wp_getPage($args) { 
    442                 $this->escape($args); 
     433    function wp_getPost($args, $mode = null) { 
     434        $this->escape($args); 
     435         
     436        // Check if $args array has numeric keys 
     437        // Note: Deprecated since 3.1.1, use associative array with named keys instead  
     438        if(array_values($args) === $args) { 
     439            // _deprecated_argument( __FUNCTION__, '3.1.1', __( 'Passing an numeric array of arguments is deprecated. Pass an associative array instead.' ) ); 
     440            $args = array( 
     441                'blog_id' => (int) $args[0],  
     442                'post_id' => (int) $args[1], 
     443                'username' => $args[2],  
     444                'password' => $args[3] 
     445            ); 
     446        } 
    443447 
    444                 $blog_id        = (int) $args[0]; 
    445                 $page_id        = (int) $args[1]; 
    446                 $username       = $args[2]; 
    447                 $password       = $args[3]; 
     448        $defaults = array( 
     449                'blog_id' => 1,  
     450                'post_id' => 1,  
     451                'username' => '',  
     452                'password' => '',  
     453                'post_type' => 'post', 
     454            'with_taxonomies' => 1 
     455        ); 
    448456 
    449                 if ( !$user = $this->login($username, $password) ) { 
    450                         return $this->error; 
    451                 } 
     457        $args = wp_parse_args($args, $defaults); 
     458        $args = (object) $args; 
     459         
     460        if (! $user = $this->login($args->username, $args->password)) { 
     461            return $this->error; 
     462        } 
     463         
     464        if (! post_type_exists($args->post_type)) { 
     465            return new IXR_Error(401, __('Sorry, the post type ' . $args->post_type . ' does not exist.')); 
     466        } 
     467         
     468        // TODO: Capability must be mapped in register_posttype function, so we can test against it here 
     469        // e.g.  current_user_can('edit_' . $args->post_type, $args->post_id) 
     470        // @see <http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types> for mapping example 
     471        if (! current_user_can('edit_post', $args->post_id)) { 
     472            return new IXR_Error(401, __('Sorry, you cannot edit the post type _' . $args->post_type . '_.')); 
     473        } 
     474         
     475        do_action('xmlrpc_call', 'wp.getPost'); 
     476         
     477        // Lookup post info. 
     478        $post = get_post($args->post_id); 
    452479 
    453                 if ( !current_user_can( 'edit_page', $page_id ) ) 
    454                         return new IXR_Error( 401, __( 'Sorry, you cannot edit this page.' ) ); 
     480        // If we found the post then format the data. 
     481        if ($post->ID && $post->post_type == $args->post_type) { 
     482            // Format post date. 
     483            $post_date = mysql2date('Ymd\TH:i:s', $post->post_date, false); 
     484            $post_date_gmt = mysql2date('Ymd\TH:i:s', $post->post_date_gmt, false); 
     485             
     486            // For drafts use the GMT version of the date 
     487            if ($post->post_status == 'draft') { 
     488                $post_date_gmt = get_gmt_from_date(mysql2date('Y-m-d H:i:s', $post->post_date), 'Ymd\TH:i:s'); 
     489            } 
     490             
     491            if($args->with_taxonomies) { 
     492                $tax_ids = get_object_taxonomies($post); 
     493                $taxonomies = array(); 
     494                 
     495                foreach ($tax_ids as $tax_id) { 
     496                        $terms[$tax_id] = get_object_term_cache($post->ID, $tax_id); 
     497                         
     498                        if ( empty($terms[$tax_id]) ) { 
     499                                $terms[$tax_id] = wp_get_object_terms($post->ID, $tax_id, $args, array('fields' => 'ids')); 
     500                        } 
     501                         
     502                                foreach ($terms[$tax_id] as $term) { 
     503                                    $term = (object) get_term($term, $tax_id); 
     504                                    $taxonomies[$tax_id][] = $term->name; 
     505                                } 
     506                } 
     507            } 
    455508 
    456                 do_action('xmlrpc_call', 'wp.getPage'); 
    457  
    458                 // Lookup page info. 
    459                 $page = get_page($page_id); 
    460  
    461                 // If we found the page then format the data. 
    462                 if ( $page->ID && ($page->post_type == "page") ) { 
    463                         // Get all of the page content and link. 
    464                         $full_page = get_extended($page->post_content); 
    465                         $link = post_permalink($page->ID); 
    466  
    467                         // Get info the page parent if there is one. 
    468                         $parent_title = ""; 
    469                         if ( !empty($page->post_parent) ) { 
    470                                 $parent = get_page($page->post_parent); 
    471                                 $parent_title = $parent->post_title; 
     509            // Get post tags 
     510            if(!empty($taxonomies['post_tag'])) { 
     511                $tagnames = implode(', ', $taxonomies['post_tag']); 
     512            } else { 
     513                $tagnames = ''; 
     514            } 
     515             
     516            // Get categories 
     517            if(!empty($taxonomies['category'])) { 
     518                $categories = $taxonomies['category']; 
     519            } else { 
     520                $categories = array(); 
     521            } 
     522             
     523            // Get all of the post content and link. 
     524            $full_post = get_extended($post->post_content); 
     525            $link = post_permalink($post->ID); 
     526             
     527            // Get info the page parent if there is one. 
     528            $parent_title = ""; 
     529            if (! empty($post->post_parent)) { 
     530                $parent = get_post($post->post_parent); 
     531                $parent_title = $parent->post_title; 
     532            } 
     533             
     534            // Determine comment and ping settings. 
     535            $allow_comments = comments_open($post->ID) ? 1 : 0; 
     536            $allow_pings = pings_open($post->ID) ? 1 : 0; 
     537             
     538            // Get the author info. 
     539            $author = get_userdata($post->post_author); 
     540             
     541                        // Consider future posts as published 
     542                        if ( $post->post_status === 'future' ) { 
     543                                $post->post_status = 'publish'; 
    472544                        } 
     545                         
     546                        // Get post format 
     547                        $post_format = get_post_format( $post->ID); 
     548                        if ( empty( $post_format ) ) 
     549                                $post_format = 'standard'; 
     550                                 
     551            $sticky = false; 
     552                        if ( is_sticky( $post->ID) ) { 
     553                            $sticky = true; 
     554                        } 
     555             
     556                        // Get page template 
     557            $page_template = get_post_meta($post->ID, '_wp_page_template', true); 
     558            if (empty($page_template)) { 
     559                $page_template = 'default'; 
     560            } 
     561             
     562            $post_struct = array( 
     563                'dateCreated' => new IXR_Date($post_date),  
     564                'userid' => $post->post_author,  
     565                'postid' => $post->ID,  
     566                'post_status' => $post->post_status,  
     567                'description' => $full_post['main'],  
     568                'title' => $post->post_title,  
     569                'link' => $link,  
     570                'permaLink' => $link,  
     571                'categories' => $categories,  
     572                'excerpt' => $post->post_excerpt,  
     573                'text_more' => $full_post['extended'],  
     574                'mt_allow_comments' => $allow_comments,  
     575                'mt_allow_pings' => $allow_pings, 
     576                'mt_keywords' => $tagnames, 
     577                'wp_slug' => $post->post_name,  
     578                'wp_password' => $post->post_password,  
     579                'wp_author' => $author->display_name,  
     580                'wp_page_parent_id' => $post->post_parent,  
     581                'wp_page_parent_title' => $parent_title,  
     582                'wp_page_order' => $post->menu_order,  
     583                'wp_author_id' => $author->ID,  
     584                'wp_author_display_name' => $author->display_name,  
     585                'date_created_gmt' => new IXR_Date($post_date_gmt),  
     586                'custom_fields' => $this->get_custom_fields($args->post_id),  
     587                'wp_page_template' => $page_template, 
     588                'wp_post_format' => $post_format, 
     589                'sticky' => $sticky, 
     590                'post_type' => $post->post_type, 
     591                'taxonomies' => $taxonomies 
     592            ); 
     593             
     594            return $post_struct; 
     595        } else { 
     596            // If the post doesn't exist indicate that. 
     597            return new IXR_Error(404, __('Sorry, no such post in post type _' . $args->post_type . '_.')); 
     598        } 
     599    } 
     600     
     601    function wp_getPosts($args) { 
     602        $this->escape($args); 
     603         
     604        // Check if $args array has numeric keys 
     605        // Note: Deprecated since 3.1.1, use associative array with named keys instead  
     606        if(array_values($args) === $args) { 
     607            // _deprecated_argument( __FUNCTION__, '3.1.1', __( 'Passing an numeric array of arguments is deprecated. Pass an associative array instead.' ) ); 
     608            $args = array( 
     609                'blog_id' => (int) $args[0],  
     610                'username' => $args[1],  
     611                'password' => $args[2] 
     612            ); 
     613        } 
     614         
     615        $defaults = array( 
     616                'blog_id' => 1, 
     617                'username' => '',  
     618                'password' => '',  
     619                'post_type' => 'post',  
     620                'num_posts' => 10, 
     621            'post_status' => 'any', 
     622            'with_taxonomies' => 1 
     623        ); 
     624         
     625        $args = wp_parse_args($args, $defaults); 
     626        $args = (object) $args; 
    473627 
    474                         // Determine comment and ping settings. 
    475                         $allow_comments = comments_open($page->ID) ? 1 : 0; 
    476                         $allow_pings = pings_open($page->ID) ? 1 : 0; 
     628        if (! $user = $this->login($args->username, $args->password)) { 
     629            return $this->error; 
     630        } 
     631         
     632        if (! post_type_exists($args->post_type)) { 
     633            return new IXR_Error(401, __('Sorry, the post type ' . $args->post_type . ' does not exist.')); 
     634        } 
    477635 
    478                         // Format page date. 
    479                         $page_date = mysql2date("Ymd\TH:i:s", $page->post_date, false); 
    480                         $page_date_gmt = mysql2date("Ymd\TH:i:s", $page->post_date_gmt, false); 
     636                do_action('xmlrpc_call', 'wp.getPosts'); 
    481637 
    482                         // For drafts use the GMT version of the date 
    483                         if ( $page->post_status == 'draft' ) 
    484                                 $page_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page->post_date ), 'Ymd\TH:i:s' ); 
     638                $posts = get_posts( array('post_type' => $args->post_type, 'post_status' => $args->post_status, 'numberposts' => $args->num_posts) ); 
     639                $num_posts = count($posts); 
    485640 
    486                         // Pull the categories info together. 
    487                         $categories = array(); 
    488                         foreach ( wp_get_post_categories($page->ID) as $cat_id ) { 
    489                                 $categories[] = get_cat_name($cat_id); 
     641                // If we have pages, put together their info. 
     642                if ( $num_posts >= 1 ) { 
     643                        $posts_struct = array(); 
     644                         
     645                        for ( $i = 0; $i < $num_posts; $i++ ) { 
     646                        // TODO: Capability must be mapped in register_posttype function, so we can test against it here 
     647                // e.g.  current_user_can('edit_' . $args->post_type, $args->post_id) 
     648                // @see <http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types> for mapping example 
     649                if (! current_user_can('edit_posts', $posts[$i])) { 
     650                    continue; 
     651                } 
     652                             
     653                                $post = self::wp_getPost(array( 
     654                                        'blog_id' => $args->blog_id,  
     655                                        'post_id' => $posts[$i]->ID,  
     656                                        'username' => $args->username,  
     657                                        'password' => $args->password, 
     658                                    'post_type'=> $args->post_type, 
     659                                    'with_taxonomies' => $args->with_taxonomies 
     660                                )); 
     661                                 
     662                                $posts_struct[] = $post; 
    490663                        } 
    491664 
    492                         // Get the author info. 
    493                         $author = get_userdata($page->post_author); 
    494  
    495                         $page_template = get_post_meta( $page->ID, '_wp_page_template', true ); 
    496                         if ( empty( $page_template ) ) 
    497                                 $page_template = 'default'; 
    498  
    499                         $page_struct = array( 
    500                                 "dateCreated"                   => new IXR_Date($page_date), 
    501                                 "userid"                                => $page->post_author, 
    502                                 "page_id"                               => $page->ID, 
    503                                 "page_status"                   => $page->post_status, 
    504                                 "description"                   => $full_page["main"], 
    505                                 "title"                                 => $page->post_title, 
    506                                 "link"                                  => $link, 
    507                                 "permaLink"                             => $link, 
    508                                 "categories"                    => $categories, 
    509                                 "excerpt"                               => $page->post_excerpt, 
    510                                 "text_more"                             => $full_page["extended"], 
    511                                 "mt_allow_comments"             => $allow_comments, 
    512                                 "mt_allow_pings"                => $allow_pings, 
    513                                 "wp_slug"                               => $page->post_name, 
    514                                 "wp_password"                   => $page->post_password, 
    515                                 "wp_author"                             => $author->display_name, 
    516                                 "wp_page_parent_id"             => $page->post_parent, 
    517                                 "wp_page_parent_title"  => $parent_title, 
    518                                 "wp_page_order"                 => $page->menu_order, 
    519                                 "wp_author_id"                  => $author->ID, 
    520                                 "wp_author_display_name"        => $author->display_name, 
    521                                 "date_created_gmt"              => new IXR_Date($page_date_gmt), 
    522                                 "custom_fields"                 => $this->get_custom_fields($page_id), 
    523                                 "wp_page_template"              => $page_template 
    524                         ); 
    525  
    526                         return($page_struct); 
     665                        return $posts_struct; 
    527666                } 
    528                 // If the page doesn't exist indicate that. 
     667                // If no post were found return an error. 
    529668                else { 
    530                         return(new IXR_Error(404, __("Sorry, no such page."))); 
     669                        return array(); 
    531670                } 
    532         } 
     671    } 
     672     
     673    function wp_getPage($args) { 
     674        $this->escape($args); 
     675         
     676        // Check if $args array has numeric keys 
     677        // Note: Deprecated since 3.1.1, use associative array with named keys instead  
     678        if(array_values($args) === $args) { 
     679            // _deprecated_argument( __FUNCTION__, '3.1.1', __( 'Passing an numeric array of arguments is deprecated. Pass an associative array instead.' ) ); 
     680            $args = array( 
     681                'blog_id' => (int) $args[0],  
     682                'post_id' => (int) $args[1], 
     683                'username' => $args[2],  
     684                'password' => $args[3] 
     685            ); 
     686        } 
    533687 
     688        $defaults = array( 
     689                'blog_id' => 1,  
     690                'post_id' => 1,  
     691                'username' => '',  
     692                'password' => '',  
     693                'post_type' => 'page', 
     694            'with_taxonomies' => 1 
     695        ); 
     696         
     697        $args = wp_parse_args($args, $defaults); 
     698 
     699        return self::wp_getPost($args); 
     700    } 
     701 
    534702        /** 
    535703         * Retrieve Pages. 
    536704         *