Make WordPress Core

Ticket #18429: dates_and_featured_image4.patch

File dates_and_featured_image4.patch, 18.4 KB (added by markoheijnen, 13 years ago)
  • wp-includes/class-wp-xmlrpc-server.php

     
    467467        }
    468468
    469469        /**
     470         * Convert a WordPress date string to an IXR_Date object.
     471         *
     472         * @access protected
     473         *
     474         * @param $date
     475         * @return IXR_Date
     476         */
     477        protected function _convert_date( $date, $format = 'Ymd\TH:i:s' ) {
     478                if ( $date === '0000-00-00 00:00:00' ) {
     479                        return new IXR_Date( '00000000T00:00:00Z' );
     480                }
     481                return new IXR_Date( mysql2date( $format, $date, false ) );
     482        }
     483
     484        /**
     485         * Convert a WordPress date string to an IXR_Date object.
     486         *
     487         * @access protected
     488         *
     489         * @param $date
     490         * @return IXR_Date
     491         */
     492        protected function _convert_date_gmt( $date, $format = 'Ymd\TH:i:s' ) {
     493                if ( $date === '0000-00-00 00:00:00' ) {
     494                        return new IXR_Date( '00000000T00:00:00Z' );
     495                }
     496                return new IXR_Date( get_gmt_from_date( mysql2date( $format, $date, false ) ) );
     497        }
     498
     499        /**
    470500         * Prepares post data for return in an XML-RPC object.
    471501         *
    472502         * @access private
     
    477507         */
    478508        function _prepare_post( $post, $fields ) {
    479509                // holds the data for this post. built up based on $fields
    480                 $_post = array( 'post_id' => $post['ID'] );
     510                $_post = array( 'post_id' => strval( $post['ID'] ) );
    481511
    482512                // prepare common post fields
    483513                $post_fields = array(
    484514                        'post_title'        => $post['post_title'],
    485                         'post_date'         => new IXR_Date( mysql2date( 'Ymd\TH:i:s', $post['post_date'], false ) ),
    486                         'post_date_gmt'     => new IXR_Date( mysql2date( 'Ymd\TH:i:s', $post['post_date_gmt'], false ) ),
    487                         'post_modified'     => new IXR_Date( mysql2date( 'Ymd\TH:i:s', $post['post_modified'], false ) ),
    488                         'post_modified_gmt' => new IXR_Date( mysql2date( 'Ymd\TH:i:s', $post['post_modified_gmt'], false ) ),
     515                        'post_date'         => $this->_convert_date( $post['post_date'] ),
     516                        'post_date_gmt'     => $this->_convert_date( $post['post_date_gmt'] ),
     517                        'post_modified'     => $this->_convert_date( $post['post_modified'] ),
     518                        'post_modified_gmt' => $this->_convert_date( $post['post_modified_gmt'] ),
    489519                        'post_status'       => $post['post_status'],
    490520                        'post_type'         => $post['post_type'],
    491521                        'post_name'         => $post['post_name'],
     
    499529                        'sticky'            => ( $post['post_type'] === 'post' && is_sticky( $post['ID'] ) ),
    500530                );
    501531
     532                if( current_theme_supports( 'post-thumbnails' ) ) {
     533                        $post_fields['featured_image'] = get_post_thumbnail_id( $post['ID'] );
     534                        $post_fields['featured_image_url'] = wp_get_attachment_url( $post_fields['featured_image'] );
     535                }
     536
    502537                // Consider future posts as published
    503538                if ( $post_fields['post_status'] === 'future' )
    504539                        $post_fields['post_status'] = 'publish';
     
    591626         *      - comment_status - can be 'open' | 'closed'
    592627         *      - ping_status - can be 'open' | 'closed'
    593628         *      - sticky
     629         *      - featured_image - ID of a media item to use as the featured image
    594630         *      - custom_fields - array, with each element containing 'key' and 'value'
    595631         *      - terms - array, with taxonomy names as keys and arrays of term IDs as values
    596632         *      - terms_names - array, with taxonomy names as keys and arrays of term names as values
     
    724760                        stick_post( $post_ID );
    725761                }
    726762
     763                if ( isset ( $post_data['featured_image'] ) ) {
     764                        if( current_theme_supports( 'post-thumbnails' ) ) {
     765                                // empty value deletes, non-empty value adds/updates
     766                                if ( empty( $post_data['featured_image'] ) ) {
     767                                        delete_post_thumbnail( $post_ID );
     768                                }
     769                                else {
     770                                        if ( set_post_thumbnail( $post_ID, $post_data['featured_image'] ) === false )
     771                                                return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
     772                                }
     773                                unset( $content_struct['featured_image'] );
     774                        }
     775                        else {
     776                                return new IXR_Error( 401, __( "Sorry, current theme doens't supports featured images." ) );
     777                        }
     778                }
     779
    727780                if ( isset ( $post_data['custom_fields'] ) && post_type_supports( $post_data['post_type'], 'custom-fields' ) ) {
    728781                        $this->set_custom_fields( $post_ID, $post_data['custom_fields'] );
    729782                }
     
    880933                        return new IXR_Error( 404, __( 'Invalid post ID.' ) );
    881934
    882935                // convert the date field back to IXR form
    883                 $post['post_date'] = new IXR_Date( mysql2date( 'Ymd\TH:i:s', $post['post_date'], false ) );
     936                $post['post_date'] = $this->_convert_date( $post['post_date'] );
    884937
    885938                // ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,
    886939                // since _insert_post will ignore the non-GMT date if the GMT date is set
    887940                if ( $post['post_date_gmt'] == '0000-00-00 00:00:00' || isset( $content_struct['post_date'] ) )
    888941                        unset( $post['post_date_gmt'] );
    889942                else
    890                         $post['post_date_gmt'] = new IXR_Date( mysql2date( 'Ymd\TH:i:s', $post['post_date_gmt'], false ) );
     943                        $post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] );
    891944
    892945                $this->escape( $post );
    893946                $merged_content_struct = array_merge( $post, $content_struct );
     
    10801133                                $query['order'] = $filter['order'];
    10811134                }
    10821135
    1083                 do_action( 'xmlrpc_call', 'wp.getPosts' );
    1084 
    10851136                $posts_list = wp_get_recent_posts( $query );
    10861137
    10871138                if ( ! $posts_list )
     
    11511202                        $allow_pings = pings_open($page->ID) ? 1 : 0;
    11521203
    11531204                        // Format page date.
    1154                         $page_date = mysql2date('Ymd\TH:i:s', $page->post_date, false);
    1155                         $page_date_gmt = mysql2date('Ymd\TH:i:s', $page->post_date_gmt, false);
     1205                        $page_date = $this->_convert_date( $page->post_date );
     1206                        $page_date_gmt = $this->_convert_date( $page->post_date_gmt );
    11561207
    11571208                        // For drafts use the GMT version of the date
    1158                         if ( $page->post_status == 'draft' )
    1159                                 $page_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page->post_date ), 'Ymd\TH:i:s' );
     1209                        if ( in_array( $page->post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
     1210                                $page_date_gmt = $this->_convert_date_gmt( $page->post_date );
    11601211
    11611212                        // Pull the categories info together.
    11621213                        $categories = array();
     
    11721223                                $page_template = 'default';
    11731224
    11741225                        $page_struct = array(
    1175                                 'dateCreated'                   => new IXR_Date($page_date),
     1226                                'dateCreated'                   => $page_date,
    11761227                                'userid'                                => $page->post_author,
    11771228                                'page_id'                               => $page->ID,
    11781229                                'page_status'                   => $page->post_status,
     
    11931244                                'wp_page_order'                 => $page->menu_order,
    11941245                                'wp_author_id'                  => (string) $author->ID,
    11951246                                'wp_author_display_name'        => $author->display_name,
    1196                                 'date_created_gmt'              => new IXR_Date($page_date_gmt),
     1247                                'date_created_gmt'              => $page_date_gmt,
    11971248                                'custom_fields'                 => $this->get_custom_fields($page_id),
    11981249                                'wp_page_template'              => $page_template
    11991250                        );
     
    14101461                // The date needs to be formatted properly.
    14111462                $num_pages = count($page_list);
    14121463                for ( $i = 0; $i < $num_pages; $i++ ) {
    1413                         $post_date = mysql2date('Ymd\TH:i:s', $page_list[$i]->post_date, false);
    1414                         $post_date_gmt = mysql2date('Ymd\TH:i:s', $page_list[$i]->post_date_gmt, false);
     1464                        $page_list[$i]->dateCreated = $this->_convert_date(  $page_list[$i]->post_date );
     1465                        $page_list[$i]->date_created_gmt = $this->_convert_date( $page_list[$i]->post_date_gmt );
    14151466
    1416                         $page_list[$i]->dateCreated = new IXR_Date($post_date);
    1417                         $page_list[$i]->date_created_gmt = new IXR_Date($post_date_gmt);
    1418 
    14191467                        // For drafts use the GMT version of the date
    1420                         if ( $page_list[$i]->post_status == 'draft' ) {
    1421                                 $page_list[$i]->date_created_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page_list[$i]->post_date ), 'Ymd\TH:i:s' );
    1422                                 $page_list[$i]->date_created_gmt = new IXR_Date( $page_list[$i]->date_created_gmt );
     1468                        if ( in_array( $page_list[$i]->post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) {
     1469                                $page_list[$i]->date_created_gmt = $this->_convert_date_gmt( $page_list[$i]->post_date );
    14231470                        }
    14241471
    14251472                        unset($page_list[$i]->post_date_gmt);
     
    16581705                        return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
    16591706
    16601707                // Format page date.
    1661                 $comment_date = mysql2date('Ymd\TH:i:s', $comment->comment_date, false);
    1662                 $comment_date_gmt = mysql2date('Ymd\TH:i:s', $comment->comment_date_gmt, false);
     1708                $comment_date = $this->_convert_date( $comment->comment_date );
     1709                $comment_date_gmt = $this->_convert_date( $comment->comment_date_gmt );
    16631710
    16641711                if ( '0' == $comment->comment_approved )
    16651712                        $comment_status = 'hold';
     
    16731720                $link = get_comment_link($comment);
    16741721
    16751722                $comment_struct = array(
    1676                         'date_created_gmt'              => new IXR_Date($comment_date_gmt),
     1723                        'date_created_gmt'              => $comment_date_gmt,
    16771724                        'user_id'                               => $comment->user_id,
    16781725                        'comment_id'                    => $comment->comment_ID,
    16791726                        'parent'                                => $comment->comment_parent,
     
    22412288                        return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
    22422289
    22432290                // Format page date.
    2244                 $attachment_date = mysql2date('Ymd\TH:i:s', $attachment->post_date, false);
    2245                 $attachment_date_gmt = mysql2date('Ymd\TH:i:s', $attachment->post_date_gmt, false);
     2291                $attachment_date = $this->_convert_date( $attachment->post_date );
     2292                $attachment_date_gmt = $this->_convert_date( $attachment->post_date_gmt );
    22462293
    22472294                $link = wp_get_attachment_url($attachment->ID);
    22482295                $thumbnail_link = wp_get_attachment_thumb_url($attachment->ID);
    22492296
    22502297                $attachment_struct = array(
    2251                         'date_created_gmt'              => new IXR_Date($attachment_date_gmt),
     2298                        'date_created_gmt'              => $attachment_date_gmt,
    22522299                        'parent'                                => $attachment->post_parent,
    22532300                        'link'                                  => $link,
    22542301                        'thumbnail'                             => $thumbnail_link,
     
    25032550
    25042551                $struct = array(
    25052552                        'userid'    => $post_data['post_author'],
    2506                         'dateCreated' => new IXR_Date(mysql2date('Ymd\TH:i:s', $post_data['post_date'], false)),
     2553                        'dateCreated' => $this->_convert_date( $post_data['post_date'] ),
    25072554                        'content'     => $content,
    25082555                        'postid'  => (string) $post_data['ID']
    25092556                );
     
    25482595                        if ( !current_user_can( 'edit_post', $entry['ID'] ) )
    25492596                                continue;
    25502597
    2551                         $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false);
     2598                        $post_date  = $this->_convert_date( $entry['post_date'] );
    25522599                        $categories = implode(',', wp_get_post_categories($entry['ID']));
    25532600
    25542601                        $content  = '<title>'.stripslashes($entry['post_title']).'</title>';
     
    25572604
    25582605                        $struct[] = array(
    25592606                                'userid' => $entry['post_author'],
    2560                                 'dateCreated' => new IXR_Date($post_date),
     2607                                'dateCreated' => $post_date,
    25612608                                'content' => $content,
    25622609                                'postid' => (string) $entry['ID'],
    25632610                        );
     
    28162863         *  - wp_page_parent_id
    28172864         *  - wp_page_order
    28182865         *  - wp_author_id
     2866         *  - wp_featured_image
    28192867         *  - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending'
    28202868         *  - mt_allow_comments - can be 'open' or 'closed'
    28212869         *  - mt_allow_pings - can be 'open' or 'closed'
     
    30673115                if ( isset($content_struct['custom_fields']) )
    30683116                        $this->set_custom_fields($post_ID, $content_struct['custom_fields']);
    30693117
     3118                if ( isset ( $post_data['wp_featured_image'] ) ) {
     3119                        if( current_theme_supports( 'post-thumbnails' ) && ! empty( $post_data['wp_featured_image'] ) ) {
     3120                                if ( set_post_thumbnail( $post_ID, $post_data['wp_featured_image'] ) === false )
     3121                                        return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
     3122
     3123                                unset( $content_struct['wp_featured_image'] );
     3124                        }
     3125                        else {
     3126                                return new IXR_Error( 401, __( "Sorry, current theme doens't supports featured images." ) );
     3127                        }
     3128                }
     3129
    30703130                // Handle enclosures
    30713131                $thisEnclosure = isset($content_struct['enclosure']) ? $content_struct['enclosure'] : null;
    30723132                $this->add_enclosure_if_new($post_ID, $thisEnclosure);
     
    33653425                if ( isset($content_struct['custom_fields']) )
    33663426                        $this->set_custom_fields($post_ID, $content_struct['custom_fields']);
    33673427
     3428                if ( isset ( $post_data['wp_featured_image'] ) ) {
     3429                        if( current_theme_supports( 'post-thumbnails' ) ) {
     3430                                // empty value deletes, non-empty value adds/updates
     3431                                if ( empty( $post_data['wp_featured_image'] ) ) {
     3432                                        delete_post_thumbnail( $post_ID );
     3433                                }
     3434                                else {
     3435                                        if ( set_post_thumbnail( $post_ID, $post_data['wp_featured_image'] ) === false )
     3436                                                return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
     3437                                }
     3438                                unset( $content_struct['wp_featured_image'] );
     3439                        }
     3440                        else {
     3441                                return new IXR_Error( 401, __( "Sorry, current theme doens't supports featured images." ) );
     3442                        }
     3443                }
     3444
    33683445                // Handle enclosures
    33693446                $thisEnclosure = isset($content_struct['enclosure']) ? $content_struct['enclosure'] : null;
    33703447                $this->add_enclosure_if_new($post_ID, $thisEnclosure);
     
    34063483                $postdata = wp_get_single_post($post_ID, ARRAY_A);
    34073484
    34083485                if ($postdata['post_date'] != '') {
    3409                         $post_date = mysql2date('Ymd\TH:i:s', $postdata['post_date'], false);
    3410                         $post_date_gmt = mysql2date('Ymd\TH:i:s', $postdata['post_date_gmt'], false);
    3411                         $post_modified = mysql2date('Ymd\TH:i:s', $postdata['post_modified'], false);
    3412                         $post_modified_gmt = mysql2date('Ymd\TH:i:s', $postdata['post_modified_gmt'], false);
     3486                        $post_date = $this->_convert_date( $postdata['post_date'] );
     3487                        $post_date_gmt = $this->_convert_date( $postdata['post_date_gmt'] );
     3488                        $post_modified = $this->_convert_date( $postdata['post_modified'] );
     3489                        $post_modified_gmt = $this->_convert_date( $postdata['post_modified_gmt'] );
    34133490
    34143491                        // For drafts use the GMT version of the post date
    34153492                        if ( $postdata['post_status'] == 'draft' ) {
    3416                                 $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $postdata['post_date'] ), 'Ymd\TH:i:s' );
    3417                                 $post_modified_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $postdata['post_modified'] ), 'Ymd\TH:i:s' );
     3493                                $post_date_gmt = $this->_convert_date_gmt( $postdata['post_date'] );
     3494                                $post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified'] );
    34183495                        }
    34193496
    34203497                        $categories = array();
     
    34683545                        }
    34693546
    34703547                        $resp = array(
    3471                                 'dateCreated' => new IXR_Date($post_date),
     3548                                'dateCreated' => $post_date,
    34723549                                'userid' => $postdata['post_author'],
    34733550                                'postid' => $postdata['ID'],
    34743551                                'description' => $post['main'],
     
    34863563                                'wp_slug' => $postdata['post_name'],
    34873564                                'wp_password' => $postdata['post_password'],
    34883565                                'wp_author_id' => (string) $author->ID,
    3489                                 'wp_author_display_name'        => $author->display_name,
    3490                                 'date_created_gmt' => new IXR_Date($post_date_gmt),
     3566                                'wp_author_display_name' => $author->display_name,
     3567                                'date_created_gmt' => $post_date_gmt,
    34913568                                'post_status' => $postdata['post_status'],
    34923569                                'custom_fields' => $this->get_custom_fields($post_ID),
    34933570                                'wp_post_format' => $post_format,
    34943571                                'sticky' => $sticky,
    3495                                 'date_modified' => new IXR_Date( $post_modified ),
    3496                                 'date_modified_gmt' => new IXR_Date( $post_modified_gmt )
     3572                                'date_modified' => $post_modified,
     3573                                'date_modified_gmt' => $post_modified_gmt
    34973574                        );
    34983575
    34993576                        if ( !empty($enclosure) ) $resp['enclosure'] = $enclosure;
    35003577
     3578                        if( current_theme_supports( 'post-thumbnails' ) ) {
     3579                                $resp['wp_featured_image'] = get_post_thumbnail_id( $postdata['ID'] );
     3580                                $resp['wp_featured_image_url'] = wp_get_attachment_url( $resp['wp_featured_image'] );
     3581                        }
     3582
    35013583                        return $resp;
    35023584                } else {
    35033585                        return new IXR_Error(404, __('Sorry, no such post.'));
     
    35383620                        if ( !current_user_can( 'edit_post', $entry['ID'] ) )
    35393621                                continue;
    35403622
    3541                         $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false);
    3542                         $post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt'], false);
    3543                         $post_modified = mysql2date('Ymd\TH:i:s', $entry['post_modified'], false);
    3544                         $post_modified_gmt = mysql2date('Ymd\TH:i:s', $entry['post_modified_gmt'], false);
     3623                        $post_date = $this->_convert_date( $entry['post_date'] );
     3624                        $post_date_gmt = $this->_convert_date( $entry['post_date_gmt'] );
     3625                        $post_modified = $this->_convert_date( $entry['post_modified'] );
     3626                        $post_modified_gmt = $this->_convert_date( $entry['post_modified_gmt'] );
    35453627
    35463628                        // For drafts use the GMT version of the date
    35473629                        if ( $entry['post_status'] == 'draft' ) {
    3548                                 $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_date'] ), 'Ymd\TH:i:s' );
    3549                                 $post_modified_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_modified'] ), 'Ymd\TH:i:s' );
     3630                                $post_date_gmt = $this->_convert_date_gmt( $entry['post_date'] );
     3631                                $post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified'] );
    35503632                        }
    35513633
    35523634                        $categories = array();
     
    35843666                                $post_format = 'standard';
    35853667
    35863668                        $struct[] = array(
    3587                                 'dateCreated' => new IXR_Date($post_date),
     3669                                'dateCreated' => $post_date,
    35883670                                'userid' => $entry['post_author'],
    35893671                                'postid' => (string) $entry['ID'],
    35903672                                'description' => $post['main'],
     
    36033685                                'wp_password' => $entry['post_password'],
    36043686                                'wp_author_id' => (string) $author->ID,
    36053687                                'wp_author_display_name' => $author->display_name,
    3606                                 'date_created_gmt' => new IXR_Date($post_date_gmt),
     3688                                'date_created_gmt' => $post_date_gmt,
    36073689                                'post_status' => $entry['post_status'],
    36083690                                'custom_fields' => $this->get_custom_fields($entry['ID']),
    36093691                                'wp_post_format' => $post_format,
    3610                                 'date_modified' => new IXR_Date( $post_modified ),
    3611                                 'date_modified_gmt' => new IXR_Date( $post_modified_gmt )
     3692                                'date_modified' => $post_modified,
     3693                                'date_modified_gmt' => $post_modified_gmt
    36123694                        );
    36133695
     3696                        $entry_index = count( $struct ) - 1;
     3697                        if( current_theme_supports( 'post-thumbnails' ) ) {
     3698                                $struct[ $entry_index ][ 'wp_featured_image' ] = get_post_thumbnail_id( $entry['ID'] );
     3699                                $struct[ $entry_index ][ 'wp_featured_image_url' ] = wp_get_attachment_url( $struct[ $entry_index ][ 'wp_featured_image' ] );
     3700                        }
    36143701                }
    36153702
    36163703                $recent_posts = array();
     
    37833870                        if ( !current_user_can( 'edit_post', $entry['ID'] ) )
    37843871                                continue;
    37853872
    3786                         $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false);
    3787                         $post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt'], false);
     3873                        $post_date = $this->_convert_date( $entry['post_date'] );
     3874                        $post_date_gmt = $this->_convert_date( $entry['post_date_gmt'] );
    37883875
    37893876                        // For drafts use the GMT version of the date
    3790                         if ( $entry['post_status'] == 'draft' )
    3791                                 $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_date'] ), 'Ymd\TH:i:s' );
     3877                        if ( in_array( $entry['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) )
     3878                                $post_date_gmt = $this->_convert_date_gmt( $entry['post_date'] );
    37923879
    37933880                        $struct[] = array(
    3794                                 'dateCreated' => new IXR_Date($post_date),
     3881                                'dateCreated' => $post_date,
    37953882                                'userid' => $entry['post_author'],
    37963883                                'postid' => (string) $entry['ID'],
    37973884                                'title' => $entry['post_title'],
    37983885                                'post_status' => $entry['post_status'],
    3799                                 'date_created_gmt' => new IXR_Date($post_date_gmt)
     3886                                'date_created_gmt' => $post_date_gmt
    38003887                        );
    38013888
    38023889                }