Doszlifuj swoje kotlety Pythona, łącząc swoją aplikację z WordPress
Opublikowany: 2022-10-18WordPress stał się najczęściej używanym systemem zarządzania treścią (CMS) dzięki interfejsowi programowania aplikacji (API). Interfejs API REST WordPress umożliwia WordPressowi „rozmowę” z innymi aplikacjami napisanymi w różnych językach — w tym z Pythonem.
Python to rozszerzalny język programowania o różnorodnych zastosowaniach i czytelnej dla człowieka składni, co czyni go potężnym narzędziem do zdalnego zarządzania treścią WordPress.
Oto kilka przypadków użycia interfejsu API REST WordPress dla Twoich aplikacji i sposobu, w jaki możesz użyć Pythona do ich obsługi:
- Użyj wstępnie zdefiniowanych szablonów, aby umożliwić aplikacji szybkie przekształcanie nieprzetworzonych danych w sformatowane posty z objaśnieniami.
- Zbuduj aplikację back-office w oparciu o Django i Python, która wyświetla klientom oferty ograniczone czasowo za każdym razem, gdy wystąpi zniżka dla danego obiektu lub zdarzenie wyprzedażowe.
- Zintegruj skrypty Pythona, aby działały w witrynie WordPress
Ten samouczek pomoże Ci stworzyć prostą aplikację konsolową Pythona, która komunikuje się i wykonuje operacje na WordPress REST API. Dostępny jest również kompletny kod projektu.
Instalacja i konfiguracja WordPress
Najpierw zainstalujmy i uruchommy witrynę WordPress lokalnie na komputerze deweloperskim. To doskonały sposób na rozpoczęcie korzystania z WordPressa, ponieważ nie musisz tworzyć konta ani kupować nazwy domeny do hostingu.
Przed zainstalowaniem WordPressa lokalnie, niektóre komponenty są wymagane do uruchomienia na twoim komputerze, w tym serwer WWW Apache, lokalna baza danych i język PHP, w którym napisany jest WordPress.
Na szczęście możemy użyć DevKinsta, bezpłatnego lokalnego pakietu programistycznego WordPress dostępnego dla wszystkich głównych systemów operacyjnych (nie musisz być klientem Kinsta, aby z niego korzystać).
DevKinsta jest dostępna dla systemów Windows, Mac i Linux i instaluje WordPress oraz wszystkie jego zależności na komputerze lokalnym.
Przed zainstalowaniem DevKinsta musisz mieć Docker działający lokalnie, więc pobierz i zainstaluj Docker Engine, jeśli jeszcze tego nie zrobiłeś.
Po zainstalowaniu Docker Desktop możesz automatycznie pobrać pakiet pasujący do Twojego systemu operacyjnego.
Po uruchomieniu instalatora DevKinsta Docker natychmiast rozpoczyna inicjowanie:
Następnie wybierz Nowa witryna WordPress z menu Utwórz nową witrynę :
Teraz instalator DevKinsta wymaga utworzenia poświadczeń dla konta administratora WordPress:
Po zainstalowaniu DevKinsta jest samodzielną aplikacją. Teraz możesz uzyskać dostęp zarówno do witryny WordPress (za pomocą przycisku Otwórz witrynę ), jak i pulpitu nawigacyjnego WordPress (przycisk WP Admin ).
Następnie musisz włączyć SSL i HTTPS dla swojej witryny. Poprawia to bezpieczeństwo Twojej witryny dzięki certyfikatowi SSL.
Teraz przejdź do aplikacji DevKinsta i kliknij przycisk Otwórz witrynę . Nowa karta przeglądarki pokaże stronę główną Twojej witryny WordPress:
To jest Twój blog WordPress, na którym możesz zacząć pisać. Aby jednak umożliwić Pythonowi dostęp do interfejsu API REST WordPress i korzystanie z niego, musimy najpierw skonfigurować administratora WordPress.
Teraz kliknij przycisk WP Admin w aplikacji DevKinsta, a następnie podaj użytkownika i hasło, aby uzyskać dostęp do pulpitu nawigacyjnego WordPress :
Po zalogowaniu zobaczysz pulpit nawigacyjny WordPress :
WordPress używa uwierzytelniania plików cookie jako swojej standardowej metody. Ale jeśli chcesz kontrolować to za pomocą interfejsu API REST, musisz uwierzytelnić się za pomocą techniki, która zapewnia dostęp do interfejsu API REST WordPress.
W tym celu użyjesz haseł aplikacji. Są to 24-znakowe ciągi znaków, które WordPress generuje i kojarzy z profilem użytkownika, który ma uprawnienia do zarządzania Twoją witryną.
Aby użyć haseł aplikacji, kliknij menu Wtyczka na pulpicie nawigacyjnym, a następnie wyszukaj wtyczkę o tej samej nazwie. Następnie zainstaluj i aktywuj wtyczkę Application Passwords:
Aby rozpocząć tworzenie hasła aplikacji, zacznij od rozwinięcia menu Użytkownicy i kliknięcia Wszyscy użytkownicy :
Teraz kliknij Edytuj pod nazwą użytkownika administratora:
Przewiń stronę Edytuj użytkownika i znajdź sekcję Hasła aplikacji . W tym miejscu podaj nazwę hasła aplikacji, której będziesz później używać do uwierzytelniania żądań aplikacji Python i korzystania z interfejsu API REST:
Kliknij Dodaj nowe hasło aplikacji , aby WordPress mógł wygenerować dla Ciebie losowe 24-znakowe hasło:
Następnie skopiuj to hasło i zapisz je w bezpiecznym miejscu do późniejszego wykorzystania. Pamiętaj, że po zamknięciu tej strony nie będziesz w stanie odzyskać tego hasła.
Na koniec musisz skonfigurować permalinki. WordPress pozwala stworzyć niestandardową strukturę adresów URL dla permalinków i archiwów. Zmieńmy to tak, aby post WordPress zatytułowany np. „Twoja pierwsza witryna WordPress” był dostępny poprzez intuicyjny adres URL https://twoja-strona.lokalna:port/twoja-pierwsza-strona-wordpress/. Takie podejście niesie ze sobą kilka korzyści, w tym lepszą użyteczność i estetykę.
Aby skonfigurować permalinki, rozwiń sekcję Ustawienia i kliknij menu Permalinki . Tutaj zmień ustawienia wspólne na nazwę posta :

Ustawienie struktury permalink przy użyciu struktury nazwy posta jest również konieczne, ponieważ pozwoli nam to później pobierać posty w naszym kodzie Pythona przy użyciu formatu JSON. W przeciwnym razie zostanie zgłoszony błąd dekodowania JSON.
Jak kontrolować WordPressa z Pythona
WordPress jest napisany w PHP, ale ma interfejs API REST, który umożliwia innym językom programowania, witrynom i aplikacjom korzystanie z jego treści. Wyeksponowanie treści WordPress w architekturze REST udostępnia ją w formacie JSON. W związku z tym inne usługi mogą integrować się z WordPress i wykonywać operacje tworzenia, odczytu, aktualizacji i usuwania (CRUD) bez konieczności lokalnej instalacji WordPress.
Następnie zbudujesz prostą aplikację w języku Python, aby zobaczyć, jak korzystać z interfejsu API REST WordPress do tworzenia, pobierania, aktualizowania i usuwania postów.
Utwórz nowy katalog dla swojego nowego prostego projektu Pythona i nazwij go jak PythonWordPress
:
../PythonWordPress
Teraz stworzysz dla swojego projektu wirtualne środowisko, które pozwoli mu utrzymywać niezależny zestaw zainstalowanych pakietów Pythona, izolując je od katalogów systemowych i unikając konfliktów wersji. Utwórz środowisko wirtualne, wykonując polecenie venv
:
python3 -m venv .venv
Teraz uruchom polecenie, aby aktywować środowisko wirtualne .venv . To polecenie różni się w zależności od systemu operacyjnego:
- Windows:
.venvScriptsactivate
- Mac/Linux:
.venv/bin/activate
Następnie zapisz konfigurację związaną z Twoim kontem WordPress. Aby oddzielić konfigurację aplikacji od kodu Pythona, utwórz plik .env w katalogu projektu i dodaj te zmienne środowiskowe do pliku:
WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"
Na szczęście odczytanie powyższych danych z aplikacji Pythona jest łatwe. Możesz zainstalować pakiet Python-dotenv , aby Twoja aplikacja mogła odczytywać konfigurację z pliku .env :
pip install python-dotenv
Następnie zainstaluj aiohttp , asynchroniczny klient/serwer HTTP dla Pythona:
pip install aiohttp
Teraz dodaj plik o nazwie app.py z następującym kodem:
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())
Powyższy kod wyświetla menu konsoli i prosi o wprowadzenie numeru, aby wybrać opcję. Następnie rozszerzysz ten projekt i zaimplementujesz kod, który umożliwi ci wyświetlenie listy wszystkich postów i pobranie konkretnego posta za pomocą jego identyfikatora posta.

Pobieranie postów w kodzie
Aby wchodzić w interakcję z WordPress REST API, musisz utworzyć nowy plik Python. Utwórz plik o nazwie wordpress_api_helper.py z następującą zawartością:
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("=====================================")
Zwróć uwagę na użycie powyższej biblioteki aiohttp . Nowoczesne języki zapewniają składnię i narzędzia umożliwiające programowanie asynchroniczne. Zwiększa to czas reakcji aplikacji, umożliwiając programowi wykonywanie zadań wraz z operacjami, takimi jak żądania internetowe, operacje na bazie danych i we/wy dysku. Python oferuje asyncio jako podstawę dla swojej asynchronicznej struktury programowania, a biblioteka aiohttp jest zbudowana na asyncio , aby zapewnić asynchroniczny dostęp do operacji HTTP Client/Server wykonanych w Pythonie.
Powyższa funkcja ClientSession
działa asynchronicznie i zwraca obiekt session
, którego nasz program używa do wykonania operacji HTTP GET względem punktu końcowego /wp-json/wp/v2/posts
. Jedyną różnicą między żądaniem pobrania wszystkich postów a żądaniem konkretnego jest to, że to ostatnie żądanie przekazuje parametr post id
w trasie URL: /wp-json/wp/v2/posts/{id}
.
Teraz otwórz plik app.py i dodaj instrukcję import
:
from wordpress_api_helper import get_all_posts, get_post
Następnie zmodyfikuj funkcję main
, aby wywoływała funkcje get_all_posts
i 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)
Następnie uruchom aplikację:
python app.py
Zobaczysz wtedy menu aplikacji:
Teraz wypróbuj opcję 1, aby wyświetlić listę postów, które pobiera aplikacja Python, i opcję 2, aby wybrać post:
Tworzenie postów w kodzie
Aby utworzyć post WordPress w Pythonie, zacznij od otwarcia pliku wordpress_api_helper.py i dodaj funkcję 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}')
Ten kod wywołuje funkcję post
w obiekcie session
, przekazując parametr auth
obok adresu URL punktu końcowego interfejsu API REST. Obiekt auth
zawiera teraz użytkownika WordPress i hasło utworzone za pomocą haseł aplikacji. Teraz otwórz plik app.py i dodaj kod do importu create_post
i 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' }
Następnie dodaj trzecią opcję 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}")
Następnie uruchom aplikację i wypróbuj opcję 3, przekazując tytuł i treść, aby utworzyć nowy post w WordPress:
Ponowne wybranie opcji 1 zwróci identyfikator i tytuł nowo dodanego posta:
Możesz także otworzyć swoją witrynę WordPress, aby wyświetlić nowy post:
Aktualizowanie postów w kodzie
Otwórz plik wordpress_api_helper.py i dodaj funkcję 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}')
Następnie otwórz plik app.py i dodaj kod, aby zaimportować update_post
i 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' }
Następnie dodaj czwartą opcję 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}")
Następnie uruchom aplikację i wypróbuj opcję 4, przekazując identyfikator posta, tytuł i treść, aby zaktualizować istniejący post.
Wybranie opcji 2 i podanie zaktualizowanego identyfikatora posta zwróci szczegóły nowo dodanego posta:
Usuwanie postów w kodzie
Możesz przekazać identyfikator posta do REST API, aby usunąć post.
Otwórz plik wordpress_api_helper.py i dodaj funkcję 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.')
Teraz otwórz plik app.py i dodaj kod, aby zaimportować delete_post
i 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', }
Następnie dodaj piątą opcję menu:
elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)
Teraz uruchom aplikację i wypróbuj opcję 5, przekazując identyfikator, aby usunąć istniejący post w WordPress:
Uwaga: Usunięty post może nadal się pojawiać, jeśli uruchomisz opcję Lista postów :
Aby potwierdzić, że usunąłeś post, odczekaj kilka sekund i ponownie spróbuj opcji Lista postów . I to wszystko!
Streszczenie
Dzięki API REST WordPress i bibliotekom klienckim HTTP Pythona, aplikacje Pythona i WordPress mogą współpracować i komunikować się ze sobą. Zaletą interfejsu API REST jest to, że umożliwia zdalne sterowanie WordPress z aplikacji Pythona, gdzie potężny język Pythona umożliwia automatyczne tworzenie treści zgodnie z pożądaną strukturą i częstotliwością.
DevKinsta sprawia, że tworzenie i rozwijanie lokalnej witryny WordPress jest szybkie i łatwe. Zapewnia lokalne środowisko do tworzenia motywów i wtyczek WordPress oraz oferuje uproszczony model wdrażania dzięki niezależnemu modelowi instalacji opartemu na platformie Docker.
Jakie masz doświadczenie w pracy z Pythonem i WordPressem?
Gdy będziesz gotowy, aby rozwinąć to doświadczenie, możesz przeczytać The Complete Guide to WordPress REST API Basics, aby poznać inne możliwości.