PHP κώδικας
Καθώς εδώ δεν έχουμε κάτι πολύ διαφορετικό από τα αρχιτεκτονικά project, προσθέτουμε τις παρακάτω μεθόδους στην κλάση VisualizationProject, στο αρχείο src/VisualizationProject.php:
public static function RegisterProjectMeta() { register_post_meta( 'dh_at_3dvizproj', 'dh_project_info', array( 'single' => true, 'type' => 'object', 'show_in_rest' => array( 'schema' => array( 'type' => 'object', 'properties' => array( 'location' => array( 'type' => 'string', ), 'year' => array( 'type' => 'string', 'minLength' => 4, 'maxLength' => 4, 'pattern' => '[0-9]{4}', ), 'client' => array( 'type' => 'string', ), ), ), ), 'auth_callback' => function() { return current_user_can('edit_visualization_projects'); }, ) ); } public static function RegisterProjectMetaBlock() { register_block_type( __DIR__ . DIRECTORY_SEPARATOR . 'vizmeta-info-block', array( 'render_callback' => function($attributes) { return VisualizationProject::MetaBlockFrontEndTemplatePartHTML($attributes); }, ) ); } public static function MetaBlockFrontEndTemplatePartHTML($attributes) { $wrapper_attributes = get_block_wrapper_attributes(); if ( ! empty($attributes['vizprojectId'])) { $id = $attributes['vizprojectId']; } else { $id = get_the_ID(); } $metadata = get_post_meta( $id, 'dh_project_info', true ); ob_start(); ?> <div <?php echo esc_attr($wrapper_attributes); ?>> <table style="border-collapse: collapse"> <thead> <th style="padding:0 2em;border: 1px solid grey">Location</th> <th style="padding:0 2em;border: 1px solid grey">Year</th> <th style="padding:0 2em;border: 1px solid grey">Client</th> </thead> <tbody> <td style="padding:0 2em;border: 1px solid grey"><?php echo esc_html( $metadata['location'] ); ?></td> <td style="padding:0 2em;border: 1px solid grey"><?php echo esc_html( $metadata['year'] ); ?></td> <td style="padding:0 2em;border: 1px solid grey"><?php echo esc_html( $metadata['client'] ); ?></td> </table> </div> <?php return ob_get_clean(); }
block.json
Δημιουργούμε το φάκελο src/vizmeta-info-block και το αρχείο src/vizmeta-info-block/block.json που περιέχει τα εξής:
{ "$schema": "https://json.schemastore.org/block.json", "apiVersion": 2, "name": "dh-architect-plugin/vizmeta-info-block", "version": "1.0.0", "title": "Visualization Project Information", "category": "dh-architect", "icon": "smiley", "description": "An example block viewing and saving post meta", "attributes": { "vizprojectId": { "type": "string" } }, "supports": { "html": false, "multiple": true, "align": true }, "textdomain": "dh-architect-plugin", "editorScript": "file:../../build/editor.js", "viewScript": "file:../../build/index.js" }
JavaScript κώδικας
Δημιουργούμε το αρχείο src/vizmeta-info-block/editor.js με τον παρακάτω κώδικα:
import { registerBlockType } from '@wordpress/blocks'; import { useBlockProps } from '@wordpress/block-editor'; import { useSelect } from '@wordpress/data'; import { useEntityProp } from '@wordpress/core-data'; import { TextControl } from '@wordpress/components'; registerBlockType('dh-architect-plugin/vizmeta-info-block', { edit: ( props ) => { const blockProps = useBlockProps(); const postType = useSelect( ( select ) => select( 'core/editor' ).getCurrentPostType(), [] ); if ( postType === 'dh_at_3dvizproj' ) { const currentPost = useSelect( ( select ) => select( 'core/editor' ).getCurrentPost(), [] ); const currentPostId = currentPost['id']; const [ meta, setMeta ] = useEntityProp( 'postType', postType, 'meta', currentPostId ); const myMeta = meta['dh_project_info']; const updateMetaLocation = (newLocation) => { const newMeta = Object.assign({...meta['dh_project_info']}, {location: newLocation.toString()}); setMeta( { ...meta, dh_project_info: newMeta } ); }; const updateMetaYear = (newYear) => { const newMeta = Object.assign({...meta['dh_project_info']}, {year: newYear.toString()}); setMeta( { ...meta, dh_project_info: newMeta } ); }; const updateMetaClient = (newClient) => { const newMeta = Object.assign({...meta['dh_project_info']}, {client: newClient.toString()}); setMeta( { ...meta, dh_project_info: newMeta } ); }; return ( <div { ...blockProps }> <TextControl label="Location" value={ ( myMeta && myMeta.location ) ? myMeta.location : "" } onChange={ updateMetaLocation } /> <TextControl label="Year" value={ ( myMeta && myMeta.year ) ? myMeta.year : "" } onChange={ updateMetaYear } /> <TextControl label="Client" value={ ( myMeta && myMeta.client ) ? myMeta.client : "" } onChange={ updateMetaClient } /> </div> ) } else { const allVisualizationProjects = useSelect( select => { return select('core').getEntityRecords('postType', 'dh_at_3dvizproj', {per_page: -1}) }) if ( ! allVisualizationProjects ) { return <div>Loading visualization projects... Please wait.</div> } else { return ( <div { ...blockProps }> <select onChange = { event => props.setAttributes({vizprojectId: event.target.value}) }> <option value="">Select a visualization project</option> { allVisualizationProjects.map( vizproj => { return ( <option value={vizproj.id} selected = {props.attributes.vizprojectId == vizproj.id}> {vizproj.title.rendered} </option> ) })} </select> </div> ) } } }, save: () => { return null; } });
και προσθέτουμε την ακόλουθη γραμμή στο αρχείο src/editor.js για να συμπεριλάβουμε τον κώδικά του κατά την μεταγλώτιση του κώδικα του plugin.
import './vizmeta-info-block/editor.js';
Block registration
Πρέπει επίσης να προσθέσουμε τις ακόλουθες γραμμές κώδικα στο τέλος του αρχείου dh-architect-plugin.php για να καταχωρήσουμε τα metadata και τα block μέσω των οποίων χειριζόμαστε τα metadata για το VisualizationProject CPT:
/* Register the project_info metadata for VisualizationProject CPT */ add_action( 'init', ['DasodaHae\Architect\VisualizationProject', 'RegisterProjectMeta'] ); /* Register the Visualization Project Info Block */ add_action( 'init', ['DasodaHae\Architect\VisualizationProject', 'RegisterProjectMetaBlock'] );