När du registrerar och lagrar attribut i WordPress block editor (Gutenberg) har du möjlighet att lagra dem som postmeta istället för de vanliga blockattributen.
Med den här metoden kan du ha en inställning i ditt block som kan styra något inläggsbrett eller på mallen.
En viktig anmärkning om rendering av inläggsmetaattribut
Du kan inte rendera inläggsmetaattribut med en JavaScript-sparmetod. Ett beslut togs av Gutenberg-teamet för att förhindra detta, eftersom block som renderar post-metafält lätt kan brytas på grund av att post-meta ändras någon annanstans på posten.
I den här guiden kommer vi att utöka vad vi redan har byggt i vår WordPress Gutenberg plugin guide, och även Dynamic Block guiden.
Förutsättningar
- Var bekant med att skapa plugins för WordPress Gutenberg
- Var bekant med dynamiska block och rendering på serversidan
Registrera Post Meta i PHP
Innan vi kan använda ett postmetafält i JavaScript måste vi se till att vi har registrerat det i PHP med register_metaoch att show_in_restargumentet har satts till sant.
Följ upp guiden för Dynamic Block, öppna root-PHP-filen för plugin-programmet (i det här fallet wholesome-plugin.php) och lägg till följande kod längst ner i filen efter alla andra funktioner:
function wholesomecode_wholesome_plugin_register_post_meta() {
register_meta(
'post',
'_wholesomecode_wholesome_plugin_block_text',
[
'auth_callback' => '__return_true',
'default' => __( 'Wholesome Plugin – hello from the editor!', 'wholesome-plugin' ),
'show_in_rest' => true,
'single' => true,
'type' => 'string',
]
);
}
add_action( 'init', 'wholesomecode_wholesome_plugin_register_post_meta' );
Denna kod registrerar ett metafält som kallas _wholesomecode_wholesome_plugin_block_textför postposttypen. Det säkerställer också att REST API kan komma åt detta metafält med show_in_restvärdet satt till sant.
Vi skickar också funktionen __return_truetill auth_callbackargumentet för att säkerställa att vi har behörighet att komma åt den här parametern. Om vi ville ha bättre säkerhet för denna parameter skulle vi ändra detta till en anpassad funktion som kontrollerar en viss användarroll.
Registrera inläggets metaattribut i JavaScript
Återigen, efter den föregående guiden, öppna upp /src/index.jsoch ersätt attributesmed följande:
attributes: {
blockText: {
meta: '_wholesomecode_wholesome_plugin_block_text',
source: 'meta',
},
},
Istället för att ange typen av attribut och tilldela ett standardvärde, definierar vi istället meta-nyckeln som dataattributet kommer ifrån och indikerar att sourceattributet är meta.
Som anges i varningen högst upp i den här guiden kan du inte komma åt postmetafältattribut via JavaScript- savemetoden, så kompilera pluginet med npm startoch låt oss se hur vi kan mata ut metan.
Rendering av Post Meta
Eftersom vi har sparat vårt attribut som post-meta, kan vi mata ut detta var som helst i WordPress med hjälp av get_post_meta(förutsatt att vi har $post_id):
get_post_meta( $post_id, '_wholesomecode_wholesome_plugin_block_text', true );
Om vi fortsätter med Dynamic Block-guiden, låt oss se hur vi kan komma åt detta attribut på serversidan i PHP.
Meta är inte tillgänglig via $attributesparametern för render_callback, eftersom post-metaattribut inte överför sitt värde till denna parameter, men vi kan komma åt det globala $postobjektet för att få post-ID.
Med detta i åtanke, låt oss uppdatera vår register_block_typeför att skicka inläggets meta:
register_block_type(
'wholesomecode/wholesome-plugin',
array(
'editor_script' => 'wholesomecode-wholesome-plugin-block-editor',
'editor_style' => 'wholesomecode-wholesome-plugin-block-editor',
'render_callback' => function( $attributes, $content) {
global $post;
$block_text = get_post_meta( $post->ID, '_wholesomecode_wholesome_plugin_block_text', true );
return "<p class='wp-block-wholesomecode-wholesome-plugin'>$block_text</p>";
},
'style' => 'wholesomecode-wholesome-plugin-block',) );
Observera att vi inte längre behöver registrera attributeshär, eftersom vi endast kommer åt postmetafältet via get_post_metafunktionen.
Använda blocket
Detta är inte det bästa användningsfallet för den här typen av meta, men när vi använder blocket kan vi se att eftersom vi lagrar attributen som post-meta, om vi uppdaterar attributet i ett block, uppdaterar det alla block, som inläggets meta lagras mot inlägget, inte det enskilda blocket:
Post-metaattribut i aktion
- Ta en titt på att skapa kapslade underordnade block med
InnerBlockskomponenten - Ta ytterligare användning av post-meta i Gutenberg genom att skapa anpassade metaboxar i Gutenberg
- Ta en titt på hur du använder inställningar för att lagra data i alternativtabellen i Gutenberg