node-wpapi
node-wpapi copied to clipboard
Add a guide for "how to work with meta"
Hi, i tried to update post meta, when i created posts, but nothing happened
It's possible with node-wpapi?
wp.song().create({ title: '1', content: 'Your post content', status: 'publish', meta: {key: 'youtube', value: '12'}, }).then(function( response ) { console.log( response.id ); })
On the WordPress side of things you'll need to set things up so that you can read and post meta. See http://v2.wp-api.org/extending/modifying/#read-and-write-a-post-meta-field-in-post-responses
A better option these days is to use first-party meta support, introduced in 4.6, detailed here in this API status update post and further explained in the README from the pull request for meta handling
@kadamwhite is there some change I have a meta field upvote for my custom post and I have registered using register_meta() , as suggested and when I use a get request , I am getting the meta values like..
"meta": {
"upvote": "4",
"downvote": "0"
}
When I try to update it works via postman if I pass the body as
{ "meta": {
"upvote": "5"
} }
But the node-wpapi does not take this, if I pass it as
{
meta:{
key:'upvote'
value: '4'
}}
It does not update the values.
Merging #286 into this issue; documenting how to work with custom meta is currently our top-priority docs issue
When you create/update post, you pass meta
object, for example:
wpapi.posts().create( {
title: 'Your Title',
content: ' Your content',
status: 'publish',
meta: {
custom_meta_key: 'something'
}
} ).then( function( response ) {
// whatever
} );
On the server side, you must use register_meta()
. If you are using custom post type, the post type must have custom-fields
support (see documentation for $args['supports']
of register_post_type()
. That is documented for REST API.
But if you are using meta
with custom role, your role should also have edit_post_meta
(and delete_post_meta
if you are deleting) capability. See code for WP_REST_Meta_Fields::update_meta_value()
and WP_REST_Meta_Fields::delete_meta_value()
. I haven't seen that this is documented anywhere so I figured it out during debugging.
@dimadin Sorry, but could You be more specific, where exactly on server side I should change something to get meta work?
Messed with the same problem, being total noob in wordpress infrastructure. Solved by putting
register_meta('post', 'duration', [
'type' => 'integer',
'description' => 'duration',
'single' => true,
'show_in_rest' => true,
]);
into functions.php of theme. This unlocked me:
meta: { duration: 123 }
@Calemb @dmdb In WordPress 5.0 note that this will change to register_post_meta( 'post', ...
-- the snippet you have here will register "duration" for all custom post types. (You'd change 'post' to 'my_cpt' if you want duration
to apply to a custom post type). We will be releasing a comprehensive update to our meta handling documentation on the REST API handbook in conjunction with 5.0.
I've been struggling for a few days and finally found how to deal with it.
I added two meta fields to comment meta, which are "likes" and "pin".
To enable POST request from frontend like reactjs, I need to add "likes" and "pin" to REST API.
This is how I add and update data:
Since I am very new to Wordpress and PHP, I spent most of the time finding out why comment meta is not updating through update_comment_meta
. It turns out that I need to access the comment id through $comment_object->comment_ID
not $comment_object->ID
. So, make sure you are familiar with the type you are working on.
function slug_register_comment_meta() {
register_rest_field( 'comment',
'likes',
array(
'get_callback' => 'slug_get_comment_meta',
'update_callback' => 'slug_update_comment_meta',
'schema' => array('likes' => 'The number of likes received in this comment.'),
)
);
register_rest_field( 'comment',
'pin',
array(
'get_callback' => 'slug_get_comment_meta',
'update_callback' => 'slug_update_comment_meta',
'schema' => array('pin' => 'If this comment is pinned or not.'),
)
);
}
function slug_get_comment_meta( $comment_object, $field_name, $request ) {
return get_comment_meta( $comment_object['id'], $field_name , true );
}
function slug_update_comment_meta( $value, $comment_object, $field_name ) {
return update_comment_meta( $comment_object->comment_ID, $field_name, wp_slash( $value ) );
}
add_action( 'rest_api_init', 'slug_register_comment_meta' );
I only test the code with curl in my terminal:
curl -X POST http://website.com/wp-json/wp/v2/comments -H 'content-type: application/json' -d '{"post": 1, "content":"comment meta test", "author_name":"name", "author_email":"[email protected]", "likes":"1000", "pin":"1"}'
Responding to some prior questions in this thread, @chattes you should be using the same structure in Postman as in this library, so I'm unclear on why you believed you needed to separate the key
and value
. If you have registered meta, you'd update it as,
.update( {
meta: {
upvote: 5,
}
} )
@b02902032 What you have there looks like it works (and I assure you, even seasoned contributors get confused by the inconsistent property naming!) For a post, page, or other custom post type resource though I'd stick with register_post_meta
over register_rest_field
unless you need to derive the data from something other than post meta.
Here's how to add a boolean meta field to tags and posts.
function prefix_register_meta_fields()
{
$term_types = ['post_tag'];
$post_types = ['post'];
$key = 'the_example_key';
$args = [
'type' => 'boolean',
'description' =>
'An the_example_key boolean value.',
'single' => true,
'show_in_rest' => true
];
foreach ($post_types as $type) {
register_post_meta($type, $key, $args);
}
foreach ($term_types as $type) {
register_term_meta($type, $key, $args);
}
}
add_action('rest_api_init', 'prefix_register_meta_fields');
And then update it on some post of your choosing.
wp.tags()
.id(TAG_ID)
.update({
meta: {
the_example_key : true
}
})
wp.posts()
.id(POST_ID)
.update({
meta: {
the_example_key : true
}
})
How do you add multiple meta values with the same key? Using a single object only allows attaching of 1 meta key.
I did not find an example of what to do if you need to add several values for one key.
I try in wp
register_meta( 'post', 'reader', array( 'show_in_rest' => true, 'single' => false, 'type' => 'string', ));
i add meta in wp-api
wp.posts().id( 32477 ).update({ title: 'A Better Title', slug:"kukusik-100", status: 'draft', meta:{ reader:'Anton Petrov,Oleg Arno', } }).then(function( response ) { console.log( response.id ); })
And I get in the post meta fields the following
reader:'Anton' reader:'Petrov' reader:'Oleg' reader:'Arno'
I would like to see there
reader:'Anton Petrov' reader:'Oleg Arno'