it-swarm.com.de

Gutenberg wie Attribut zu machen, um zu Meta zu speichern

Ich spiele mit Gutenberg und bin ein bisschen verwirrt darüber, wie es auf Meta speichern soll. Hier ist meine benutzerdefinierte Post und Meta:

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'
    ] );
} );

Und meine Block JS-Datei:

( 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,
);

Ich habe die Idee aus WP Gutenberg Handbook übernommen. Das Attribut wird erstellt, aber die Werte sind leer und das Metafeld wird nicht gespeichert. Die Funktion zum Bearbeiten der Konsolenanmeldung gibt immer null zurück, da kein Metaattribut vorhanden ist. Was mache ich falsch? Wenn ich die Attributquelle in attribute ändere, wird das Feld ordnungsgemäß gespeichert.

4
Gasim

Der Metawert wird beim Laden des Blocks gelesen und dem Blockattribut zugewiesen. Änderungen am Block aktualisieren das Attribut und wenn der Beitrag gespeichert wird, wird der Wert im Meta gespeichert. Soweit ich verstanden habe, muss in der Funktion registerBlockType js eigentlich nichts gespeichert werden. Der Block speichert nur im Meta, so dass im Frontend nichts gerendert wird (im Gegensatz zu Nicht-Meta-Blöcken).

Also in deinem Fall:

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'
    ] );
} );

Beachten Sie, dass ich register_post_meta verwendet habe, der in Version 4.9.8 enthalten war und die Verwendung des Post-Typ-Namens (in diesem Fall "game") ermöglicht. Wie @LABCAT in der anderen Antwort mit register_meta bemerkt hat, muss der Typ auch für benutzerdefinierte Beitragstypen "post" sein.

Dann in der JavaScript-Datei:

registerBlockType( 'game-post/meta', {
    //...
    save: () => null,
});

Ich hoffe das hilft.

1
Alvaro

Ich versuche auch zu lernen, wie man das macht. Sie haben Ihren Meta-Wert falsch registriert. Es sollte sein:

register_meta( 'post', 'logo', [
    'single' => true,
    'show_in_rest' => true,
    'description'  => 'A meta key associated with a string meta value.',
    'type' => 'string'
] );

Die Dokumentation zum Parameter $ object_type finden Sie hier: https://codex.wordpress.org/Function_Reference/register_meta

Ich glaube nicht, dass Ihr JS-Code funktioniert.

0
LABCAT