Posting to a wordpress blog from Python

If you are running a corporate website or a personal blog in WordPress, you may want to upload and update posts programmatically instead of from a browser. For this purpose, you can use python-wordpress-xmlrpc library.

github

  • The file in jupyter notebook format on github is here.

google colaboratory

  • If you want to run it on google colaboratory here 006/006_nb.ipynb)

Author’s environment

sw_vers
ProductName: Mac OS X
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G95
Python -V
Python 3.5.5 :: Anaconda, Inc.

Install python-wordpress-xmlrpc

! pip install python-wordpress-xmlrpc

Post an article

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost

wpSiteXMLRPC = 'https://xxxxxx.com/xmlrpc.php'
loginId = 'xxxx'
password = 'yyyy'

wp = Client(wpSiteXMLRPC, loginId, password)
post = WordPressPost()

title = 'title'
body = 'body body '

post.title = title
post.content = body

post.terms_names = {
  'post_tag': ['tag'],
  'category': ['category'], ['category']
}

# post.post_status = 'draft'
post.post_status = 'publish'

# set timezone to JST
post.date = datetime.datetime.now() - datetime.timedelta(hours=9)

# custom field
customFields = [].
customFields.append({
  'key': 'aaa',
  'value': '***'
})

post.custom_fields = customFields

new_id = int(wp.call(NewPost(post)))
if new_id > 0:
  print('wordpress update success.')
else:
  print('wordpress update failure.')

Uploading images

To upload an article with images, first upload the article itself, get its ID (media ID), and then specify the ID when you upload the article. The sample code to upload an image is as follows

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import media

wpSiteXMLRPC = 'https://xxxxxx.com/xmlrpc.php'
loginId = 'xxxx'
password = 'yyyy'

wp = Client(wpSiteXMLRPC, loginId, password)
post = WordPressPost()

def upload_image(in_image_file_name, out_image_file_name):
  if os.path.exists(in_image_file_name):
    with open(in_image_file_name, 'rb') as f:
      binary = f.read()

    data = {
      "name": out_image_file_name,
      "type": 'image/jpeg',
      "overwrite": True,
      "bits": binary
    }

    media_id = wp.call(media.UploadFile(data))['id'].
    print(in_image_file_name.split('/')[-1], 'upload success')
    return
  else:
    print(in_image_file_name.split('/')[-1], 'NO IMAGE!!!')

Specify thumbnails.

You can specify a thumbnail for a post by uploading an image and setting it to post.thumbbail as shown below.

post = WordPressPost()
media_id = wp.call(media.UploadFile(data))['id'].
post.thumbnail = media_id

You can post an article, get a list of articles even if you don’t update them, upload a fixed page, and update it. For more information, check out the python-wordpress-xmlrpc site.