Search code examples
phpjsonwordpresswordpress-rest-api

Create a new user using WP REST API and declare meta object


I'm struggling here with a question. I'm sending a POST to http://localhost/wp-json/v2/wp/users/ with this JSON data:

{
    "username" : "johndoe",
    "email": "jondoe@gmail.com",
    "password": "qwerty",
    "meta": {
        "icq": "11223344"
    }

}

But when I go to see the result, the meta object is blank. I accomplished the goal using a plug-in, but this plug-in authenticates with cookie and I have another plug-in who uses JWT to authenticate, so I think is to much plug-ins to one single task.

Someone have the same problem? Not even in official docs from the plug-in I found a solution.


Solution

  • Just found the solution in another question of Stack Overflow. Using the function register_meta():

    register_meta('user', 'icq', array(
      "type" => "string",
      "show_in_rest" => true
    ));
    

    Now I can make a request using:

    {
        "username" : "johndoe",
        "email": "jondoe@gmail.com",
        "password": "qwerty",
        "meta": {
            "icq": "11223344"
        }
    
    }
    

    And the response are:

    {
        "id": 49,
        "username": "johndoe",
        "name": "johndoe",
        "first_name": "",
        "last_name": "",
        "email": "johndoe@gmail.com",
        "url": "",
        "description": "",
        "link": "http://localhost/author/johndoe/",
        "locale": "en_US",
        "nickname": "johndoe",
        "slug": "johndoe",
        "roles": [
            "subscriber"
        ],
        "registered_date": "2018-01-13T11:53:57+00:00",
        "capabilities": {
            "read": true,
            "level_0": true,
            "subscriber": true
        },
        "extra_capabilities": {
            "subscriber": true
        },
        "avatar_urls": {
            "24": "http://2.gravatar.com/avatar/29a1df4646cb3417c19994a59a3e022a?s=24&d=mm&r=g",
            "48": "http://2.gravatar.com/avatar/29a1df4646cb3417c19994a59a3e022a?s=48&d=mm&r=g",
            "96": "http://2.gravatar.com/avatar/29a1df4646cb3417c19994a59a3e022a?s=96&d=mm&r=g"
        },
        "meta": {
            "icq": [
                "11223344"
            ]
        },
        "_links": {
            "self": [
                {
                    "href": "http://localhost/wp-json/wp/v2/users/49"
                }
            ],
            "collection": [
                {
                    "href": "http://localhost/wp-json/wp/v2/users"
                }
            ]
        }
    }
    

    And if I want to show/edit in /wp-admin/ I just use this function too:

    function more_contactmethods( $contactmethods ) {
        $contactmethods['icq'] = 'ICQ';
        return $contactmethods;
    }
    
    add_filter( 'user_contactmethods', 'more_contactmethods' );