diff --git a/frontend/components/PageWrapper.js b/frontend/components/PageWrapper.js index 2867de9e..f4447140 100644 --- a/frontend/components/PageWrapper.js +++ b/frontend/components/PageWrapper.js @@ -12,12 +12,12 @@ const PageWrapper = Comp => static async getInitialProps(args) { const [headerMenu, childProps] = await Promise.all([ wp.menus().id('header-menu'), - Comp.getInitialProps(args), + Comp.getInitialProps ? Comp.getInitialProps(args) : {}, ]); return { headerMenu, - ...(Comp.getInitialProps ? childProps : null), + ...childProps, }; } diff --git a/frontend/pages/post.js b/frontend/pages/post.js index d8168bac..da5c8107 100644 --- a/frontend/pages/post.js +++ b/frontend/pages/post.js @@ -37,7 +37,9 @@ class Post extends Component { render() { const { post, headerMenu } = this.props; - if (!post.title) return ; + if (!post.title) { + return ; + } return ( diff --git a/frontend/pages/preview.js b/frontend/pages/preview.js index e31188c9..f4aba9e4 100644 --- a/frontend/pages/preview.js +++ b/frontend/pages/preview.js @@ -16,9 +16,9 @@ class Preview extends Component { componentDidMount() { const { url } = this.props; - const { id, wpnonce } = url.query; + const { id, rev, type, wpnonce } = url.query; fetch( - `${Config.apiUrl}/wp/v2/posts/${id}?_wpnonce=${wpnonce}`, + `${Config.apiUrl}/wp/v2/${type}s/${id}/revisions/${rev}?_wpnonce=${wpnonce}`, { credentials: 'include' }, // required for cookie nonce auth ) .then(res => res.json()) @@ -32,8 +32,10 @@ class Preview extends Component { render() { const { headerMenu } = this.props; const { post } = this.state; - if (post && post.code && post.code === 'rest_cookie_invalid_nonce') { - return ; + const { data } = post || {}; + + if (data && data.status && data.status >= 400) { + return ; } return ( diff --git a/frontend/server.js b/frontend/server.js index ffc34420..82ccb007 100644 --- a/frontend/server.js +++ b/frontend/server.js @@ -28,9 +28,10 @@ app app.render(req, res, actualPage, queryParams); }); - server.get('/_preview/:id/:wpnonce', (req, res) => { + server.get('/_preview/:id/:rev/:type/:wpnonce', (req, res) => { const actualPage = '/preview'; - const queryParams = { id: req.params.id, wpnonce: req.params.wpnonce }; + const { id, rev, type, wpnonce } = req.params; + const queryParams = { id, rev, type, wpnonce }; app.render(req, res, actualPage, queryParams); }); diff --git a/wordpress/wp-content/themes/postlight-headless-wp/inc/admin.php b/wordpress/wp-content/themes/postlight-headless-wp/inc/admin.php index dd41d065..c7e69adf 100644 --- a/wordpress/wp-content/themes/postlight-headless-wp/inc/admin.php +++ b/wordpress/wp-content/themes/postlight-headless-wp/inc/admin.php @@ -28,10 +28,18 @@ function taxonomy_checklist_checked_ontop_filter( $args ) { * @return str The headless WordPress preview link. */ function set_headless_preview_link( $link ) { - return get_frontend_origin() . '/' - . '_preview/' - . get_the_ID() . '/' - . wp_create_nonce( 'wp_rest' ); + $post = get_post( $post ); + if ( ! $post ) { + return $link; + } + + $frontend = get_frontend_origin(); + $parent_id = $post->post_parent; + $revision_id = $post->ID; + $type = get_post_type($parent_id); + $nonce = wp_create_nonce( 'wp_rest' ); + + return "$frontend/_preview/$parent_id/$revision_id/$type/$nonce"; } add_filter( 'preview_post_link', 'set_headless_preview_link' );