Skip to content

Commit

Permalink
Extract meta custom sources to a separate file
Browse files Browse the repository at this point in the history
  • Loading branch information
youknowriad committed Jun 12, 2023
1 parent dd59572 commit 987a544
Show file tree
Hide file tree
Showing 6 changed files with 253 additions and 206 deletions.
29 changes: 4 additions & 25 deletions gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,12 @@ function gutenberg_pre_init() {
* @param string $block_instance The block instance.
*/
function render_custom_sources( $block_content, $block, $block_instance ) {
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
$meta_custom_source = require __DIR__ . '/lib/custom-sources/meta.php';
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
if ( null === $block_type ) {
return $block_content;
}


$custom_sources = _wp_array_get( $block_type->supports, 'customSources', false );
if ( ! $custom_sources ) {
// TODO: for some reason the "customSources" support is not being registered as it should.
Expand All @@ -95,31 +95,10 @@ function render_custom_sources( $block_content, $block, $block_instance ) {
$attribute_sources = _wp_array_get( $block['attrs'], array( 'source' ), array() );
foreach ( $attribute_sources as $attribute_name => $attribute_source ) {
$attribute_config = _wp_array_get( $block_type->attributes, array( $attribute_name ), false );
if ( ! $attribute_config || ! $attribute_source || 'meta' !== $attribute_source['type'] ) {
continue;
}
$meta_field = $attribute_source['name'];
$meta_value = get_post_meta( $block_instance->context['postId'], $meta_field, true );
$p = new WP_HTML_Tag_Processor( $block_content );
$found = $p->next_tag(
array(
// TODO: build the query from CSS selector.
'tag_name' => $attribute_config['selector'],
)
);
if ( ! $found ) {
if ( ! $attribute_config || ! $attribute_source || $meta_custom_source['name'] !== $attribute_source['type'] ) {
continue;
}
$tag_name = $p->get_tag();
$markup = "<$tag_name>$meta_value</$tag_name>";
$p2 = new WP_HTML_Tag_Processor( $markup );
$p2->next_tag();
$names = $p->get_attribute_names_with_prefix( '' );
foreach ( $names as $name ) {
$p2->set_attribute( $name, $p->get_attribute( $name ) );
}

$block_content = $p2 . '';
$block_content = $meta_custom_source['apply_source']( $block_type, $block_content, $block_instance, $attribute_source, $attribute_config );
}

return $block_content;
Expand Down
34 changes: 34 additions & 0 deletions lib/custom-sources/meta.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
/**
* Meta Custom Source
*
* @package gutenberg
*/

return array(
'name' => 'meta',
'apply_source' => function ( $block_type, $block_content, $block_instance, $attribute_source, $attribute_config ) {
$meta_field = $attribute_source['name'];
$meta_value = get_post_meta( $block_instance->context['postId'], $meta_field, true );
$p = new WP_HTML_Tag_Processor( $block_content );
$found = $p->next_tag(
array(
// TODO: build the query from CSS selector.
'tag_name' => $attribute_config['selector'],
)
);
if ( ! $found ) {
return $block_content;
}
$tag_name = $p->get_tag();
$markup = "<$tag_name>$meta_value</$tag_name>";
$p2 = new WP_HTML_Tag_Processor( $markup );
$p2->next_tag();
$names = $p->get_attribute_names_with_prefix( '' );
foreach ( $names as $name ) {
$p2->set_attribute( $name, $p->get_attribute( $name ) );
}

return $p2 . '';
},
);
110 changes: 110 additions & 0 deletions packages/editor/src/attributes-custom-sources/meta.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/**
* WordPress dependencies
*/
import { getBlockType } from '@wordpress/blocks';
import { useEntityProp } from '@wordpress/core-data';
import { useMemo, useCallback } from '@wordpress/element';

export default {
name: 'meta',

useSource( {
name,
context: { postType, postId },
attributes,
setAttributes,
} ) {
const [ meta, setMeta ] = useEntityProp(
'postType',
postType,
'meta',
postId
);

const blockType = getBlockType( name );

const attributesWithSourcedAttributes = useMemo( () => {
if ( ! blockType.supports?.customSources ) {
return attributes;
}
return {
...attributes,
...Object.fromEntries(
Object.keys( blockType.supports.customSources ).map(
( attributeName ) => {
if (
attributes.source?.[ attributeName ]?.type ===
'meta'
) {
return [
attributeName,
meta?.[
attributes.source?.[ attributeName ]
?.name
],
];
}
return [
attributeName,
attributes[ attributeName ],
];
}
)
),
};
}, [ blockType.supports?.customSources, attributes, meta ] );

const updatedSetAttributes = useCallback(
( nextAttributes ) => {
const nextMeta = Object.fromEntries(
Object.entries( nextAttributes ?? {} )
.filter(
// Filter to intersection of keys between the updated
// attributes and those with an associated meta key.
( [ key ] ) =>
blockType.supports?.customSources &&
key in blockType.supports?.customSources &&
attributes.source?.[ key ]?.type === 'meta'
)
.map( ( [ attributeKey, value ] ) => [
// Rename the keys to the expected meta key name.
attributes.source?.[ attributeKey ]?.name,
value,
] )
);

const updatedAttributes = Object.entries( nextMeta ).length
? Object.fromEntries(
Object.entries( nextAttributes ).filter(
( [ key ] ) =>
! (
blockType.supports?.customSources &&
key in
blockType.supports?.customSources &&
attributes.source?.[ key ]?.type ===
'meta'
)
)
)
: nextAttributes;

if ( Object.entries( nextMeta ).length ) {
setMeta( nextMeta );
}

setAttributes( updatedAttributes );
},
[
setAttributes,
attributes.source,
blockType.supports?.customSources,
setMeta,
]
);

return {
setAttributes: updatedSetAttributes,
attributes: attributesWithSourcedAttributes,
};
},
};
180 changes: 0 additions & 180 deletions packages/editor/src/hooks/custom-sources-v2.js

This file was deleted.

Loading

0 comments on commit 987a544

Please sign in to comment.