From fc698de4041b07e8ab793ae2e499b71d06f1a25d Mon Sep 17 00:00:00 2001 From: websupporter Date: Tue, 13 Sep 2016 09:43:22 +0300 Subject: [PATCH 1/6] extent revisions to show raw + rendered --- .../class-wp-rest-revisions-controller.php | 145 ++++++++++++------ 1 file changed, 97 insertions(+), 48 deletions(-) diff --git a/lib/endpoints/class-wp-rest-revisions-controller.php b/lib/endpoints/class-wp-rest-revisions-controller.php index 734b0a5da4..c4ef6d9fb5 100755 --- a/lib/endpoints/class-wp-rest-revisions-controller.php +++ b/lib/endpoints/class-wp-rest-revisions-controller.php @@ -180,31 +180,80 @@ public function delete_item( $request ) { */ public function prepare_item_for_response( $post, $request ) { - // Base fields for every post - $data = array( - 'author' => $post->post_author, - 'date' => $this->prepare_date_response( $post->post_date_gmt, $post->post_date ), - 'date_gmt' => $this->prepare_date_response( $post->post_date_gmt ), - 'guid' => $post->guid, - 'id' => $post->ID, - 'modified' => $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified ), - 'modified_gmt' => $this->prepare_date_response( $post->post_modified_gmt ), - 'parent' => (int) $post->post_parent, - 'slug' => $post->post_name, - ); - $schema = $this->get_item_schema(); + $data = array(); + + if ( ! empty( $schema['properties']['author'] ) ) { + $data['author'] = $post->post_author; + } + + if ( ! empty( $schema['properties']['date'] ) ) { + $data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date ); + } + + if ( ! empty( $schema['properties']['date_gmt'] ) ) { + $data['date'] = $this->prepare_date_response( $post->post_date_gmt ); + } + + if ( ! empty( $schema['properties']['id'] ) ) { + $data['date'] = $post->ID; + } + + if ( ! empty( $schema['properties']['modified'] ) ) { + $data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified ); + } + + if ( ! empty( $schema['properties']['modified_gmt'] ) ) { + $data['modified_gmt'] = $this->prepare_date_response( $post->post_modified_gmt ); + } + + if ( ! empty( $schema['properties']['parent'] ) ) { + $data['parent'] = (int) $post->post_parent; + } + + if ( ! empty( $schema['properties']['parent'] ) ) { + $data['slug'] = $post->post_name; + } + + if ( ! empty( $schema['properties']['guid'] ) ) { + $data['guid'] = array( + /** This filter is documented in wp-includes/post-template.php */ + 'rendered' => apply_filters( 'get_the_guid', $post->guid ), + 'raw' => $post->guid, + ); + } + if ( ! empty( $schema['properties']['title'] ) ) { - $data['title'] = $post->post_title; + $data['title'] = array( + 'raw' => $post->post_title, + 'rendered' => get_the_title( $post->ID ), + ); } if ( ! empty( $schema['properties']['content'] ) ) { - $data['content'] = $post->post_content; + + if ( ! empty( $post->post_password ) ) { + $this->prepare_password_response( $post->post_password ); + } + + $data['content'] = array( + 'raw' => $post->post_content, + /** This filter is documented in wp-includes/post-template.php */ + 'rendered' => apply_filters( 'the_content', $post->post_content ), + ); + + // Don't leave our cookie lying around: https://github.com/WP-API/WP-API/issues/1055. + if ( ! empty( $post->post_password ) ) { + $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] = ''; + } } if ( ! empty( $schema['properties']['excerpt'] ) ) { - $data['excerpt'] = $post->post_excerpt; + $data['excerpt'] = array( + 'raw' => $post->post_excerpt, + 'rendered' => $this->prepare_excerpt_response( $post->post_excerpt, $post ), + ); } $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; @@ -316,38 +365,17 @@ public function get_item_schema() { $parent_schema = $this->parent_controller->get_item_schema(); - foreach ( array( 'title', 'content', 'excerpt' ) as $property ) { - if ( empty( $parent_schema['properties'][ $property ] ) ) { - continue; - } - - switch ( $property ) { - - case 'title': - $schema['properties']['title'] = array( - 'description' => __( 'Title for the object, as it exists in the database.' ), - 'type' => 'string', - 'context' => array( 'view', 'edit', 'embed' ), - ); - break; - - case 'content': - $schema['properties']['content'] = array( - 'description' => __( 'Content for the object, as it exists in the database.' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ); - break; - - case 'excerpt': - $schema['properties']['excerpt'] = array( - 'description' => __( 'Excerpt for the object, as it exists in the database.' ), - 'type' => 'string', - 'context' => array( 'view', 'edit', 'embed' ), - ); - break; - - } + if ( ! empty( $parent_schema['properties']['title'] ) ) { + $schema['properties']['title'] = $parent_schema['properties']['title']; + } + if ( ! empty( $parent_schema['properties']['content'] ) ) { + $schema['properties']['content'] = $parent_schema['properties']['content']; + } + if ( ! empty( $parent_schema['properties']['excerpt'] ) ) { + $schema['properties']['excerpt'] = $parent_schema['properties']['excerpt']; + } + if ( ! empty( $parent_schema['properties']['guid'] ) ) { + $schema['properties']['guid'] = $parent_schema['properties']['guid']; } return $this->add_additional_fields_schema( $schema ); @@ -364,4 +392,25 @@ public function get_collection_params() { ); } + /** + * Check the post excerpt and prepare it for single post output. + * + * @param string $excerpt + * @return string|null $excerpt + */ + protected function prepare_excerpt_response( $excerpt, $post ) { + if ( post_password_required() ) { + return __( 'There is no excerpt because this is a protected post.' ); + } + + /** This filter is documented in wp-includes/post-template.php */ + $excerpt = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $excerpt, $post ) ); + + if ( empty( $excerpt ) ) { + return ''; + } + + return $excerpt; + } + } From 1c26a4f60e969ebe55fc661964578f0cb95d78be Mon Sep 17 00:00:00 2001 From: websupporter Date: Tue, 13 Sep 2016 11:14:07 +0300 Subject: [PATCH 2/6] revision bugfix + unit test adjusting --- .../class-wp-rest-revisions-controller.php | 6 +++--- tests/test-rest-revisions-controller.php | 20 ++++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/endpoints/class-wp-rest-revisions-controller.php b/lib/endpoints/class-wp-rest-revisions-controller.php index c4ef6d9fb5..71fe366054 100755 --- a/lib/endpoints/class-wp-rest-revisions-controller.php +++ b/lib/endpoints/class-wp-rest-revisions-controller.php @@ -193,11 +193,11 @@ public function prepare_item_for_response( $post, $request ) { } if ( ! empty( $schema['properties']['date_gmt'] ) ) { - $data['date'] = $this->prepare_date_response( $post->post_date_gmt ); + $data['date_gmt'] = $this->prepare_date_response( $post->post_date_gmt ); } if ( ! empty( $schema['properties']['id'] ) ) { - $data['date'] = $post->ID; + $data['id'] = $post->ID; } if ( ! empty( $schema['properties']['modified'] ) ) { @@ -212,7 +212,7 @@ public function prepare_item_for_response( $post, $request ) { $data['parent'] = (int) $post->post_parent; } - if ( ! empty( $schema['properties']['parent'] ) ) { + if ( ! empty( $schema['properties']['slug'] ) ) { $data['slug'] = $post->post_name; } diff --git a/tests/test-rest-revisions-controller.php b/tests/test-rest-revisions-controller.php index 73b7b60b44..13c6a85308 100644 --- a/tests/test-rest-revisions-controller.php +++ b/tests/test-rest-revisions-controller.php @@ -265,18 +265,28 @@ protected function check_get_revision_response( $response, $revision ) { $this->assertArrayHasKey( '_links', $response ); $links = $response['_links']; } - + $this->assertEquals( $revision->post_author, $response['author'] ); - $this->assertEquals( $revision->post_content, $response['content'] ); + + $rendered_content = apply_filters( 'the_content', $revision->post_content ); + $this->assertEquals( $rendered_content, $response['content']['rendered'] ); + $this->assertEquals( mysql_to_rfc3339( $revision->post_date ), $response['date'] ); $this->assertEquals( mysql_to_rfc3339( $revision->post_date_gmt ), $response['date_gmt'] ); - $this->assertEquals( $revision->post_excerpt, $response['excerpt'] ); - $this->assertEquals( $revision->guid, $response['guid'] ); + + $rendered_excerpt = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $revision->post_excerpt, $revision ) ); + $this->assertEquals( $rendered_excerpt, $response['excerpt']['rendered'] ); + + $rendered_guid = apply_filters( 'get_the_guid', $revision->guid ); + $this->assertEquals( $rendered_guid, $response['guid']['rendered'] ); + $this->assertEquals( $revision->ID, $response['id'] ); $this->assertEquals( mysql_to_rfc3339( $revision->post_modified ), $response['modified'] ); $this->assertEquals( mysql_to_rfc3339( $revision->post_modified_gmt ), $response['modified_gmt'] ); $this->assertEquals( $revision->post_name, $response['slug'] ); - $this->assertEquals( $revision->post_title, $response['title'] ); + + $rendered_title = get_the_title( $revision->ID ); + $this->assertEquals( $rendered_title, $response['title']['rendered'] ); $parent = get_post( $revision->post_parent ); $parent_controller = new WP_REST_Posts_Controller( $parent->post_type ); From ee69cce6cbf62546deae0034d4af0a29d5d49f80 Mon Sep 17 00:00:00 2001 From: websupporter Date: Tue, 13 Sep 2016 11:27:55 +0300 Subject: [PATCH 3/6] remove whitespaces --- .../class-wp-rest-revisions-controller.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/endpoints/class-wp-rest-revisions-controller.php b/lib/endpoints/class-wp-rest-revisions-controller.php index 71fe366054..e012818907 100755 --- a/lib/endpoints/class-wp-rest-revisions-controller.php +++ b/lib/endpoints/class-wp-rest-revisions-controller.php @@ -187,31 +187,31 @@ public function prepare_item_for_response( $post, $request ) { if ( ! empty( $schema['properties']['author'] ) ) { $data['author'] = $post->post_author; } - + if ( ! empty( $schema['properties']['date'] ) ) { $data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date ); } - + if ( ! empty( $schema['properties']['date_gmt'] ) ) { $data['date_gmt'] = $this->prepare_date_response( $post->post_date_gmt ); } - + if ( ! empty( $schema['properties']['id'] ) ) { $data['id'] = $post->ID; } - + if ( ! empty( $schema['properties']['modified'] ) ) { $data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified ); } - + if ( ! empty( $schema['properties']['modified_gmt'] ) ) { $data['modified_gmt'] = $this->prepare_date_response( $post->post_modified_gmt ); } - + if ( ! empty( $schema['properties']['parent'] ) ) { $data['parent'] = (int) $post->post_parent; } - + if ( ! empty( $schema['properties']['slug'] ) ) { $data['slug'] = $post->post_name; } From f338cf3d0a7c6d388421774abc3561eec8914e52 Mon Sep 17 00:00:00 2001 From: websupporter Date: Tue, 13 Sep 2016 11:33:29 +0300 Subject: [PATCH 4/6] remove whitespaces in test --- tests/test-rest-revisions-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-rest-revisions-controller.php b/tests/test-rest-revisions-controller.php index 13c6a85308..ff453a3cc2 100644 --- a/tests/test-rest-revisions-controller.php +++ b/tests/test-rest-revisions-controller.php @@ -265,7 +265,7 @@ protected function check_get_revision_response( $response, $revision ) { $this->assertArrayHasKey( '_links', $response ); $links = $response['_links']; } - + $this->assertEquals( $revision->post_author, $response['author'] ); $rendered_content = apply_filters( 'the_content', $revision->post_content ); From b5065957f5eb8b12b8fa2b9874eedd911d8996b8 Mon Sep 17 00:00:00 2001 From: websupporter Date: Tue, 13 Sep 2016 11:51:05 +0300 Subject: [PATCH 5/6] add password prepare function --- .../class-wp-rest-revisions-controller.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/endpoints/class-wp-rest-revisions-controller.php b/lib/endpoints/class-wp-rest-revisions-controller.php index e012818907..9e1df4009c 100755 --- a/lib/endpoints/class-wp-rest-revisions-controller.php +++ b/lib/endpoints/class-wp-rest-revisions-controller.php @@ -413,4 +413,19 @@ protected function prepare_excerpt_response( $excerpt, $post ) { return $excerpt; } + protected function prepare_password_response( $password ) { + if ( ! empty( $password ) ) { + /** + * Fake the correct cookie to fool post_password_required(). + * Without this, get_the_content() will give a password form. + */ + require_once ABSPATH . WPINC .'/class-phpass.php'; + $hasher = new PasswordHash( 8, true ); + $value = $hasher->HashPassword( $password ); + $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] = wp_slash( $value ); + } + + return $password; + } + } From a7525c57aeedad81fb5c02af1ae8154f25656014 Mon Sep 17 00:00:00 2001 From: websupporter Date: Tue, 13 Sep 2016 12:21:57 +0300 Subject: [PATCH 6/6] remove password, not needed for revisions --- .../class-wp-rest-revisions-controller.php | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/lib/endpoints/class-wp-rest-revisions-controller.php b/lib/endpoints/class-wp-rest-revisions-controller.php index 9e1df4009c..d7f54319da 100755 --- a/lib/endpoints/class-wp-rest-revisions-controller.php +++ b/lib/endpoints/class-wp-rest-revisions-controller.php @@ -233,20 +233,11 @@ public function prepare_item_for_response( $post, $request ) { if ( ! empty( $schema['properties']['content'] ) ) { - if ( ! empty( $post->post_password ) ) { - $this->prepare_password_response( $post->post_password ); - } - $data['content'] = array( 'raw' => $post->post_content, /** This filter is documented in wp-includes/post-template.php */ 'rendered' => apply_filters( 'the_content', $post->post_content ), ); - - // Don't leave our cookie lying around: https://github.com/WP-API/WP-API/issues/1055. - if ( ! empty( $post->post_password ) ) { - $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] = ''; - } } if ( ! empty( $schema['properties']['excerpt'] ) ) { @@ -399,9 +390,6 @@ public function get_collection_params() { * @return string|null $excerpt */ protected function prepare_excerpt_response( $excerpt, $post ) { - if ( post_password_required() ) { - return __( 'There is no excerpt because this is a protected post.' ); - } /** This filter is documented in wp-includes/post-template.php */ $excerpt = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $excerpt, $post ) ); @@ -413,19 +401,4 @@ protected function prepare_excerpt_response( $excerpt, $post ) { return $excerpt; } - protected function prepare_password_response( $password ) { - if ( ! empty( $password ) ) { - /** - * Fake the correct cookie to fool post_password_required(). - * Without this, get_the_content() will give a password form. - */ - require_once ABSPATH . WPINC .'/class-phpass.php'; - $hasher = new PasswordHash( 8, true ); - $value = $hasher->HashPassword( $password ); - $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] = wp_slash( $value ); - } - - return $password; - } - }