WordPress tornou-se o sistema de gerenciamento de conteúdo (CMS) mais utilizado devido, em grande parte, à sua interface de programação de aplicativos (API). A API REST do WordPress permite que o WordPress “fale” com outros aplicativos escritas em várias linguagens – incluindo Python.

Python é uma linguagem de programação extensível com diversos usos e uma sintaxe legível por humanos, tornando uma ferramenta poderosa para gerenciar remotamente o conteúdo do WordPress.

Aqui estão alguns casos de uso da API REST do WordPress para seus aplicativos e como você pode usar o Python para apoiá-los:

  • Use modelos pré-definidos para habilitar seu aplicativo para transformar dados brutos em artigos formatados com explicações rapidamente.
  • Construa um aplicativo de back-office no Django e Python que exibe ofertas de tempo limitado para seus clientes toda vez que um desconto ou evento de vendas específico para um objeto ocorre.
  • Integre scripts Python para rodar dentro do seu site WordPress

Este tutorial ajudará você a criar um aplicativo simples de console Python que se comunica e executa operações na API REST de WordPress. O código completo do projeto também está disponível.

Instalando e configurando o WordPress

Primeiro, vamos instalar e rodar um site WordPress localmente na sua máquina de desenvolvimento. Esta é uma excelente maneira de começar com o WordPress, já que você não precisa criar uma conta ou comprar um nome de domínio para hospedagem web.

Antes de instalar o WordPress localmente, alguns componentes são necessários para rodar em seu computador, incluindo o servidor web Apache, um banco de dados local e a linguagem PHP na qual o WordPress é escrito.

Felizmente, podemos usar DevKinsta, uma suíte de desenvolvimento WordPress local gratuita disponível para todos os principais sistemas operacionais (você não precisa ser um cliente Kinsta para usá-la).

DevKinsta está disponível para Windows, Mac, e Linux, e instala o WordPress e todas às suas dependências na sua máquina local.

Antes de instalar o DevKinsta, você deve ter o Docker rodando localmente, então baixe e instale o Docker Engine se você ainda não o fez.

Após instalar o Docker Desktop, você pode baixar automaticamente o pacote que se encaixa no seu sistema operacional.

Página de instalação DevKinsta
Página de instalação DevKinsta

Quando você executa o instalador DevKinsta, o Docker começa a se inicializar imediatamente:

DevKinsta inicia o Docker localmente.
DevKinsta inicia o Docker localmente.

Em seguida, escolha Novo site WordPress a partir do menu Criar novo site:

Menu Criar Novo Site do DevKinsta
Menu Criar Novo Site do DevKinsta

Agora o instalador DevKinsta requer que você crie às credenciais para a conta de administrador do WordPress:

DevKinsta exibindo o formulário do novo site WordPress
DevKinsta exibindo o formulário do novo site WordPress

Uma vez instalado, o DevKinsta é um aplicativo autônomo. Agora você pode acessar tanto o site do WordPress (através do botão Abrir site) quanto o painel de controle do WordPress (botão WP Admin).

Painel informativo do site DevKinsta
Painel informativo do site DevKinsta

A seguir, você precisa habilitar SSL e HTTPS para o seu site. Isso melhora a segurança do seu site através de um certificado SSL.

Opção "SSL e HTTPS" do DevKinsta
Opção “SSL e HTTPS” do DevKinsta

Agora vá para o aplicativo DevKinsta e clique no botão Abrir site. Uma nova aba do navegador irá mostrar a página inicial do seu site WordPress:

Página inicial do WordPress
Página inicial do WordPress

Este é o seu blog WordPress, onde você pode começar a escrever. Mas para habilitar o Python a acessar e usar a API REST do WordPress, precisamos primeiro configurar o WordPress Admin.

Agora clique no botão WP Admin no aplicativo DevKinsta, então forneça seu usuário e senha para acessar o Painel de Controle do WordPress:

Formulário de login WordPress.
Formulário de login WordPress.

Uma vez conectado, você verá o Painel de Controle WordPress:

Página do Painel de Controle WordPress.
Página do Painel de Controle WordPress.

O WordPress usa a autenticação de cookies como seu método padrão. Mas se você quiser controlá-lo usando a API REST, você deve autenticar com uma técnica que concede acesso à API REST do WordPress.

Para isso, você usará Senhas de aplicativos. Estas são strings longas de 24 caracteres que o WordPress gera e associa com um perfil de usuário com permissão para gerenciar seu site.

Para usar Senhas de aplicativos, clique no menu Plugin no Painel, depois procure pelo plugin com o mesmo nome. Depois instale e ative o Plugin de Senhas de Aplicativos:

Plugin de senhas de aplicativos para WordPress
Plugin de senhas de aplicativos para WordPress

Para começar a criar sua senha de aplicativo, comece expandindo o menu Usuários e clicando em Todos os Usuários:

Menu Usuários Expandidos
Menu Usuários Expandidos

Agora, clique em Editar abaixo do seu nome de usuário administrativo:

Interface WP-Admin WordPress
Interface WP-Admin WordPress

Percorra a página Editar Usuário e encontre a seção Senhas de aplicativos. Aqui, forneça um nome para a Senha do aplicativo, que você usará mais tarde para autenticar suas solicitações de aplicativo Python e consumir a API REST:

Página da senha do aplicativo
Página da senha do aplicativo

Clique em Adicionar nova senha de aplicativo para que o WordPress possa gerar uma senha aleatória de 24 caracteres para você:

Página da nova senha de aplicativo
Página da nova senha de aplicativo

A seguir, copie esta senha e salve-a em um local seguro para usá-la mais tarde. Lembre-se, você não será capaz de recuperar esta senha após fechar esta página.

Finalmente, você deve configurar os permalinks. O WordPress permite que você crie uma estrutura de URL personalizada para seus permalinks e arquivos. Vamos mudá-la para que um artigo do WordPress intitulado, por exemplo, “Seu Primeiro site WordPress” possa ser acessado através da URL intuitiva https://your-website.local:port/your-first-wordpress-website/. Esta abordagem traz vários benefícios, incluindo melhoria na usabilidade e na estética.

Para configurar os permalinks, expanda a seção Configurações e clique no menu Permalinks. Aqui, mude as Configurações Comuns para Nome do post:

Changing WordPress permalink settings.

A configuração da estrutura permalink usando a estrutura de Nome do Post também é necessária porque nos permitirá recuperar artigos mais tarde em nosso código Python usando o formato JSON. Caso contrário, um erro de decodificação JSON será lançado.

Como controlar o WordPress a partir do Python

WordPress é escrito em PHP, mas tem uma API REST que permite que outras linguagens de programação, sites e aplicativos consumam seu conteúdo. Expor o conteúdo do WordPress na arquitetura REST o torna disponível no formato JSON. Portanto, outros serviços podem se integrar com o WordPress e realizar operações de criação, leitura, atualização e exclusão (CRUD) sem a necessidade de uma instalação local do WordPress.

Em seguida, você vai construir um aplicativo Python simples para ver como você pode usar a API REST do WordPress para criar, recuperar, atualizar e excluir artigos.

Crie um novo diretório para seu novo e simples projeto Python e nomeie-o algo como PythonWordPress:

../PythonWordPress

Agora, você vai criar um ambiente virtual para seu projeto, permitindo que ele mantenha um conjunto independente de pacotes Python instalados, isolando dos diretórios do seu sistema e evitando conflitos de versão. Crie um ambiente virtual executando o comando venv:

python3 -m venv .venv

Agora, execute um comando para ativar o ambiente virtual .venv. Este comando varia de acordo com o sistema operacional:

  • Windows: .venvScriptsactivate
  • Mac/Linux: .venv/bin/activate

A seguir, armazene a configuração relacionada à sua conta WordPress. Para separar a configuração do aplicativo do seu código Python, crie um arquivo .env em seu diretório de projetos e adicione estas variáveis de ambiente ao arquivo:

WEBSITE_URL="<>"

API_USERNAME="<>"

API_PASSWORD="<>"

Felizmente, ler os dados acima a partir de um aplicativo Python é fácil. Você pode instalar o pacote Python-dotenv para que o seu aplicativo possa ler a configuração a partir do arquivo .env:

pip install python-dotenv

Então, instale aiohttp, um cliente/servidor HTTP assíncrono para Python:

pip install aiohttp

Agora adicione um arquivo chamado app.py com o seguinte código:

import asyncio

menu_options = {

1: 'List Posts',

2: 'Retrieve a Post'

}

def print_menu():

for key in menu_options.keys():

print (key, '--', menu_options[key] )

async def main():

while(True):

print_menu()

option = input_number('Enter your choice: ')

#Check what choice was entered and act accordingly

if option == 1:

print('Listing posts...')

elif option == 2:

print('Retrieving a post...')

else:

print('Invalid option. Please enter a number between 1 and 5.')

def input_number(prompt):

while True:

try:

value = int(input(prompt))

except ValueError:

print('Wrong input. Please enter a number ...')

continue

if value < 0:

print("Sorry, your response must not be negative.")

else:

break

return value

def input_text(prompt):

while True:

text = input(prompt)

if len(text) == 0:

print("Text is required.")

continue

else:

break

return text

if __name__=='__main__':

asyncio.run(main())

O código acima exibe um menu de console e pede que você digite um número para escolher uma opção. Em seguida, você expandirá este projeto e implementará o código que permite que você liste todos os artigos e recupere um artigo específico usando seu id do artigo.

Recuperação de artigos com código

Para interagir com o WordPress REST API, você deve criar um novo arquivo Python. Crie um arquivo chamado wordpress_api_helper.py com o seguinte conteúdo:

import aiohttp

import base64

import os

import json

from dotenv import load_dotenv

load_dotenv()

user=os.getenv("API_USERNAME")

password=os.getenv("API_PASSWORD")

async def get_all_posts():

async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session:

async with session.get("/wp-json/wp/v2/posts") as response:

print("Status:", response.status)

text = await response.text()

wp_posts = json.loads(text)

sorted_wp_posts = sorted(wp_posts, key=lambda p: p['id'])

print("=====================================")

for wp_post in sorted_wp_posts:

print("id:", wp_post['id'])

print("title:", wp_post['title']['rendered'])

print("=====================================")

async def get_post(id):

async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session:

async with session.get(f"/wp-json/wp/v2/posts/{id}") as response:

print("Status:", response.status)

text = await response.text()

wp_post = json.loads(text)

print("=====================================")

print("Post")

print("     id:", wp_post['id'])

print("     title:", wp_post['title']['rendered'])

print("     content:", wp_post['content']['rendered'])

print("=====================================")

Observe o uso da biblioteca aiohttp acima. Linguagens modernas fornecem sintaxe e ferramentas que permitem a programação assíncrona. Isto aumenta a capacidade de resposta do aplicativo ao permitir que o programa execute tarefas ao lado de operações como solicitações web, operações do banco de dados e I/O de disco. Python oferece asyncio como base para o seu framework de programação assíncrona, e a biblioteca aiohttp é construída sobre asyncio para trazer acesso assíncrono às operações Cliente/Servidor HTTP feitas em Python.

A função ClientSession acima roda de forma assíncrona e retorna um objeto session, que nosso programa usa para realizar uma operação HTTP GET contra o endpoint /wp-json/wp/v2/posts. A única diferença entre uma solicitação de recuperação de todos os artigos e uma solicitação para um específico é que esta última solicitação passa um parâmetro post id na rota URL: /wp-json/wp/v2/posts/{id}.

Agora, abra o arquivo app.py e adicione a declaração import:

from wordpress_api_helper import get_all_posts, get_post

A seguir, modifique a função main para chamar as funções get_all_posts e get_post:

if option == 1:

print('Listing posts...')

await get_all_posts()

elif option == 2:

print('Retrieving a post...')

id = input_number('Enter the post id: ')

await get_post(id)

Em seguida, execute o aplicativo:

python app.py

Você verá então o menu de aplicativos:

Menu do aplicativo Python
Menu do aplicativo Python

Agora tente a opção 1 para ver a lista de artigos que seu aplicativo Python recupera, e a opção 2 para selecionar um artigo:

Aplicativo Python mostrando a lista de artigos e um artigo selecionada pelo usuário
Aplicativo Python mostrando a lista de artigos e um artigo selecionada pelo usuário

Criando artigos com código

Para criar um artigo do WordPress no Python, comece abrindo o arquivo wordpress_api_helper.py e adicione a função create_post:

async def create_post(title, content):

async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session:

async with session.post(

f"/wp-json/wp/v2/posts?content={content}&title={title}&status=publish"

, auth=aiohttp.BasicAuth(user, password)) as response:

print("Status:", response.status)

text = await response.text()

wp_post = json.loads(text)

post_id = wp_post['id']

print(f'New post created with id: {post_id}')

Este código chama a função post no objeto session, passando o parâmetro auth ao lado da URL do endpoint da API REST. O objeto auth agora contém o usuário do WordPress e a senha que você criou usando Senhas do aplicativo. Agora, abra o arquivo app.py e adicione o código para importar create_post e o menu:

from wordpress_api_helper import get_all_posts, get_post, create_post

menu_options = {

1: 'List Posts',

2: 'Retrieve a Post',

3: 'Create a Post'

}

Então adicione uma terceira opção de menu:

elif option == 3:

print('Creating a post...')

title = input_text('Enter the post title: ')

content = input_text('Enter the post content: ')

await create_post(title, f"{content}")

Então, execute o aplicativo e tente a opção 3, passando um título e conteúdo para criar um novo artigo no WordPress:

Creating a WordPress post with Python.
Aplicativo Python exibindo o novo artigo criado no WordPress

Escolhendo a opção 1 novamente retornará o id e o título do novo artigo adicionado:

Returning the id and the title of the newly added post.
Aplicativo Python devolvendo o título e ID do novo artigo.

Você também pode abrir o seu site WordPress para ver o novo artigo:

The newly created post in the browser.
Imagem do navegador do novo artigo do WordPress.

Atualização de artigos com código

Abra o arquivo wordpress_api_helper.py e adicione a função update_post:

async def update_post(id, title, content):

async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session:

async with session.post(

f"/wp-json/wp/v2/posts/{id}?content={content}&title={title}&status=publish"

, auth=aiohttp.BasicAuth(user, password)) as response:

print("Status:", response.status)

text = await response.text()

wp_post = json.loads(text)

post_id = wp_post['id']

print(f'New post created with id: {post_id}')

Então abra o arquivo app.py e adicione o código para importar update_post e o menu:

from wordpress_api_helper import get_all_posts, get_post, create_post, update_post

menu_options = {

1: 'List Posts',

2: 'Retrieve a Post',

3: 'Create a Post',

4: 'Update a Post'

}

Em seguida, adicione uma quarta opção de menu:

elif option == 4:

print('Updating a post...')

id = input_number('Enter the post id: ')

title = input_text('Enter the post title: ')

content = input_text('Enter the post content: ')

await update_post(id, title, f"{content}")

Então execute o aplicativo e tente a opção 4, passando um id do artigo, título e conteúdo para atualizar um artigo existente.

Updating a WordPress post.
Aplicativo Python mostrando o menu atualizado.

Escolhendo a opção 2 e passando a id atualizada do artigo, retornando os detalhes do artigo recém-adicionado:

Returning the details of the newly updated post.
Aplicativo Python mostrando o artigo atualizado

Excluindo artigos com código

Você pode passar a identificação do artigo para a API REST para excluir um artigo.

Abra o arquivo wordpress_api_helper.py e adicione a função delete_post:

async def delete_post(id):

async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session:

async with session.delete(

f"/wp-json/wp/v2/posts/{id}"

, auth=aiohttp.BasicAuth(user, password)) as response:

print("Status:", response.status)

text = await response.text()

wp_post = json.loads(text)

post_id = wp_post['id']

print(f'Post with id {post_id} deleted successfully.')

Agora abra o arquivo app.py e adicione o código para importar delete_post e o menu:

from wordpress_api_helper import get_all_posts, get_post, create_post, update_post, delete_post

menu_options = {

1: 'List Posts',

2: 'Retrieve a Post',

3: 'Create a Post',

4: 'Update a Post',

5: 'Delete a Post',

}

Em seguida, adicione uma quinta opção de menu:

elif option == 5:

print('Deleting a post...')

id = input_number('Enter the post id: ')

await delete_post(id)

Agora execute o aplicativo e tente a opção 5, passando uma identificação para excluir o artigo existente no WordPress:

Deleting a WordPress post with the Python app.
Aplicativo Python mostrando a exclusão do artigo selecionado

Nota: O artigo excluído ainda pode aparecer se você executar a opção List Posts:

Python app listing posts.
Aplicativo Python mostrando a lista de artigos original

Para confirmar que você excluiu o artigo, aguarde alguns segundos e tente a opção List Posts novamente. E é isso!

Resumo

Graças à API REST do WordPress e às bibliotecas de clientes HTTP do Python, os aplicativos Python e o WordPress podem se unir e conversar uns com os outros. O benefício da API REST é que ela permite que você opere o WordPress remotamente a partir de um aplicativo Python, onde a poderosa linguagem Python permite a criação automatizada de conteúdo que segue sua estrutura e frequência desejadas.

DevKinsta torna a criação e desenvolvimento de um site WordPress local rápido e fácil. Ele fornece um ambiente local para o desenvolvimento de temas e plugins WordPress e oferece um modelo simplificado de implantação, cortesia do seu modelo de instalação baseado em Docker, autocontido.

Qual é à sua experiência trabalhando com Python e WordPress?

Quando pronto para expandir essa experiência, você pode ler O Guia Básico e Completo para WordPress REST API para explorar outras possibilidades.

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.