Aprimore seus chopes Python conectando seu aplicativo com o WordPress

Publicados: 2022-10-18

O 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.

Captura de tela da página de download do DevKinsta.
Página de instalação do DevKinsta.

Ao executar o instalador do DevKinsta, o Docker inicia a inicialização imediatamente:

Tela inicial do Docker do DevKinsta.
O DevKinsta inicia o Docker localmente.

Em seguida, escolha Novo site WordPress no menu Criar novo site :

A tela de criação do novo site WordPress do DevKinsta.
Menu Criar Novo Site do DevKinsta.

Agora, o instalador do DevKinsta exige que você crie as credenciais para a conta de administrador do WordPress:

Nova tela de criação de site WordPress do DevKinsta.
DevKinsta exibindo o formulário Novo site 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 ).

Tela de informações do site WordPress do DevKinsta.
Painel de informações do site do DevKinsta.

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.

Habilitando a 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 guia do navegador mostrará a página inicial do seu site WordPress:

A página inicial do seu site WordPress local.
Página inicial do 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 :

Tela de login do painel de administração do WordPress.
Formulário de login do WordPress.

Assim que estiver logado, você verá o Painel do WordPress :

Bem-vindo à tela de administração do WordPress.
Página do 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:

Instalando e ativando o plugin WordPress Application Passwords.
Plugin de senhas de aplicativos para WordPress.

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

Menu do WordPress de usuários expandido.
Menu de usuários expandido.

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

Clique no botão "Editar" abaixo do seu usuário do WordPress no menu Usuários.
Interface WP-Admin WordPress.

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:

Painel de plug-in de senhas de aplicativos.
Página de 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ê:

A nova senha gerada pelo plugin Application Passwords.
Nova página de senha do aplicativo.

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 :

Alterando as configurações de link permanente do WordPress.

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:

Iniciando o aplicativo Python conectado ao WordPress.
Menu do aplicativo Python.

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:

Experimente a opção 1 para visualizar a lista de postagens que seu aplicativo Python recupera e a opção 2 para selecionar uma postagem.
Aplicativo Python mostrando a lista de postagens e uma única postagem selecionada pelo usuário.

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 :

Lutando com problemas de tempo de inatividade e WordPress? Kinsta é a solução de hospedagem projetada para economizar seu tempo! Confira nossas funcionalidades
 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:

Criando um post WordPress com Python.
Aplicativo Python exibindo a postagem recém-criada do WordPress.

Escolher a opção 1 novamente retornará o id e o título da postagem recém-adicionada:

Retornando o id e o título da postagem recém-adicionada.
Aplicativo Python retornando o título e o ID da nova postagem.

Você também pode abrir seu site WordPress para ver a nova postagem:

A postagem recém-criada no navegador.
Imagem do navegador da nova postagem do WordPress.

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.

Atualizando uma postagem do WordPress.
Aplicativo Python mostrando o menu atualizado.

Escolher a opção 2 e passar o ID do post atualizado retornará os detalhes do post recém-adicionado:

Retornando os detalhes da postagem recém-atualizada.
Aplicativo Python mostrando a postagem atualizada.

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:

Excluindo uma postagem do WordPress com o aplicativo Python.
Aplicativo Python mostrando a exclusão da postagem selecionada.

Nota: A postagem excluída ainda pode aparecer se você executar a opção Listar postagens :

Postagens de listagem de aplicativos Python.
Aplicativo Python mostrando a lista de postagens original.

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.