Skip to content

Commit

Permalink
post-excerpt block
Browse files Browse the repository at this point in the history
  • Loading branch information
mogmarsh committed Nov 30, 2023
1 parent 209cc89 commit 90b2fb0
Show file tree
Hide file tree
Showing 7 changed files with 200 additions and 0 deletions.
28 changes: 28 additions & 0 deletions blocks/post-excerpt/block.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 2,
"name": "wp-newsletter-builder/post-excerpt",
"version": "0.1.0",
"title": "Newsletter Post Excerpt",
"category": "design",
"icon": "admin-post",
"description": "Displays a post excerpt",
"textdomain": "wp-newsletter-builder",
"editorScript": "file:index.ts",
"editorStyle": "file:index.css",
"style": [
"file:style-index.css"
],
"render": "file:render.php",
"attributes": {
"overrideExcerpt": {
"type": "string",
"default": ""
},
"smallerFont": {
"type": "boolean",
"default": false
}
},
"usesContext": ["postId"]
}
55 changes: 55 additions & 0 deletions blocks/post-excerpt/edit.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* eslint-disable camelcase */
import { usePostById } from '@alleyinteractive/block-editor-tools';
import { __ } from '@wordpress/i18n';
import { RichText } from '@wordpress/block-editor';
import { useBlockProps } from '@wordpress/block-editor';
import { WP_REST_API_Post } from 'wp-types';

import './index.scss';

interface EditProps {
attributes: {
overrideExcerpt?: string;
smallerFont?: boolean;
};
context: {
postId: number;
};
setAttributes: (attributes: {}) => void;
}

/**
* The edit function describes the structure of your block in the context of the
* editor. This represents what the editor will render when the block is used.
*
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit
*
* @return {WPElement} Element to render.
*/
export default function Edit({
attributes: {
overrideExcerpt,
},
context: {
postId,
},
setAttributes,
}: EditProps) {
// @ts-ignore
const record: WP_REST_API_Post = usePostById(postId) ?? null;

let postExcerpt = record ? record.excerpt.rendered : __('This block will display the excerpt.', 'wp-newsletter-builder');

postExcerpt = overrideExcerpt || postExcerpt;

return (
<div {...useBlockProps({className: 'post__dek' })}>
<RichText
value={postExcerpt}
tagName="p"
multiline={false}
onChange={(value) => setAttributes({ overrideExcerpt: value })}
/>
</div>
);
}
21 changes: 21 additions & 0 deletions blocks/post-excerpt/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php
/**
* Block Name: Post.
*
* @package wp-newsletter-builder
*/

/**
* Registers the block using the metadata loaded from the `block.json` file.
* Behind the scenes, it registers also all assets so they can be enqueued
* through the block editor in the corresponding context.
*
* @see https://developer.wordpress.org/reference/functions/register_block_type/
*/
function wp_newsletter_builder_post_excerpt_block_init() {
// Register the block by passing the location of block.json.
register_block_type(
__DIR__
);
}
add_action( 'init', 'wp_newsletter_builder_post_excerpt_block_init' );
9 changes: 9 additions & 0 deletions blocks/post-excerpt/index.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* The following styles get applied inside the editor only.
*
* All imported CSS files are bundled into one chunk named after the entry point,
* which defaults to index.js, and thus the file created becomes index.css.
* This is for styles used only in the editor.
*
* Replace them with your own styles or remove the file completely.
*/
36 changes: 36 additions & 0 deletions blocks/post-excerpt/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Registers a new block provided a unique name and an object defining its behavior.
*
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
*/
import { registerBlockType } from '@wordpress/blocks';

/**
* Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files.
* All files containing `style` keyword are bundled together. The code used
* gets applied both to the front of your site and to the editor.
*
* @see https://www.npmjs.com/package/@wordpress/scripts#using-css
*/
import './style.scss';

/**
* Internal dependencies
*/
import edit from './edit';
import metadata from './block.json';

/**
* Every block starts by registering a new block type definition.
*
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
*/
registerBlockType(
/* @ts-expect-error Provided types are inaccurate to the actual plugin API. */
metadata,
{
apiVersion: 2,
edit,
title: metadata.title,
},
);
23 changes: 23 additions & 0 deletions blocks/post-excerpt/render.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php
/**
* All of the parameters passed to the function where this file is being required are accessible in this scope:
*
* @param array $attributes The array of attributes for this block.
* @param string $content Rendered block output. ie. <InnerBlocks.Content />.
* @param WP_Block $block The instance of the WP_Block class that represents the block being rendered.
*
* @package wp-newsletter-builder
*/

$wp_newsletter_builder_block_post = $block->context['postId'] ?? null;

$wp_newsletter_builder_block_post = get_post( $wp_newsletter_builder_block_post );
if ( empty( $wp_newsletter_builder_block_post ) || ! $wp_newsletter_builder_block_post ) {
return;
}
$wp_newsletter_builder_excerpt = ! empty( $attributes['overrideExcerpt'] ) ? $attributes['overrideExcerpt'] : get_the_excerpt( $wp_newsletter_builder_block_post );

?>
<div <?php echo wp_kses_data( get_block_wrapper_attributes( [ 'class' => 'post__dek' ] ) ); ?>>
<p><?php echo wp_kses_post( $wp_newsletter_builder_excerpt ); ?></p>
</div>
28 changes: 28 additions & 0 deletions blocks/post-excerpt/style.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* The following styles get applied both on the front of your site
* and in the editor.
*
* Imported style.css file(s) (applies to SASS and SCSS extensions)
* get bundled into one style-index.css file that is meant to be
* used both on the front-end and in the editor.
*
* Replace them with your own styles or remove the file completely.
*
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#block-styles
*/

a.post__title-link {
color: #000;
display: block;
margin: 20px auto;
text-decoration: none;

h2 {
margin-bottom: 0;
text-align: center;

&.post__title--small {
font-size: 24px;
}
}
}

0 comments on commit 90b2fb0

Please sign in to comment.