From fa87abfd6e363139b88018bf0a2fd4f512e3027f Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 12 Jul 2021 13:39:10 +0200 Subject: [PATCH] (feat): live preview --- CHANGELOG.md | 5 +++ config/core.php | 9 +++-- src/Base/Admin/AdminServiceProvider.php | 38 +++++++++++++++++++ src/Base/Repositories/AbstractRepository.php | 13 ++++--- .../RestAPI/Controllers/ItemController.php | 26 ++++++++++--- src/Base/Varnish/VarnishServiceProvider.php | 33 ++++++++++++++++ 6 files changed, 109 insertions(+), 15 deletions(-) create mode 100644 src/Base/Admin/AdminServiceProvider.php create mode 100644 src/Base/Varnish/VarnishServiceProvider.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c1fbb9..af646b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Version [2.0.10] +### Feat + +- Add preview parameter for retrieving drafts +- Purge Varnish on save_post + ### Fix - Add addHighlightedParameters to active items diff --git a/config/core.php b/config/core.php index 8384a96..be7aabe 100644 --- a/config/core.php +++ b/config/core.php @@ -3,10 +3,10 @@ return [ /** - * Service Providers. - */ + * Service Providers. + */ 'providers' => [ - /** + /** * Global providers. */ OWC\OpenPub\Base\PostType\PostTypeServiceProvider::class, @@ -15,6 +15,9 @@ OWC\OpenPub\Base\Metabox\MetaboxServiceProvider::class, OWC\OpenPub\Base\RestAPI\RestAPIServiceProvider::class, OWC\OpenPub\Base\ElasticPress\ElasticPressServiceProvider::class, + OWC\OpenPub\Base\Admin\AdminServiceProvider::class, + OWC\OpenPub\Base\Varnish\VarnishServiceProvider::class, + /** * Providers specific to the admin. */ diff --git a/src/Base/Admin/AdminServiceProvider.php b/src/Base/Admin/AdminServiceProvider.php new file mode 100644 index 0000000..99c67fc --- /dev/null +++ b/src/Base/Admin/AdminServiceProvider.php @@ -0,0 +1,38 @@ +plugin->loader->addAction('preview_post_link', $this, 'filterPostLink', 10, 10, 2); + $this->plugin->loader->addAction('rest_prepare_pdc-item', $this, 'restPrepareResponseLink', 10, 2); + } + + /** + * Changes the url user for live preview to the portal url. + * Works in the old editor (not gutenberg) + */ + public function filterPostLink($link, \WP_Post $post): string + { + $itemModel = Item::makeFrom($post); + $url = $itemModel->getPortalURL(); + return $url . "?preview=true"; + } + + /** + * Changes the url used for live preview to the portal url. + * Works in the gutenberg editor. + */ + public function restPrepareResponseLink(\WP_REST_Response $response, \WP_Post $post): \WP_REST_Response + { + $itemModel = Item::makeFrom($post); + $response->data['link'] = $itemModel->getPortalURL() ?? ''; + + return $response; + } +} diff --git a/src/Base/Repositories/AbstractRepository.php b/src/Base/Repositories/AbstractRepository.php index 86ea4ac..ad0d1e1 100644 --- a/src/Base/Repositories/AbstractRepository.php +++ b/src/Base/Repositories/AbstractRepository.php @@ -227,12 +227,13 @@ public static function getGlobalFields(): array public function transform(WP_Post $post) { $data = [ - 'id' => $post->ID, - 'title' => $post->post_title, - 'content' => apply_filters('the_content', $post->post_content), - 'excerpt' => $post->post_excerpt, - 'date' => $post->post_date, - 'slug' => $post->post_name + 'id' => $post->ID, + 'title' => $post->post_title, + 'content' => apply_filters('the_content', $post->post_content), + 'excerpt' => $post->post_excerpt, + 'date' => $post->post_date, + 'slug' => $post->post_name, + 'post_status' => $post->post_status ]; $data = $this->assignFields($data, $post); diff --git a/src/Base/RestAPI/Controllers/ItemController.php b/src/Base/RestAPI/Controllers/ItemController.php index c2b3c54..a3a0d2e 100644 --- a/src/Base/RestAPI/Controllers/ItemController.php +++ b/src/Base/RestAPI/Controllers/ItemController.php @@ -63,9 +63,9 @@ public function getItem(WP_REST_Request $request) { $id = (int) $request->get_param('id'); - $item = (new Item) - ->query(apply_filters('owc/openpub/rest-api/items/query/single', [])) - ->find($id); + $item = $this->singleItemQueryBuilder($request); + + $item = $item->find($id); if (!$item) { return new WP_Error('no_item_found', sprintf('Item with ID "%d" not found (anymore)', $id), [ @@ -89,9 +89,9 @@ public function getItemBySlug(WP_REST_Request $request) { $slug = $request->get_param('slug'); - $item = (new Item) - ->query(apply_filters('owc/openpub/rest-api/items/query/single', [])) - ->findBySlug($slug); + $item = $this->singleItemQueryBuilder($request); + + $item = $item->findBySlug($slug); if (!$item) { return new WP_Error('no_item_found', sprintf('Item with slug "%d" not found', $slug), [ @@ -104,6 +104,20 @@ public function getItemBySlug(WP_REST_Request $request) return $item; } + public function singleItemQueryBuilder(WP_REST_Request $request): Item + { + $item = (new Item) + ->query(apply_filters('owc/openpub/rest-api/items/query/single', [])); + + $preview = filter_var($request->get_param('preview'), FILTER_VALIDATE_BOOLEAN); + + if (true === $preview) { + $item->query(['post_status' => ['publish', 'draft']]); + } + + return $item; + } + /** * Get related items */ diff --git a/src/Base/Varnish/VarnishServiceProvider.php b/src/Base/Varnish/VarnishServiceProvider.php new file mode 100644 index 0000000..83c457c --- /dev/null +++ b/src/Base/Varnish/VarnishServiceProvider.php @@ -0,0 +1,33 @@ +plugin->loader->addAction('save_post', $this, 'purgeVarnishCache', 10, 2); + } + + public function purgeVarnishCache(int $postID, \WP_Post $post): void + { + if ( ! function_exists('curl_init')){ + return; + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1/.*'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PURGE'); + + $headers = []; + $headers[] = 'Host: '. \parse_url(get_site_url(), PHP_URL_HOST); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + + curl_exec($ch); + curl_close($ch); + } +}