6

Storing metadata for custom post types is easy, you just need to add an action for 'save_post' with your method that handles this. In which you have then something like the following for a field that you want to store (with the usual security checks of course):

update_post_meta( $post_id, '_description', $_POST['_description'] );

Simple enough. However, I cannot figure out what I need to do so that WordPress stores revisions for a custom post.

I have revisions enabled for the custom post type and revisions work for standard fields like 'title'. But it doesn't work by default for metadata.

I've looked for how other people do this and almost all give the following code snippet:

function my_plugin_save_post( $post_id, $post ) {

    if ( $parent_id = wp_is_post_revision( $post_id ) ) {

        $parent  = get_post( $parent_id );
        $my_meta = get_post_meta( $parent->ID, 'my_meta', true );

        if ( false !== $my_meta )
              add_metadata( 'my_custom_post', $post_id, 'my_meta', $my_meta );
    }

} add_action( 'save_post', 'my_plugin_save_post' );

But this doesn't work for me. I don't see a new revision in the revision listing when I change one of the metadata fields. I do see a new revision when I change for example the title of the custom post.

I'm either not familiar with some detail(s) of how this should be done compared to how I usually store metadata (either due to unfamiliarity with this part of the API or data structures). Or I'm missing something due to this cold that I have.

Has anyone a good example of what you need to do to store revisions for custom post metadata?

1

There's a private filter you can (but shouldn't) access:

Defined in wp-includes/revision.php:

/**
 * Filter the list of fields saved in post revisions.
 *
 * Included by default: 'post_title', 'post_content' and 'post_excerpt'.
 *
 * Disallowed fields: 'ID', 'post_name', 'post_parent', 'post_date',
 * 'post_date_gmt', 'post_status', 'post_type', 'comment_count',
 * and 'post_author'.
 *
 * @since 2.6.0
 * @since 4.5.0 The `$post` parameter was added.
 *
 * @param array $fields List of fields to revision. Contains 'post_title',
 *                      'post_content', and 'post_excerpt' by default.
 * @param array $post   A post array being processed for insertion as a post revision.
 */
$fields = apply_filters( '_wp_post_revision_fields', $fields, $post );

So you could write a function like

add_filter( '_wp_post_revision_fields', 'add_my_own_fields', 10, 2 );

function add_my_own_fields( $fields, $post ) {
    $fields['meta_field'] = 'Meta Field';
}

Where meta_field is the key for your meta that you want revisioned and 'Meta Field' is what displays as the heading in the revisions UI.

Please note that this is private and it's use is not intended for theme or plugin developers. More elaborate solutions would be needed to avoid this problem, and you may be better off with a plugin that can handle those problems as well.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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