Changeset 633255
- Timestamp:
- 12/03/2012 01:03:37 AM (13 years ago)
- Location:
- xml-rpc-modernization/trunk
- Files:
-
- 3 edited
-
class-wp-xmlrpc-server-ext.php (modified) (29 diffs)
-
readme.txt (modified) (3 diffs)
-
wp-xmlrpc-modernization.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
xml-rpc-modernization/trunk/class-wp-xmlrpc-server-ext.php
r548544 r633255 10 10 // hook filter to add the new methods after the existing ones are added in the parent constructor 11 11 add_filter( 'xmlrpc_methods' , array( &$this, 'wxm_xmlrpc_methods' ) ); 12 13 // patch wp.uploadFile to return ID14 add_filter( 'wp_handle_upload', array( &$this, 'wxm_handle_upload' ) );15 12 16 13 // add new options … … 29 26 $new_methods['wp.getUser'] = array( &$this, 'wp_getUser' ); 30 27 $new_methods['wp.getUsers'] = array( &$this, 'wp_getUsers' ); 31 $new_methods['wp.getUserInfo'] = array( &$this, 'wp_getUserInfo' ); 28 $new_methods['wp.getProfile'] = array( &$this, 'wp_getProfile' ); 29 $new_methods['wp.editProfile'] = array( &$this, 'wp_editProfile' ); 32 30 33 31 // custom post type management … … 39 37 $new_methods['wp.getPostType'] = array( &$this, 'wp_getPostType' ); 40 38 $new_methods['wp.getPostTypes'] = array( &$this, 'wp_getPostTypes' ); 39 $new_methods['wp.getRevisions'] = array( &$this, 'wp_getRevisions' ); 40 $new_methods['wp.restoreRevision'] = array( &$this, 'wp_restoreRevision' ); 41 41 42 42 // custom taxonomy management … … 57 57 $methods['wp.getMediaLibrary'] = array( &$this, 'wxm_wp_getMediaLibrary' ); 58 58 } 59 if ( $version < 3.5 ) { 60 // for pre-3.5, explicitly override the core implementation of uploads and posts 61 $methods['wp.uploadFile'] = array( &$this, 'wxm_wp_uploadFile' ); 62 $methods['metaWeblog.newMediaObject'] = array( &$this, 'wxm_wp_uploadFile' ); 63 64 $methods['wp.newPost'] = array( &$this, 'wxm_wp_newPost' ); 65 $methods['wp.editPost'] = array( &$this, 'wxm_wp_editPost' ); 66 $methods['wp.getPosts'] = array( &$this, 'wxm_wp_getPosts' ); 67 $methods['wp.getPost'] = array( &$this, 'wxm_wp_getPost' ); 68 } 59 69 60 70 // array_merge will take the values defined in later arguments, so … … 103 113 */ 104 114 protected function wxm_prepare_user( $user, $fields ) { 105 $contact_methods = _wp_get_user_contactmethods(); 106 107 $user_contacts = array(); 108 foreach ( $contact_methods as $key => $value ) { 109 $user_contacts[$key] = $user->$key; 110 } 111 112 $_user = array( 'user_id' => $user->ID ); 115 $_user = array( 'user_id' => strval( $user->ID ) ); 113 116 114 117 $user_fields = array( … … 123 126 'url' => $user->user_url, 124 127 'display_name' => $user->display_name, 125 'capabilities' => $user->wp_capabilities, 126 'user_level' => $user->wp_user_level, 127 'user_contacts' => $user_contacts 128 'roles' => $user->roles, 128 129 ); 129 130 130 131 if ( in_array( 'all', $fields ) ) { 131 132 $_user = array_merge( $_user, $user_fields ); 132 } 133 else { 133 } else { 134 134 if ( in_array( 'basic', $fields ) ) { 135 135 $basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' ); … … 200 200 'post_excerpt' => $post['post_excerpt'], 201 201 'post_content' => $post['post_content'], 202 'post_parent' => strval( $post['post_parent'] ), 203 'post_mime_type' => $post['post_mime_type'], 202 204 'link' => post_permalink( $post['ID'] ), 205 'guid' => $post['guid'], 206 'menu_order' => intval( $post['menu_order'] ), 203 207 'comment_status' => $post['comment_status'], 204 208 'ping_status' => $post['ping_status'], … … 719 723 * - 'url' 720 724 * - 'display_name' 721 * - 'capabilities' 722 * - 'user_level' 723 * - 'user_contacts' 725 * - 'roles' 724 726 */ 725 727 function wxm_wp_getUser( $args ) { … … 744 746 do_action( 'xmlrpc_call', 'wp.getUser' ); 745 747 748 if ( ! current_user_can( 'edit_user', $user_id ) ) 749 return new IXR_Error( 401, __( 'Sorry, you cannot edit users.' ) ); 750 746 751 $user_data = get_userdata( $user_id ); 747 752 … … 749 754 return new IXR_Error( 404, __( 'Invalid user ID' ) ); 750 755 751 if ( ! ( $user_id == $user->ID || current_user_can( 'edit_users' ) ) ) 752 return new IXR_Error( 401, __( 'Sorry, you cannot edit users.' ) ); 753 754 $user = $this->_prepare_user( $user_data, $fields ); 755 756 return $user; 756 return $this->_prepare_user( $user_data, $fields ); 757 757 } 758 758 … … 761 761 * 762 762 * The optional $filter parameter modifies the query used to retrieve users. 763 * Accepted keys are 'number' (default: 50), 'offset' (default: 0), and 'role'. 763 * Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role', 764 * 'who', 'orderby', and 'order'. 764 765 * 765 766 * The optional $fields parameter specifies what fields will be included … … 791 792 $fields = $args[4]; 792 793 else 793 $fields = apply_filters( 'xmlrpc_default_user_fields', array( ' basic' ), 'wp.getUsers' );794 $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' ); 794 795 795 796 if ( ! $user = $this->login( $username, $password ) ) … … 798 799 do_action( 'xmlrpc_call', 'wp.getUsers' ); 799 800 800 if ( ! current_user_can( 'edit_users' ) ) 801 return new IXR_Error( 401, __( 'Sorry, you cannot edit users.' ) ); 802 803 $query = array(); 804 805 // only retrieve IDs since wp_getUser will ignore anything else 806 $query['fields'] = array( 'ID' ); 801 if ( ! current_user_can( 'list_users' ) ) 802 return new IXR_Error( 401, __( 'Sorry, you cannot list users.' ) ); 803 804 $query = array( 'fields' => 'all_with_meta' ); 807 805 808 806 $query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50; 809 807 $query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0; 808 809 if ( isset( $filter['orderby'] ) ) { 810 $query['orderby'] = $filter['orderby']; 811 812 if ( isset( $filter['order'] ) ) 813 $query['order'] = $filter['order']; 814 } 810 815 811 816 if ( isset( $filter['role'] ) ) { … … 816 821 } 817 822 823 if ( isset( $filter['who'] ) ) { 824 $query['who'] = $filter['who']; 825 } 826 818 827 $users = get_users( $query ); 819 828 820 829 $_users = array(); 821 830 foreach ( $users as $user_data ) { 822 $_users[] = $this->_prepare_user( get_userdata( $user_data->ID ), $fields );823 }824 831 if ( current_user_can( 'edit_user', $user_data->ID ) ) 832 $_users[] = $this->_prepare_user( $user_data, $fields ); 833 } 825 834 return $_users; 826 835 } … … 837 846 * @return array (@see wp_getUser) 838 847 */ 839 function wxm_wp_get UserInfo( $args ) {848 function wxm_wp_getProfile( $args ) { 840 849 if ( ! $this->minimum_args( $args, 3 ) ) 841 850 return $this->error; … … 850 859 $fields = $args[3]; 851 860 else 852 $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.get UserInfo' );861 $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' ); 853 862 854 863 if ( ! $user = $this->login( $username, $password ) ) 855 864 return $this->error; 856 865 857 do_action( 'xmlrpc_call', 'wp.getUserInfo' ); 866 do_action( 'xmlrpc_call', 'wp.getProfile' ); 867 868 if ( ! current_user_can( 'edit_user', $user->ID ) ) 869 return new IXR_Error( 401, __( 'Sorry, you cannot edit your profile.' ) ); 858 870 859 871 $user_data = get_userdata( $user->ID ); 860 $user = $this->_prepare_user( $user_data, $fields ); 861 862 return $user; 872 873 return $this->_prepare_user( $user_data, $fields ); 874 } 875 876 /** 877 * Edit user's profile. 878 * 879 * @uses wp_update_user() 880 * @param array $args Method parameters. Contains: 881 * - int $blog_id 882 * - string $username 883 * - string $password 884 * - array $content_struct 885 * It can optionally contain: 886 * - 'first_name' 887 * - 'last_name' 888 * - 'website' 889 * - 'display_name' 890 * - 'nickname' 891 * - 'nicename' 892 * - 'bio' 893 * @return bool True, on success. 894 */ 895 function wxm_wp_editProfile( $args ) { 896 if ( ! $this->minimum_args( $args, 4 ) ) 897 return $this->error; 898 899 $this->escape( $args ); 900 901 $blog_id = (int) $args[0]; 902 $username = $args[1]; 903 $password = $args[2]; 904 $content_struct = $args[3]; 905 906 if ( ! $user = $this->login( $username, $password ) ) 907 return $this->error; 908 909 do_action( 'xmlrpc_call', 'wp.editProfile' ); 910 911 if ( ! current_user_can( 'edit_user', $user->ID ) ) 912 return new IXR_Error( 401, __( 'Sorry, you cannot edit your profile.' ) ); 913 914 // holds data of the user 915 $user_data = array(); 916 $user_data['ID'] = $user->ID; 917 918 // only set the user details if it was given 919 if ( isset( $content_struct['first_name'] ) ) 920 $user_data['first_name'] = $content_struct['first_name']; 921 922 if ( isset( $content_struct['last_name'] ) ) 923 $user_data['last_name'] = $content_struct['last_name']; 924 925 if ( isset( $content_struct['url'] ) ) 926 $user_data['user_url'] = $content_struct['url']; 927 928 if ( isset( $content_struct['display_name'] ) ) 929 $user_data['display_name'] = $content_struct['display_name']; 930 931 if ( isset( $content_struct['nickname'] ) ) 932 $user_data['nickname'] = $content_struct['nickname']; 933 934 if ( isset( $content_struct['nicename'] ) ) 935 $user_data['user_nicename'] = $content_struct['nicename']; 936 937 if ( isset( $content_struct['bio'] ) ) 938 $user_data['description'] = $content_struct['bio']; 939 940 $result = wp_update_user( $user_data ); 941 942 if ( is_wp_error( $result ) ) 943 return new IXR_Error( 500, $result->get_error_message() ); 944 945 if ( ! $result ) 946 return new IXR_Error( 500, __( 'Sorry, the user cannot be updated.' ) ); 947 948 return true; 863 949 } 864 950 … … 877 963 * - post_title 878 964 * - post_author 879 * - post_ex erpt965 * - post_excerpt 880 966 * - post_content 881 967 * - post_date_gmt | post_date … … 911 997 unset( $content_struct['ID'] ); 912 998 913 return $this-> _insert_post( $user, $content_struct );999 return $this->wxm_insert_post( $user, $content_struct ); 914 1000 } 915 1001 … … 962 1048 break; 963 1049 default: 964 $post_data['post_status'] = 'draft'; 1050 if ( ! get_post_status_object( $post_data['post_status'] ) ) 1051 $post_data['post_status'] = 'draft'; 965 1052 break; 966 1053 } … … 1027 1114 if ( ! $post_data['post_thumbnail'] ) 1028 1115 delete_post_thumbnail( $post_ID ); 1029 elseif ( ! set_post_thumbnail( $post_ID, $post_data['post_thumbnail']) )1116 elseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) ) 1030 1117 return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); 1118 set_post_thumbnail( $post_ID, $post_data['post_thumbnail'] ); 1031 1119 unset( $content_struct['post_thumbnail'] ); 1032 1120 } … … 1139 1227 $post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct ); 1140 1228 1141 $post_ID = wp_insert_post( $post_data, true );1229 $post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true ); 1142 1230 if ( is_wp_error( $post_ID ) ) 1143 1231 return new IXR_Error( 500, $post_ID->get_error_message() ); … … 1186 1274 return new IXR_Error( 404, __( 'Invalid post ID.' ) ); 1187 1275 1276 if ( isset( $content_struct['if_not_modified_since'] ) ) { 1277 // If the post has been modified since the date provided, return an error. 1278 if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) { 1279 return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) ); 1280 } 1281 } 1282 1188 1283 // convert the date field back to IXR form 1189 1284 $post['post_date'] = $this->_convert_date( $post['post_date'] ); … … 1199 1294 $merged_content_struct = array_merge( $post, $content_struct ); 1200 1295 1201 $retval = $this-> _insert_post( $user, $merged_content_struct );1296 $retval = $this->wxm_insert_post( $user, $merged_content_struct ); 1202 1297 if ( $retval instanceof IXR_Error ) 1203 1298 return $retval; … … 1321 1416 return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); 1322 1417 1323 return $this-> _prepare_post( $post, $fields );1418 return $this->wxm_prepare_post( $post, $fields ); 1324 1419 } 1325 1420 … … 1329 1424 * The optional $filter parameter modifies the query used to retrieve posts. 1330 1425 * Accepted keys are 'post_type', 'post_status', 'number', 'offset', 1331 * 'orderby', and 'order'.1426 * 'orderby', 'order', and 's'. 1332 1427 * 1333 1428 * The optional $fields parameter specifies what fields will be included … … 1396 1491 } 1397 1492 1493 if ( isset( $filter['s'] ) ) { 1494 $query['s'] = $filter['s']; 1495 } 1496 1398 1497 $posts_list = wp_get_recent_posts( $query ); 1399 1498 … … 1409 1508 continue; 1410 1509 1411 $struct[] = $this-> _prepare_post( $post, $fields );1510 $struct[] = $this->wxm_prepare_post( $post, $fields ); 1412 1511 } 1413 1512 … … 1976 2075 } 1977 2076 1978 function wxm_handle_upload( $struct ) { 1979 // prior to WP3.4, 'id' was not included in the struct returned by metaWeblog.newMediaObject/wp.uploadFile. 1980 // to add it, we need to find the most recent attachment with post_title equal to the filename. 1981 if ( ! in_array( 'id', $struct ) ) { 1982 global $wpdb; 1983 $id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title='%s' AND post_type='attachment' ORDER BY post_date DESC", $struct['file'] ) ); 1984 if ( $id !== null ) { 1985 $struct['id'] = $id; 1986 } 1987 } 2077 /** 2078 * Retrieve revisions for a specific post. 2079 * 2080 * The optional $fields parameter specifies what fields will be included 2081 * in the response array. 2082 * 2083 * @uses wp_get_post_revisions() 2084 * @see wp_getPost() for more on $fields 2085 * 2086 * @param array $args Method parameters. Contains: 2087 * - int $blog_id 2088 * - string $username 2089 * - string $password 2090 * - int $post_id 2091 * - array $fields 2092 * @return array contains a collection of posts. 2093 */ 2094 function wxm_wp_getRevisions( $args ) { 2095 if ( ! $this->minimum_args( $args, 4 ) ) 2096 return $this->error; 2097 2098 $this->escape( $args ); 2099 2100 $blog_id = (int) $args[0]; 2101 $username = $args[1]; 2102 $password = $args[2]; 2103 $post_id = (int) $args[3]; 2104 2105 if ( isset( $args[4] ) ) 2106 $fields = $args[4]; 2107 else 2108 $fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' ); 2109 2110 if ( ! $user = $this->login( $username, $password ) ) 2111 return $this->error; 2112 2113 do_action( 'xmlrpc_call', 'wp.getRevisions' ); 2114 2115 if ( ! $post = get_post( $post_id ) ) 2116 return new IXR_Error( 404, __( 'Invalid post ID' ) ); 2117 2118 if ( ! current_user_can( 'edit_post', $post_id ) ) 2119 return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); 2120 2121 // Check if revisions are enabled. 2122 if ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) 2123 return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); 2124 2125 $revisions = wp_get_post_revisions( $post_id ); 2126 2127 if ( ! $revisions ) 2128 return array(); 2129 2130 $struct = array(); 2131 2132 foreach ( $revisions as $revision ) { 2133 if ( ! current_user_can( 'read_post', $revision->ID ) ) 2134 continue; 2135 2136 // Skip autosaves 2137 if ( wp_is_post_autosave( $revision ) ) 2138 continue; 2139 2140 $struct[] = $this->wxm_prepare_post( get_object_vars( $revision ), $fields ); 2141 } 2142 1988 2143 return $struct; 2144 } 2145 2146 /** 2147 * Restore a post revision 2148 * 2149 * @uses wp_restore_post_revision() 2150 * 2151 * @param array $args Method parameters. Contains: 2152 * - int $blog_id 2153 * - string $username 2154 * - string $password 2155 * - int $post_id 2156 * @return bool false if there was an error restoring, true if success. 2157 */ 2158 function wxm_wp_restoreRevision( $args ) { 2159 if ( ! $this->minimum_args( $args, 3 ) ) 2160 return $this->error; 2161 2162 $this->escape( $args ); 2163 2164 $blog_id = (int) $args[0]; 2165 $username = $args[1]; 2166 $password = $args[2]; 2167 $revision_id = (int) $args[3]; 2168 2169 if ( ! $user = $this->login( $username, $password ) ) 2170 return $this->error; 2171 2172 do_action( 'xmlrpc_call', 'wp.restoreRevision' ); 2173 2174 if ( ! $revision = wp_get_post_revision( $revision_id ) ) 2175 return new IXR_Error( 404, __( 'Invalid post ID' ) ); 2176 2177 if ( wp_is_post_autosave( $revision ) ) 2178 return new IXR_Error( 404, __( 'Invalid post ID' ) ); 2179 2180 if ( ! $post = get_post( $revision->post_parent ) ) 2181 return new IXR_Error( 404, __( 'Invalid post ID' ) ); 2182 2183 if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) 2184 return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); 2185 2186 // Check if revisions are disabled. 2187 if ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) 2188 return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); 2189 2190 $post = wp_restore_post_revision( $revision_id ); 2191 2192 return (bool) $post; 2193 } 2194 2195 /** 2196 * Uploads a file, following your settings. 2197 * 2198 * @param array $args Method parameters. 2199 * @return array 2200 */ 2201 function wxm_wp_uploadFile($args) { 2202 global $wpdb; 2203 2204 $blog_ID = (int) $args[0]; 2205 $username = $wpdb->escape($args[1]); 2206 $password = $wpdb->escape($args[2]); 2207 $data = $args[3]; 2208 2209 $name = sanitize_file_name( $data['name'] ); 2210 $type = $data['type']; 2211 $bits = $data['bits']; 2212 2213 if ( !$user = $this->login($username, $password) ) 2214 return $this->error; 2215 2216 do_action('xmlrpc_call', 'metaWeblog.newMediaObject'); 2217 2218 if ( !current_user_can('upload_files') ) { 2219 $this->error = new IXR_Error( 401, __( 'You do not have permission to upload files.' ) ); 2220 return $this->error; 2221 } 2222 2223 if ( $upload_err = apply_filters( 'pre_upload_error', false ) ) 2224 return new IXR_Error(500, $upload_err); 2225 2226 if ( !empty($data['overwrite']) && ($data['overwrite'] == true) ) { 2227 // Get postmeta info on the object. 2228 $old_file = $wpdb->get_row(" 2229 SELECT ID 2230 FROM {$wpdb->posts} 2231 WHERE post_title = '{$name}' 2232 AND post_type = 'attachment' 2233 "); 2234 2235 // Delete previous file. 2236 wp_delete_attachment($old_file->ID); 2237 2238 // Make sure the new name is different by pre-pending the 2239 // previous post id. 2240 $filename = preg_replace('/^wpid\d+-/', '', $name); 2241 $name = "wpid{$old_file->ID}-{$filename}"; 2242 } 2243 2244 $upload = wp_upload_bits($name, null, $bits); 2245 if ( ! empty($upload['error']) ) { 2246 $errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']); 2247 return new IXR_Error(500, $errorString); 2248 } 2249 // Construct the attachment array 2250 $post_id = 0; 2251 if ( ! empty( $data['post_id'] ) ) { 2252 $post_id = (int) $data['post_id']; 2253 2254 if ( ! current_user_can( 'edit_post', $post_id ) ) 2255 return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); 2256 } 2257 $attachment = array( 2258 'post_title' => $name, 2259 'post_content' => '', 2260 'post_type' => 'attachment', 2261 'post_parent' => $post_id, 2262 'post_mime_type' => $type, 2263 'guid' => $upload[ 'url' ] 2264 ); 2265 2266 // Save the data 2267 $id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id ); 2268 wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) ); 2269 2270 do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); 2271 2272 $struct = array( 2273 'id' => strval( $id ), 2274 'file' => $name, 2275 'url' => $upload[ 'url' ], 2276 'type' => $type 2277 ); 2278 return apply_filters( 'wp_handle_upload', $struct, 'upload' ); 1989 2279 } 1990 2280 … … 1992 2282 $wp34_options = array( 1993 2283 // Read only options 2284 'home_url' => array( 2285 'desc' => __( 'Home URL' ), 2286 'readonly' => true, 2287 'option' => 'home' 2288 ), 1994 2289 'image_default_link_type' => array( 1995 2290 'desc' => __( 'Image default link type' ), -
xml-rpc-modernization/trunk/readme.txt
r548544 r633255 3 3 Tags: xmlrpc, xml-rpc, api 4 4 Requires at least: 3.3 5 Tested up to: 3. 45 Tested up to: 3.5 6 6 Stable tag: trunk 7 7 License: GPLv2 or later … … 26 26 * wp.editUser - edit user information 27 27 * wp.deleteUser - delete a specfic user 28 29 3.5 Methods for pre-3.5 sites: 30 28 31 * wp.getUser - get information about a specific user 29 32 * wp.getUsers - retrieve a list of users 30 * wp.getUserInfo - get information about the requesting user 33 * wp.getProfile - retrieve information about the requesting user 34 * wp.editProfile - edit the profile of the requesting user 35 * wp.getRevisions - retrieve revisions for a specific post 36 * wp.restoreRevision - restore a post revision 31 37 32 38 3.4 Methods for pre-3.4 sites: … … 48 54 49 55 == Changelog == 56 57 = 0.9 = 58 * Alignment with WordPress core version of wp.getUser and wp.getUsers. 59 * Renamed wp.getUserInfo to wp.getProfile to match 3.5 core. 60 * Added wp.editProfile to match WordPress core. 61 * Added wp.getRevisions and wp.restoreRevision methods to match 3.5 core. 62 * Added 'post_id" parameter to wp.uploadFile. 63 * Added 's' parameter to wp.getPosts. 64 * Added 'if_not_modified_since' parameter to wp.editPost. 65 * Added 'post_parent', 'guid', 'post_mime_type' and 'menu_order' to _prepare_post. 66 * Fixed several small bugs in wp.editPost. 50 67 51 68 = 0.8.2 = -
xml-rpc-modernization/trunk/wp-xmlrpc-modernization.php
r548544 r633255 4 4 * Plugin Name: wp-xmlrpc-modernization 5 5 * Description: This plugin extends the basic XML-RPC API exposed by WordPress. Derived from GSoC '11 project. 6 * Version: 0. 8.26 * Version: 0.9 7 7 * Author: Max Cutler 8 8 * Author URI: http://www.maxcutler.com
Note: See TracChangeset
for help on using the changeset viewer.