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 é um desenvolvedor web autodidata, escritor, criador e grande admirador de Software Livre e de Código Aberto (FOSS). Além de tecnologia, ele se entusiasma com ciência, filosofia, fotografia, artes, gatos e comida. Saiba mais sobre ele em seu site e conecte-se com Salman no X.