Skip to content

[WordPress] Use REST API To Publish Article

Last Updated on 2021-10-17 by Clay

Recently, some netizens asked me about how to publish articles on WordPress through program. I took this opportunity to introduce REST API that was achieve the purpose of publishing articles.


What is REST API?

REST (Representational State Transfer) API is a relatively simple structure of the construction style of network transmission information. Users only need to set the HTTP parameters and attributes according to their own needs, and then they can use different software and programs to make requests on the server interface.

So you can think of REST as a style.

What I want to record today is the so-called WordPress REST API, which is a programming interface designed by WordPress for developers.

If my explanation is not complete, please refer to the official document.

We still need to finish the following 2 steps:

  • Create an Application Passwords
  • Write the program to operation

But the steps are not complicated.


Application Passwords

In WordPress 5.6 and later version, this function has been enable by default; if you have a lower version, it is recommended to search for related plugin, such as Application Passwords to enable it.

First go to the backend and find Users > Profile in the left menu.


Find the Application Passwords field and set a new application name. Here you can name a meaningful name to help you identification.


After creating, you will see the password generated by random.

xxxx xxxx xxxx xxxx xxxx xxxx



Finally, don't forget Update Profile (on the page bottom).


Write the program

In this section, I use python programming language to post request. If you have another familiar language, of course you can use it.

I will record the following operations:

  • Confirm REST API can visit the website
  • Publish an article
  • Update an article
  • Delete an article


Confirm REST API can visit the website

This is an important step. If the HTTP Status Code is not 200 after you post, you need to search for more information on Internet to troubleshoot your problem.

# coding: utf-8
import base64
import json
import requests
from pprint import pprint


def main():
    # Init
    url = "https://YOURS.com/wp-json/wp/v2/posts"
    username = "USERNAME"
    password = "PASSWORD"
    credentials = "{}:{}".format(username, password)
    token = base64.b64encode(credentials.encode())

    # Header
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
        "Authorization": "Basic {}".format(token.decode("utf-8")),
        "content-type": "application/json",
    }

    # Check
    r = requests.get(
        url,
        headers=headers,
    )
    
    # Print
    print(r)


if __name__ == "__main__":
    main()


Output:

<Response [200]>


Here are a few important parameters:

  • url: Your WordPress website REST API address
  • username: Your webmaster account (or email)
  • password: It is not really password but the Application Passwords we generated.

If the program returns a status code of 200, congratulations! Your WordPress website will probably have no problem using the REST API.


Publish an article

Publishing an article is very similar to the operation just now, except that it has changed from get() to post().

And you need to set additional information about the article. Please refer to the code below for details:

# coding: utf-8
import base64
import json
import requests
from pprint import pprint


def main():
    # Init
    url = "https://YOURS.com/wp-json/wp/v2/posts"
    username = "USERNAME"
    password = "PASSWORD"
    credentials = "{}:{}".format(username, password)
    token = base64.b64encode(credentials.encode())

    # Header
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
        "Authorization": "Basic {}".format(token.decode("utf-8")),
        "content-type": "application/json",
    }

    # Post info
    post = {
        "title": "This is a REST API test",
        "content": "Accessed.",
        "status": "draft",
    }

    # Post
    r = requests.post(
        url,
        headers=headers,
        json=post,
    )
    
    # Print
    pprint(r.text)


if __name__ == "__main__":
    main()


Output:

('{"id":5204,"date":"2021-03-22T04:58:33","date_gmt":"2021-03-22T04:58:33","guid":{"rendered":"https:\\/\\/clay-atlas.com\\/?p=5204","raw":"https:\\/\\/clay-atlas.com\\/?p=5204"},"modified":"2021-03-22T04:58:33","modified_gmt":"2021-03-22T04:58:33","password":"","slug":"","status":"draft","type":"post","link":"https:\\/\\/clay-atlas.com\\/?p=5204","title":{"raw":"This '
 'is a REST API test","rendered":"This is a REST API '
 'test"},"content":{"raw":"Accessed.","rendered":"<p>Accessed.<\\/p>\\n","protected":false,"block_version":0},"excerpt":{"raw":"","rendered":"<p>Accessed.<\\/p> ...


If the information above is returned, it means that the publication is successful. You should be able to see the draft (If you want to publish, change status to "publish") we just added in the backend:

The content is the same as the one just set.


Update an article

Do you remember the article ID: 5204 printed on the screen after we execute the program? Of course, you can update the article content via article ID.

You can refer to the following code:

# coding: utf-8
import base64
import json
import requests
from pprint import pprint


def main():
    # Init
    url = "https://YOURS.com/wp-json/wp/v2/posts"
    username = "USERNAME"
    password = "PASSWORD"
    credentials = "{}:{}".format(username, password)
    token = base64.b64encode(credentials.encode())

    # Header
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
        "Authorization": "Basic {}".format(token.decode("utf-8")),
        "content-type": "application/json",
    }

    # Post info
    post_id = 5204 # <--- add post id
    post = {
        "title": "This is a REST API test",
        "content": "Updated!", # <--- change the content
        "status": "draft",
    }

    # Post
    r = requests.post(
        "{}/{}".format(url, post_id), # <--- change the url
        headers=headers,
        json=post,
    )
    
    # Print
    pprint(r.text)


if __name__ == "__main__":
    main()


Output:

After running the program, open the article again, you should find that the content of the article has been updated.


Delete an article

To delete an article, you only need the article ID and change post() to delete().

# coding: utf-8
import base64
import json
import requests
from pprint import pprint


def main():
    # Init
    url = "https://YOURS.com/wp-json/wp/v2/posts"
    username = "USERNAME"
    password = "PASSWORD"
    credentials = "{}:{}".format(username, password)
    token = base64.b64encode(credentials.encode())

    # Header
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
        "Authorization": "Basic {}".format(token.decode("utf-8")),
        "content-type": "application/json",
    }

    # Post info
    post_id = 5204

    # Delete
    r = requests.delete( # <--- change "post" to "delete"
        "{}/{}".format(url, post_id),
        headers=headers,
    )
    
    # Print
    pprint(r.text)


if __name__ == "__main__":
    main()


Output:

At this time, we go to the backend and check again, we should find that this article has been moved into the trash.


References


Read More

Leave a Reply