Doszlifuj swoje kotlety Pythona, łącząc swoją aplikację z WordPress

Opublikowany: 2022-10-18

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

Zrzut ekranu strony pobierania DevKinsta.
Strona instalacji DevKinsta.

Po uruchomieniu instalatora DevKinsta Docker natychmiast rozpoczyna inicjowanie:

Startowy ekran Docker DevKinsta.
DevKinsta uruchamia platformę Docker lokalnie.

Następnie wybierz Nowa witryna WordPress z menu Utwórz nową witrynę :

DevKinsta tworzy nowy ekran witryny WordPress.
Menu Utwórz nową witrynę DevKinsta.

Teraz instalator DevKinsta wymaga utworzenia poświadczeń dla konta administratora WordPress:

Nowy ekran tworzenia witryny WordPress firmy DevKinsta.
DevKinsta wyświetla formularz nowej witryny 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 ).

Ekran informacji o witrynie WordPress firmy DevKinsta.
Panel informacyjny witryny DevKinsta.

Następnie musisz włączyć SSL i HTTPS dla swojej witryny. Poprawia to bezpieczeństwo Twojej witryny dzięki certyfikatowi SSL.

Włączanie opcji SSL i HTTPS DevKinsta.
Opcja „SSL i HTTPS” DevKinsta.

Teraz przejdź do aplikacji DevKinsta i kliknij przycisk Otwórz witrynę . Nowa karta przeglądarki pokaże stronę główną Twojej witryny WordPress:

Strona główna Twojej lokalnej witryny WordPress.
Strona główna WordPressa.

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 :

Ekran logowania do pulpitu administratora WordPress.
Formularz logowania do WordPressa.

Po zalogowaniu zobaczysz pulpit nawigacyjny WordPress :

Witamy na ekranie administratora WordPress.
Strona pulpitu 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:

Instalacja i aktywacja wtyczki WordPress Application Passwords.
Wtyczka haseł aplikacji dla WordPress.

Aby rozpocząć tworzenie hasła aplikacji, zacznij od rozwinięcia menu Użytkownicy i kliknięcia Wszyscy użytkownicy :

Rozszerzone menu Użytkownicy WordPress.
Rozszerzone menu Użytkownicy.

Teraz kliknij Edytuj pod nazwą użytkownika administratora:

Kliknij przycisk „Edytuj” pod użytkownikiem WordPress w menu Użytkownicy.
Interfejs WP-Administrator WordPress.

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:

Pulpit nawigacyjny wtyczki Hasła aplikacji.
Strona Hasło aplikacji.

Kliknij Dodaj nowe hasło aplikacji , aby WordPress mógł wygenerować dla Ciebie losowe 24-znakowe hasło:

Nowe hasło wygenerowane przez wtyczkę Application Passwords.
Nowa strona hasła aplikacji.

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 :

Zmiana ustawień permalink WordPress.

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:

Uruchamianie aplikacji Python połączonej z WordPress.
Menu aplikacji Pythona.

Teraz wypróbuj opcję 1, aby wyświetlić listę postów, które pobiera aplikacja Python, i opcję 2, aby wybrać post:

Wypróbuj opcję 1, aby wyświetlić listę postów pobieranych przez aplikację Pythona, a opcję 2, aby wybrać post.
Aplikacja Pythona pokazująca listę postów i jeden post wybrany przez użytkownika.

Tworzenie postów w kodzie

Aby utworzyć post WordPress w Pythonie, zacznij od otwarcia pliku wordpress_api_helper.py i dodaj funkcję create_post :

Masz problemy z przestojami i WordPressem? Kinsta to rozwiązanie hostingowe zaprojektowane, aby zaoszczędzić Twój czas! Sprawdź nasze funkcje
 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:

Tworzenie posta na WordPressie za pomocą Pythona.
Aplikacja Pythona wyświetlająca nowo utworzony post WordPress.

Ponowne wybranie opcji 1 zwróci identyfikator i tytuł nowo dodanego posta:

Zwrócenie identyfikatora i tytułu nowo dodanego posta.
Aplikacja Pythona zwracająca tytuł i identyfikator nowego posta.

Możesz także otworzyć swoją witrynę WordPress, aby wyświetlić nowy post:

Nowo utworzony post w przeglądarce.
Obraz przeglądarki nowego posta WordPress.

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.

Aktualizowanie wpisu na WordPressie.
Aplikacja Pythona pokazująca zaktualizowane menu.

Wybranie opcji 2 i podanie zaktualizowanego identyfikatora posta zwróci szczegóły nowo dodanego posta:

Zwracanie szczegółów nowo zaktualizowanego posta.
Aplikacja Pythona pokazująca zaktualizowany post.

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:

Usuwanie posta WordPress za pomocą aplikacji Python.
Aplikacja Pythona pokazująca usunięcie wybranego posta.

Uwaga: Usunięty post może nadal się pojawiać, jeśli uruchomisz opcję Lista postów :

Wpisy z listą aplikacji w Pythonie.
Aplikacja Pythona pokazująca oryginalną listę 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.