1

It's a common practice to use the post_parent property in the WP_Post class to create 1-to-n relationships between different custom post types.

In an plugin I'm developing, I added a SelectControl to the PluginDocumentSettingPanel to be able to set the id of a related custom post type in another custom post type. According to the docs, I should use getEditedPostAttribute to retrieve the current "parent" (the id of the related custom post type) of the custom post type being edited:

select( 'core/editor' ).getEditedPostAttribute( 'parent' )

But, for some reason, I'm getting an undefined value even though the post_parent property is set. A custom meta box in the classic editor shows it correctly.

If I set the hierarchical property in the custom post type to true, the selector works and I get the correct value. Is this by design? Or are we forced to use a custom meta field to store this data, now?

1 Answer 1

1

You are already using the correct Gutenberg/JS code, but it's a limitation in the REST API which exposes the parent field only for hierarchical post types like page. But you can force the field to appear in the REST API responses via register_rest_field() — example for a my_cpt post type:

register_rest_field( 'my_cpt', 'parent', array(
    'schema' => array(
        'description' => __( 'The ID for the parent of the post.' ),
        'type'        => 'integer',
        'context'     => array( 'view', 'edit' ),
    ),
) );

Alternatively, you can use the rest_prepare_<post type> hook to just add the parent in the response:

add_filter( 'rest_prepare_my_cpt', function ( $response, $post ) {
    $data = $response->get_data();
    $data['parent'] = $post->post_parent;
    $response->set_data( $data );

    return $response;
}, 10, 2 );

But if you want to allow editing the parent via the REST API, then the first option is preferred.

2
  • 1
    Using your first method, it works, but a notice is thrown too: PHP Notice: WP_REST_Posts_Controller::get_item_schema was called incorrectly. Please use register_rest_field to add new schema properties. Please see <a href="wordpress.org/support/article/debugging-in-wordpress/… in WordPress</a> for more information. (This message was added in version 5.4.0.)
    – leemon
    Commented Jul 3, 2020 at 11:46
  • 1
    Hi. Sorry about that.. :p I've updated the code.
    – Sally CJ
    Commented Jul 3, 2020 at 13:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.