WordPress er blevet det mest anvendte Content Management System (CMS), hvilket ikke mindst skyldes dets API (Application Programming Interface). WordPress REST API gør det muligt for WordPress at “tale” med andre programmer skrevet i forskellige sprog — herunder Python.

Python er et udvideligt programmeringssprog med forskellige anvendelsesmuligheder og en menneskeligt læsbar syntaks, hvilket gør det til et effektivt værktøj til fjernstyring af WordPress-indhold.

Her er nogle WordPress REST API-brugstilfælde for dine apps, og hvordan du kan bruge Python til at understøtte dem:

  • Brug foruddefinerede skabeloner, så din app hurtigt kan omdanne rå data til formaterede indlæg med forklaringer.
  • Byg en backoffice-applikation på Django og Python, der viser tidsbegrænsede tilbud til dine kunder, hver gang der opstår en objektspecifik rabat eller salgsbegivenhed.
  • Integrer Python-scripts til at køre inde på dit WordPress-websted

Denne vejledning hjælper dig med at oprette et simpelt Python-konsolprogram, der kommunikerer med og udfører operationer på WordPress REST API. Den komplette projektkode er også tilgængelig.

Installation og konfiguration af WordPress

Lad os først installere og køre et WordPress-websted lokalt på din udviklingsmaskine. Dette er en fremragende måde at starte med WordPress på, da du ikke behøver at oprette en konto eller købe et domænenavn til webhosting.

Før du installerer WordPress lokalt, skal nogle komponenter køre på din computer, herunder Apache-webserveren, en lokal database og PHP-sproget, som WordPress er skrevet i.

Heldigvis kan vi bruge DevKinsta, en gratis lokal WordPress-udviklingspakke, der er tilgængelig for alle større operativsystemer (du behøver ikke at være Kinsta-kunde for at bruge den).

DevKinsta er tilgængelig til Windows, Mac og Linux og installerer WordPress plus alle dets afhængigheder på din lokale maskine.

Før du installerer DevKinsta, skal du have Docker kørende lokalt, så download og installer Docker Engine, hvis du ikke har gjort det endnu.

Når du har installeret Docker Desktop, kan du automatisk hente den pakke, der passer til dit styresystem.

DevKinsta installationsside.
DevKinsta installationsside.

Når du kører DevKinsta-installationsprogrammet, begynder Docker at initialisere med det samme:

DevKinsta's starter Docker skærm.
DevKinsta starter Docker lokalt.

Vælg derefter Nyt WordPress-websted i menuen Opret nyt websted:

DevKinsta's oprette ny WordPress-sideskærm.
DevKinstas menu Opret nyt websted.

Nu kræver DevKinsta-installationsprogrammet, at du opretter legitimationsoplysningerne til WordPress-administratorkontoen:

DevKinstas nye WordPress-sideoprettelsesskærm.
DevKinsta viser formularen New WordPress site formularen.

Når DevKinsta er installeret, er det et selvstændigt program. Nu kan du få adgang til både WordPress-webstedet (via knappen Åbn websted) og WordPress-administrationspanelet (knappen WP Admin).

DevKinstas WordPress-sideinfoskærm.
DevKinstas webstedsinfopanel.

Dernæst skal du aktivere SSL og HTTPS for dit websted. Dette forbedrer sikkerheden på dit websted gennem et SSL-certifikat.

Aktivering af DevKinstas SSL- og HTTPS-indstilling.
DevKinsta’s “SSL og HTTPS” mulighed.

Gå nu til DevKinsta-appen, og klik på knappen Åbn websted. En ny browserfane vil vise forsiden af dit WordPress-websted:

Hjemmesiden på dit lokale WordPress-websted.
WordPress-hjemmeside.

Dette er din WordPress-blog, hvor du kan begynde at skrive. Men for at gøre det muligt for Python at få adgang til og bruge WordPress REST API’et, skal vi først konfigurere WordPress Admin.

Klik nu på knappen WP Admin på DevKinsta-appen, og angiv derefter din bruger og password for at få adgang til WordPress Dashboardet:

WordPress admin dashboard login skærm.
WordPress login form.

Når du er logget ind, vil du se WordPress Dashboard:

Velkommen til WordPress admin skærm.
WordPress Dashboard side.

WordPress bruger cookie-godkendelse som standardmetode. Men hvis du vil styre det ved hjælp af REST API’et, skal du autentificere dig med en teknik, der giver adgang til WordPress REST API’et.

Til dette skal du bruge Application Passwords. Disse er 24 tegn lange strenge, som WordPress genererer og knytter til en brugerprofil, der har tilladelse til at administrere dit websted.

Hvis du vil bruge Application Passwords, skal du klikke på Plugin-menuen på Dashboardet og derefter søge efter plugin’et med samme navn. Installer og aktivér derefter Plugin til programpasswords:

Installation og aktivering af WordPress Application Passwords plugin.
Application Passwords plugin til WordPress.

For at begynde at oprette din applikationspassword skal du starte med at udvide menuen Brugere og klikke på Alle brugere:

Udvidet brugere WordPress-menu.
Udvidet brugermenu.

Klik nu på Rediger under dit admin-brugernavn:

Klik på knappen "Rediger" under din WordPress-bruger under menuen Brugere.
WP-Admin WordPress-grænseflade.

Rul ned på siden Rediger bruger og find afsnittet Applikationspasswords. Her skal du angive et navn til Application Password, som du senere skal bruge til at autentificere dine Python-app-forespørgsler og forbruge REST API’et:

Application Passwords plugin dashboard.
Application Password side.

Klik på Tilføj ny programpassword, så WordPress kan generere en tilfældig password på 24 tegn til dig:

Det nye password genereret af Application Passwords plugin.
Ny Application Password side.

Derefter skal du kopiere denne adgangskode og gemme den et sikkert sted til senere brug. Husk, at du ikke vil kunne hente denne adgangskode, når du lukker denne side.

Til sidst skal du konfigurere permalinks. WordPress giver dig mulighed for at oprette en brugerdefineret URL-struktur for dine permalinks og arkiver. Lad os ændre det, så et WordPress-indlæg med titlen f.eks. “Dit første WordPress-websted” kan tilgås via den intuitive URL https://your-website.local:port/your-first-wordpress-website/. Denne fremgangsmåde giver flere fordele, herunder forbedret brugervenlighed og æstetik.

For at konfigurere permalinks skal du udvide afsnittet Indstillinger og klikke på menuen Permalinks. Her skal du ændre Fælles indstillinger til Indlægsnavn:

Ændring af WordPress permalink indstillinger.

Det er også nødvendigt at indstille permalink-strukturen ved hjælp af Post name-strukturen, fordi det vil gøre det muligt for os at hente indlæg senere i vores Python-kode ved hjælp af JSON-formatet. Ellers vil der blive kastet en JSON-afkodningsfejl.

Sådan styrer du WordPress fra Python

WordPress er skrevet i PHP, men det har et REST API, der gør det muligt for andre programmeringssprog, websteder og apps at forbruge dets indhold. Eksponering af WordPress-indholdet i REST-arkitekturen gør det tilgængeligt i JSON-format. Derfor kan andre tjenester integrere med WordPress og udføre CRUD-operationer (create, read, update og delete) uden at kræve en lokal WordPress-installation.

Herefter skal du bygge en simpel Python-app for at se, hvordan du kan bruge WordPress REST API til at oprette, hente, opdatere og slette indlæg.

Opret en ny mappe til dit nye enkle Python-projekt, og navngiv det noget i retning af PythonWordPress:

../PythonWordPress

Nu opretter du et virtuelt miljø for dit projekt, så det kan vedligeholde et uafhængigt sæt installerede Python-pakker, isolere dem fra dine systemmapper og undgå versionskonflikter. Opret et virtuelt miljø ved at udføre kommandoen venv:

python3 -m venv .venv

Nu skal du køre en kommando for at aktivere det virtuelle .venv-miljø. Denne kommando varierer fra OS til OS:

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

Derefter skal du gemme konfigurationen relateret til din WordPress-konto. For at adskille app-konfigurationen fra din Python-kode skal du oprette en .env-fil i din projektmappe og tilføje disse miljøvariabler til filen:

WEBSITE_URL="<>"

API_USERNAME="<>"

API_PASSWORD="<>"

Heldigvis er det nemt at læse ovenstående data fra en Python-app. Du kan installere pakken Python-dotenv, så din applikation kan læse konfigurationen fra .env-filen:

pip install python-dotenv

Derefter skal du installere aiohttp, en asynkron HTTP-klient/server til Python:

pip install aiohttp

Tilføj nu en fil med navnet app.py med følgende kode:

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())

Koden ovenfor viser en konsolmenu og beder dig om at indtaste et tal for at vælge en mulighed. Dernæst udvider du dette projekt og implementerer den kode, der gør det muligt at få vist alle indlæg og hente et bestemt indlæg ved hjælp af dets indlægs-id.

Hentning af indlæg i kode

For at interagere med WordPress REST API skal du oprette en ny Python-fil. Opret en fil med navnet wordpress_api_helper.py med følgende indhold:

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("=====================================")

Bemærk brugen af aiohttp-biblioteket ovenfor. Moderne sprog tilbyder syntaks og værktøjer, der muliggør asynkron programmering. Dette øger applikationens reaktionsevne ved at give programmet mulighed for at udføre opgaver sideløbende med operationer som webanmodninger, databaseoperationer og disk I/O. Python tilbyder asyncio som grundlag for sin asynkrone programmeringsramme, og aiohttp-biblioteket er bygget oven på asyncio for at give asynkron adgang til HTTP-klient/server-operationer udført i Python.

Funktionen ClientSession ovenfor kører asynkront og returnerer et session -objekt, som vores program bruger til at udføre en HTTP GET-operation mod /wp-json/wp/v2/posts -slutpunktet. Den eneste forskel mellem en anmodning om at hente alle indlæg og en anmodning om et bestemt indlæg er, at denne sidste anmodning videregiver en post id -parameter i URL-ruten: /wp-json/wp/v2/posts/{id}.

Åbn nu filen app.py, og tilføj import -anvisningen:

from wordpress_api_helper import get_all_posts, get_post

Ændr derefter funktionen main til at kalde funktionerne get_all_posts og 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)

Kør derefter programmet:

python app.py

Du får derefter vist programmenuen:

Start af Python-appen forbundet til WordPress.
Python-programmenu.

Prøv nu mulighed 1 for at få vist listen over indlæg, som din Python-app henter, og mulighed 2 for at vælge et indlæg:

Prøv mulighed 1 for at se listen over indlæg, som din Python-app henter, og mulighed 2 for at vælge et opslag.
Python-appen viser listen over indlæg og et enkelt indlæg, som brugeren har valgt.

Oprettelse af indlæg i kode

For at oprette et WordPress-indlæg i Python skal du begynde med at åbne filen wordpress_api_helper.py og tilføje funktionen 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}')

Denne kode kalder post -funktionen i session -objektet og sender auth -parameteren ud over REST API-endpoint-URL’en. auth -objektet indeholder nu WordPress-brugeren og det password, du oprettede ved hjælp af Application Passwords. Åbn nu filen app.py, og tilføj kode til at importere create_post og menuen:

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'

}

Tilføj derefter en tredje menupunkt:

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}")

Derefter skal du køre appen og prøve mulighed 3, hvor du indsender en titel og et indhold for at oprette et nyt indlæg i WordPress:

Oprettelse af et WordPress-indlæg med Python.
Python-appen viser et nyligt oprettet WordPress-indlæg.

Hvis du vælger mulighed 1 igen, returneres id og titlen på det nyligt tilføjede indlæg:

ython-appen returnerer det nye indlægs titel og id.
Python-appen returnerer det nye indlægs titel og id.

Du kan også åbne dit WordPress-websted for at se det nye indlæg:

Browserbillede af det nye WordPress-indlæg.
Browserbillede af det nye WordPress-indlæg.

Opdatering af indlæg i kode

Åbn filen wordpress_api_helper.py og tilføj funktionen 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}')

Åbn derefter filen app.py og tilføj kode til at importere update_post og menuen:

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'

}

Tilføj derefter et fjerde menupunkt:

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}")

Kør derefter appen, og prøv mulighed 4, hvor du overfører et indlægs-id, en titel og et indhold for at opdatere et eksisterende indlæg.

opdatering af WordPress post.
Python-appen viser den opdaterede menu.

Hvis du vælger mulighed 2 og overfører det opdaterede indlægs-id, får du detaljerne om det nyligt tilføjede indlæg tilbage:

Returnerer detaljerne for det nyligt opdaterede indlæg.
Python-appen viser det opdaterede indlæg.

Sletning af indlæg i kode

Du kan sende post id til REST API’et for at slette et indlæg.

Åbn filen wordpress_api_helper.py og tilføj funktionen 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.')

Åbn nu filen app.py, og tilføj kode til at importere delete_post og menuen:

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',

}

Tilføj derefter et femte menupunkt:

elif option == 5:

print('Deleting a post...')

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

await delete_post(id)

Nu kører du appen og prøver valgmulighed 5, hvor du indsender et id for at slette det eksisterende indlæg i WordPress:

Sletning af et WordPress-indlæg med Python-appen.
Python-appen viser sletning af det valgte indlæg.

Bemærk: Det slettede indlæg kan stadig vises, hvis du kører indstillingen List Posts:

Python-appen viser den oprindelige liste over indlæg.
Python-appen viser den oprindelige liste over indlæg.

For at bekræfte, at du har slettet indlægget, skal du vente et par sekunder og prøve indstillingen List Posts igen. Og det var det!

Opsummering

Takket være WordPress REST API og Pythons HTTP-klientbiblioteker kan Python-apps og WordPress gå sammen og tale med hinanden. Fordelen ved REST API’et er, at det giver dig mulighed for at betjene WordPress eksternt fra en Python-app, hvor Pythons kraftfulde sprog muliggør automatiseret indholdsoprettelse, der følger din ønskede struktur og frekvens.

DevKinsta gør det hurtigt og nemt at oprette og udvikle et lokalt WordPress-websted. Det giver et lokalt miljø til udvikling af WordPress-temaer og plugins og tilbyder en forenklet implementeringsmodel takket være den Docker-baserede, selvstændige installationsmodel.

Hvad er din erfaring med at arbejde med Python og WordPress?

Når du er klar til at udvide denne erfaring, kan du læse The Complete Guide to WordPress REST API Basics for at udforske andre muligheder.

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.