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.
Quando você executa o instalador DevKinsta, o Docker começa a se inicializar imediatamente:
Em seguida, escolha Novo site WordPress a partir do menu Criar novo site:
Agora o instalador DevKinsta requer que você crie às credenciais para a conta de administrador do 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).
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.
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:
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:
Uma vez conectado, você verá o 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:
Para começar a criar sua senha de aplicativo, comece expandindo o menu Usuários e clicando em Todos os Usuários:
Agora, clique em Editar abaixo do seu nome de usuário administrativo:
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:
Clique em Adicionar nova senha de aplicativo para que o WordPress possa gerar uma senha aleatória de 24 caracteres para você:
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:
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:
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:
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:
Escolhendo a opção 1 novamente retornará o id e o título do novo artigo adicionado:
Você também pode abrir o seu site WordPress para ver o novo artigo:
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.
Escolhendo a opção 2 e passando a id atualizada do artigo, retornando os detalhes do artigo recém-adicionado:
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:
Nota: O artigo excluído ainda pode aparecer se você executar a opção List Posts:
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.
Deixe um comentário