Welcome to django-wordpress-rest!
Django-wordpress-rest is a Django application that syncs content from a WordPress.com site to a Django site.
This is done using the WordPress.com REST API. A separate copy of the content data is stored on the Django side, which allows for loose coupling and extensability.
Full documentation is available on Read The Docs.
Install the module:
pip install django-wordpress-rest
Add "wordpress"
to your INSTALLED_APPS
setting:
INSTALLED_APPS = ( # ... "wordpress", # ... )
Create the database tables that will persist the sync'd WordPress content:
$ python manage.py migrate
Sync WordPress content using the management command. The <site_id>
can be found using the /me/sites WordPress API call. This is useful for periodically updating the content with cron.
$ python manage.py load_wp_api <site_id>
If you'd like to synchronize private content, create an OAuth2 access token using the instructions provided by WordPress: https://developer.wordpress.com/docs/oauth2/
Add this token to your Django settings.py
file. Use an environment variable to keep things secure:
WP_API_AUTH_TOKEN = os.getenv("WP_API_AUTH_TOKEN")
Bring the site content up to date:
# first run gets everything $ python manage.py load_wp_api <site_id> # second run gets content modified since previous run $ python manage.py load_wp_api <site_id>
Do a full sweep of the site content, inserting and updating as needed:
# first run gets everything $ python manage.py load_wp_api <site_id> # second run gets/updates all content again $ python manage.py load_wp_api <site_id> --full
Load everything modified after a given date:
$ python manage.py load_wp_api <site_id> --modified_after=2015-01-01
Just load posts, not pages, attachments, or reference data:
$ python manage.py load_wp_api <site_id> --type=post
Load posts with a specific status (note this requires authentication):
$ python manage.py load_wp_api <site_id> --status=draft
Purge local content before loading -- careful!
$ python manage.py load_wp_api <site_id> --purge --full
If you'd like to use the webhook to sync a post immediately after it's updated, include the urls
into your project's urls.py
, like so:
from django.conf.urls import include urlpatterns = [ url(r'^wordpress/', include('wordpress.urls')) ]
Add "after_response"
to your INSTALLED_APPS
setting (this allows asynchronous processing):
INSTALLED_APPS = ( # ... "after_response", "wordpress", # ... )
The webhook looks for your <site_id>
in Django settings. So add this your settings.py
, and use an environment variable to keep things secure:
WP_API_SITE_ID = os.getenv("WP_API_SITE_ID")
Finally from your WordPress.com site, submit a POST request with an ID
data element in the body to trigger a sync of a single post. Note this should be the WordPress Post ID, not the Django one!
$ curl -X POST --data "ID=123456" http://mydjangosite.com/wordpress/load_post
$ pip install detox $ detox