Aprimore seus chopes Python conectando seu aplicativo com o WordPress
Publicados: 2022-10-18O WordPress se tornou o sistema de gerenciamento de conteúdo (CMS) mais usado 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 escritos em vários idiomas – incluindo Python.
Python é uma linguagem de programação extensível com diversos usos e uma sintaxe legível por humanos, tornando-se 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 suportá-los:
- Use modelos predefinidos para permitir que seu aplicativo transforme dados brutos em postagens formatadas com explicações rapidamente.
- Crie um aplicativo de back-office em Django e Python que exiba ofertas por tempo limitado para seus clientes sempre que ocorrer um desconto ou evento de vendas específico do objeto.
- Integre scripts Python para executar dentro do seu site WordPress
Este tutorial ajudará você a criar um aplicativo de console Python simples que se comunica e executa operações na API REST do WordPress. O código completo do projeto também está disponível.
Instalando e Configurando o WordPress
Primeiro, vamos instalar e executar um site WordPress localmente em sua máquina de desenvolvimento. Esta é uma excelente maneira de começar com o WordPress, pois você não precisa criar uma conta ou comprar um nome de domínio para hospedagem na web.
Antes de instalar o WordPress localmente, alguns componentes devem ser executados em seu computador, incluindo o servidor web Apache, um banco de dados local e a linguagem PHP na qual o WordPress está escrito.
Felizmente, podemos usar o DevKinsta, um pacote de desenvolvimento local gratuito do WordPress disponível para todos os principais sistemas operacionais (você não precisa ser um cliente Kinsta para usá-lo).
O DevKinsta está disponível para Windows, Mac e Linux e instala o WordPress e todas as suas dependências em 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 ainda não o fez.
Depois de instalar o Docker Desktop, você pode baixar automaticamente o pacote adequado ao seu sistema operacional.
Ao executar o instalador do DevKinsta, o Docker inicia a inicialização imediatamente:
Em seguida, escolha Novo site WordPress no menu Criar novo site :
Agora, o instalador do DevKinsta exige que você crie as credenciais para a conta de administrador do WordPress:
Uma vez instalado, o DevKinsta é um aplicativo independente. Agora você pode acessar o site WordPress (através do botão Abrir Site ) e o painel de administração do WordPress (botão WP Admin ).
Em seguida, você precisa habilitar SSL e HTTPS para 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 guia do navegador mostrará a página inicial do seu site WordPress:
Este é o seu blog WordPress, onde você pode começar a escrever. Mas para permitir que o Python acesse e use a API REST do WordPress, primeiro devemos configurar o WordPress Admin.
Agora clique no botão WP Admin no aplicativo DevKinsta e forneça seu usuário e senha para acessar o Painel do WordPress :
Assim que estiver logado, você verá o Painel do WordPress :
O WordPress usa a autenticação de cookies como método padrão. Mas se você quiser controlá-lo usando a API REST, você deve se autenticar com uma técnica que conceda acesso à API REST do WordPress.
Para isso, você usará Senhas de Aplicativo. São strings de 24 caracteres que o WordPress gera e associa a um perfil de usuário que tem permissão para gerenciar seu site.
Para usar Senhas de aplicativo, clique no menu Plugin no Painel e procure o plug-in com o mesmo nome. Em seguida, instale e ative o plug-in de senhas de aplicativos:
Para começar a criar a senha do seu 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 de administrador:
Role para baixo na página Editar usuário e encontre a seção Senhas do aplicativo . Aqui, forneça um nome para a senha do aplicativo, que você usará posteriormente 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ê:
Em seguida, copie essa senha e salve-a em um local seguro para usar mais tarde. Lembre-se, você não poderá recuperar esta senha depois de fechar esta página.
Finalmente, você deve configurar permalinks. O WordPress permite que você crie uma estrutura de URL personalizada para seus permalinks e arquivos. Vamos alterá-lo para que um post do WordPress intitulado, por exemplo, “Your First WordPress Website” possa ser acessado através da URL intuitiva https://your-website.local:port/your-first-wordpress-website/. Essa abordagem traz vários benefícios, incluindo usabilidade e estética aprimoradas.
Para configurar permalinks, expanda a seção Configurações e clique no menu Permalinks . Aqui, altere as configurações comuns para o nome do post :

Definir a estrutura de permalink usando a estrutura de nome Post também é necessário porque nos permitirá recuperar postagens posteriormente em nosso código Python usando o formato JSON. Caso contrário, um erro de decodificação JSON será gerado.
Como controlar o WordPress a partir do Python
O WordPress é escrito em PHP, mas possui 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 disponibiliza no formato JSON. Portanto, outros serviços podem se integrar ao WordPress e realizar operações de criação, leitura, atualização e exclusão (CRUD) sem exigir uma instalação local do WordPress.
Em seguida, você criará um aplicativo Python simples para ver como pode usar a API REST do WordPress para criar, recuperar, atualizar e excluir postagens.
Crie um novo diretório para seu novo projeto Python simples e nomeie-o como PythonWordPress
:
../PythonWordPress
Agora, você criará um ambiente virtual para seu projeto, permitindo que ele mantenha um conjunto independente de pacotes Python instalados, isolando-os dos diretórios do 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
Em seguida, armazene a configuração relacionada à sua conta do WordPress. Para separar a configuração do aplicativo do código Python, crie um arquivo .env no diretório do projeto e adicione estas variáveis de ambiente ao arquivo:
WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"
Felizmente, ler os dados acima de um aplicativo Python é fácil. Você pode instalar o pacote Python-dotenv para que seu aplicativo possa ler a configuração do arquivo .env :
pip install python-dotenv
Em seguida, 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 do console e solicita que você insira um número para escolher uma opção. Em seguida, você expandirá este projeto e implementará o código que permite listar todas as postagens e recuperar uma postagem específica usando seu ID de postagem.

Buscando postagens no código
Para interagir com a API REST do WordPress, 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. As linguagens modernas fornecem sintaxe e ferramentas que permitem a programação assíncrona. Isso aumenta a capacidade de resposta do aplicativo, permitindo que o programa execute tarefas juntamente com operações como solicitações da Web, operações de banco de dados e E/S de disco. O Python oferece o assíncrono como base para sua estrutura de programação assíncrona, e a biblioteca aiohttp é construída sobre o assíncrono para trazer acesso assíncrono às operações de cliente/servidor HTTP feitas em Python.
A função ClientSession
acima é executada de forma assíncrona e retorna um objeto de session
, que nosso programa usa para executar uma operação HTTP GET no endpoint /wp-json/wp/v2/posts
. A única diferença entre uma solicitação para recuperar todas as postagens e uma solicitação para uma específica é que esta última solicitação passa um parâmetro de post id
na rota de URL: /wp-json/wp/v2/posts/{id}
.
Agora, abra o arquivo app.py e adicione a instrução de import
:
from wordpress_api_helper import get_all_posts, get_post
Em seguida, 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á o menu do aplicativo:
Agora tente a opção 1 para visualizar a lista de postagens que seu aplicativo Python recupera e a opção 2 para selecionar uma postagem:
Criando postagens em código
Para criar um post WordPress em 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}')
Esse código chama a função post
no objeto de session
, passando o parâmetro auth
ao lado da URL do endpoint da API REST. O objeto de auth
agora contém o usuário do WordPress e a senha que você criou usando Senhas de 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' }
Em seguida, 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}")
Em seguida, execute o aplicativo e tente a opção 3, passando um título e conteúdo para criar um novo post no WordPress:
Escolher a opção 1 novamente retornará o id e o título da postagem recém-adicionada:
Você também pode abrir seu site WordPress para ver a nova postagem:
Atualizando postagens no 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}')
Em seguida, 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}")
Em seguida, execute o aplicativo e tente a opção 4, passando um ID de postagem, título e conteúdo para atualizar uma postagem existente.
Escolher a opção 2 e passar o ID do post atualizado retornará os detalhes do post recém-adicionado:
Excluindo postagens no código
Você pode passar o ID da postagem para a API REST para excluir uma postagem.
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 app e tente a opção 5, passando um id para deletar o post existente no WordPress:
Nota: A postagem excluída ainda pode aparecer se você executar a opção Listar postagens :
Para confirmar que você excluiu a postagem, aguarde alguns segundos e tente a opção Listar postagens novamente. E é isso!
Resumo
Graças à API REST do WordPress e às bibliotecas de cliente HTTP do Python, os aplicativos Python e o WordPress podem se unir e conversar entre si. O benefício da API REST é que ela permite operar o WordPress remotamente a partir de um aplicativo Python, onde a linguagem poderosa do Python permite a criação automatizada de conteúdo que segue a estrutura e a 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 desenvolver temas e plugins do WordPress e oferece um modelo de implantação simplificado, cortesia de seu modelo de instalação independente baseado em Docker.
Qual é a sua experiência trabalhando com Python e WordPress?
Quando estiver pronto para expandir essa experiência, você pode ler The Complete Guide to WordPress REST API Basics para explorar outras possibilidades.