私はグーテンベルクと遊んでいます、そしてそれがどのようにメタに保存するべきかについて少し混乱しています。これが私のカスタム投稿とメタです。
add_action( 'init', function() {
register_post_type( 'game', [
'label' => 'Games',
'public' => true,
'supports' => [ 'editor', 'custom-fields' ],
'show_in_rest' => true,
] );
register_meta( 'game', 'logo', [
'single' => true,
'show_in_rest' => true,
'description' => 'A meta key associated with a string meta value.',
'type' => 'string'
] );
} );
そして私のBlock JSファイル:
( function( blocks, i18n, element ) {
var el = element.createElement;
var MediaUploadButton = wp.blocks.MediaUploadButton;
var BlockControls = wp.blocks.BlockControls;
blocks.registerBlockType( 'game-post/meta', {
title: i18n.__( 'Game' ),
description: i18n.__( 'Meta Box for Game' ),
icon: 'businessman',
category: 'common',
attributes: {
logo: {
type: 'string',
source: 'meta',
meta: 'logo'
}
},
edit: function(props) {
console.log(props.attributes);
var mediaURL = props.attributes.logo;
return el('div', {
classname: mediaURL ? 'image-active' : 'image-inactive'
}, el('input', {
defaultValue: mediaURL,
type: 'text',
onChange: function(e) {
props.setAttributes({ logo: e.target.value });
}
}));
},
save: function(props) {
return el( 'img', { src: props.attributes.logo } );
}
} );
} )(
window.wp.blocks,
window.wp.i18n,
window.wp.element,
);
私は WP Gutenberg Handbook からソースのアイデアを取りました。属性は作成されますが、値は空で、メタフィールドは保存されません。また、メタログイン属性がないため、コンソールログイン編集機能では常にnullが返されます。何がおかしいのですか?属性のソースをattribute
に変更すると、フィールドは正しく保存されます。
メタ値は、ブロックが読み込まれてブロック属性に割り当てられたときに読み取られます。ブロックを変更すると属性が更新され、投稿を保存するときに値がメタに保存されます。したがって、私が理解している限りでは、registerBlockType
js関数に実際に何かを保存する必要はありません。ブロックはメタに保存されるだけなので、フロントエンドでは何もレンダリングされません(非メタブロックとは異なり)。
だからあなたの場合:
add_action( 'init', function() {
register_post_type( 'game', [
'label' => 'Games',
'public' => true,
'supports' => [ 'editor', 'custom-fields' ],
'show_in_rest' => true,
] );
register_post_meta( 'game', 'logo', [
'single' => true,
'show_in_rest' => true,
'description' => 'A meta key associated with a string meta value.',
'type' => 'string'
] );
} );
バージョン4.9.8に含まれていて、ポストタイプ名(この場合は "game")を使用できるregister_post_meta
を使用したことに注意してください。 @LABCATがregister_meta
を使った他の答えで気づいたように、カスタム投稿タイプであってもタイプが "投稿"であることを必要とします。
それからJavaScriptファイルで:
registerBlockType( 'game-post/meta', {
//...
save: () => null,
});
これが役に立つことを願っています。
私もこれを行う方法を学ぼうとしています。あなたはあなたのメタ値を誤って登録しました。
register_meta( 'post', 'logo', [
'single' => true,
'show_in_rest' => true,
'description' => 'A meta key associated with a string meta value.',
'type' => 'string'
] );
ここで$ object_typeパラメータのドキュメントを参照してください。 https://codex.wordpress.org/Function_Reference/register_meta
私のJSコードがうまくいくとは思わない。