wp.data.select(‘core’).getPostType(‘post-type’) gibt undefiniert in Gutenberg zurück

Lesezeit: 3 Minuten

Ich baue ein WordPress-Plugin, das darauf angewiesen ist, dass benutzerdefinierte Felder aktiviert werden, wenn ein benutzerdefinierter Beitragstyp registriert wird. Ich möchte prüfen, ob die custom-fields Schlüssel existiert (und ist true) in supports im Beitragstypobjekt. Allerdings, wenn ich anrufe wp.data.select('core').getPostType('post-type')es kehrt zurück undefined. Wenn ich es direkt von der Konsole aus aufrufe, erhalte ich das Post-Typ-Objekt, das ich erwarte, daher bin ich mir nicht sicher, warum es in meinem Code nicht funktioniert.

Ich habe versucht, dies von einigen Orten aus anzurufen.

B. bei der Registrierung des Plugin-Panels:

// Loading `wp.editPosts`, `wp.plugins`, etc. excluded for brevity.

const Component = () => {
    const postType = wp.data.select('core/editor').getCurrentPostType();
    const postTypeObj = wp.data.select('core').getPostType(postType);

    if (postTypeObj.supports.hasOwnProperty('custom-fields')) {
        return (
            <PluginDocumentSettingPanel
                name="my-plugin-name"
                title={ __('My Plugin Title', 'pb') }
            >
                <MyPlugin/>
            </PluginDocumentSettingPanel>
        );
    }

    return;
};

registerPlugin('my-plugin-name', {
    render: Component,
    icon: '',
});

oder innerhalb des Plugins selbst via withSelect:

// Loading `wp.compose`, `wp.data`, etc. excluded for brevity.

class MyPlugin extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            // I'll do something with this later on
            postTypeObj: props.postTypeObj,
        };
    }

    render() {
        return (
            <div></div>
        );
    }
}

export default compose([
    withSelect(select => {
        const {
            getCurrentPostType,
        } = select('core/editor');

        const {
            getPostType,
        } = select('core');

        return {
            postTypeObj: getPostType(getCurrentPostType()),
        }
    }),
])(MyPlugin);

Egal, wo ich es aufrufe, das Post-Typ-Objekt kehrt zurück undefined.

Ich verwende das Gutenberg-Plugin, Version 6.5.0 und WordPress-Version 5.2.3.

Jede Hilfe ist willkommen.

Berufung getCurrentPostType() wird zurückkehren, z post. Möglicherweise müssen Sie es nicht einwickeln getPostType zu. Auch gem https://github.com/WordPress/gutenberg/issues/13555müssen Sie „abonnieren“ (wp.data.subscribe), da dies ein asynchroner Aufruf ist und daher bei der ersten Ausführung null zurückgibt.

Dies ist charakteristisch für alles aus wp.data.select(‘core’) und für Dinge, die darauf aufbauen.

Das Problem ist, dass React einen Ajax-Aufruf durchführt, um die Daten abzurufen. Und wenn die Antwort zurückkommt, wird ein weiteres Rendern ausgelöst. Wenn Sie dies also im Hinterkopf haben, wird Ihr Code erneut ausgeführt (wenn die Antwort eintrifft) und basierend auf der Antwort des Servers, die bis dahin für Sie gespeichert wurde, ein Nicht-Null-Ergebnis erhalten.

Anders ausgedrückt: Anfangs sind die Dinge Lücken, und diese Lücken werden ausgefüllt.

(Dies ist eine Wiederholung wert, also informieren Sie bitte andere über dieses Problem.)

Benutzer-Avatar
snnsnn

Für diejenigen, die diese Funktionalität im Bearbeitungsfenster für benutzerdefinierte Beitragstypen benötigen, gibt es nur wenige Anforderungen.

1. Stellen Sie bei der Registrierung des benutzerdefinierten Beitragstyps sicher show_in_rest ist eingestellt auf true und unterstützt Array Includes editor. Dadurch werden erforderliche Skripts in die Warteschlange gestellt.

Oder Sie können sie wie folgt manuell in die Warteschlange einreihen:

function enable_gutenberg_on_custom_post_types( $hook ) {
    global $current_screen;

    // Load on certain post type
    if ( 'product' !== $current_screen->post_type ) {
        return;
    }

    /**
     * Make the WP Screen object aware that this is a block editor page.
     * Since custom blocks check whether the screen is_block_editor,
     * this is required for custom blocks to be loaded.
     * See wp_enqueue_registered_block_scripts_and_styles in wp-includes/script-loader.php
     */
    $current_screen->is_block_editor( true );

    /**
     * Fires after block assets have been enqueued for the editing interface.
     *
     * Call `add_action` on any hook before 'admin_enqueue_scripts'.
     *
     * In the function call you supply, simply use `wp_enqueue_script` and
     * `wp_enqueue_style` to add your functionality to the block editor.
     *
     * @since 5.0.0
     */
    do_action( 'enqueue_block_editor_assets' );
}
add_action( 'admin_enqueue_scripts', 'enable_gutenberg_on_custom_post_types' );

2. Sie müssen auch andere Skripte einreihen, dh wp-data und wp-edit-posts:

wp_enqueue_script(
    'my-custom-script',
    PLUGIN_URL . 'dist/admin.js',
    array( 'react', 'react-dom', 'wp-data', 'wp-edit-post' ),
    '1.0.0',
    false
);

Dann in Javascript:

window.wp.data.select('core').getEntityRecords( 'postType', 'post' )

Oder mit Haken:

  const posts = window.wp.data.useSelect((select) => {
    return select('core').getEntityRecords('postType', 'product');
  }, []);

1137130cookie-checkwp.data.select(‘core’).getPostType(‘post-type’) gibt undefiniert in Gutenberg zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy