앱을 WordPress와 연결하여 Python 찹을 세련되게 만드십시오.

게시 됨: 2022-10-18

WordPress는 API(응용 프로그래밍 인터페이스) 덕분에 가장 많이 사용되는 콘텐츠 관리 시스템(CMS)이 되었습니다. WordPress REST API를 사용하면 WordPress가 Python을 비롯한 다양한 언어로 작성된 다른 애플리케이션과 "대화"할 수 있습니다.

Python은 다양한 용도와 사람이 읽을 수 있는 구문을 갖춘 확장 가능한 프로그래밍 언어로 WordPress 콘텐츠를 원격으로 관리하기 위한 강력한 도구입니다.

다음은 앱에 대한 몇 가지 WordPress REST API 사용 사례와 Python을 사용하여 앱을 지원하는 방법입니다.

  • 사전 정의된 템플릿을 사용하여 앱에서 원시 데이터를 설명이 포함된 형식화된 게시물로 빠르게 전환할 수 있습니다.
  • 개체별 할인 또는 판매 이벤트가 발생할 때마다 고객에게 기간 한정 제안을 표시하는 Django 및 Python에서 백오피스 애플리케이션을 빌드합니다.
  • WordPress 사이트 내에서 실행할 Python 스크립트 통합

이 자습서는 WordPress REST API와 통신하고 작업을 실행하는 간단한 Python 콘솔 응용 프로그램을 만드는 데 도움이 됩니다. 전체 프로젝트 코드도 사용할 수 있습니다.


WordPress 설치 및 구성

먼저 개발 머신에 로컬로 WordPress 웹 사이트를 설치하고 실행해 보겠습니다. 이것은 웹 호스팅을 위해 계정을 만들거나 도메인 이름을 구입할 필요가 없기 때문에 WordPress를 시작하는 훌륭한 방법입니다.

WordPress를 로컬에 설치하기 전에 Apache 웹 서버, 로컬 데이터베이스 및 WordPress가 작성된 PHP 언어를 포함하여 컴퓨터에서 실행하려면 일부 구성 요소가 필요합니다.

다행히도 모든 주요 OS에서 사용할 수 있는 무료 로컬 WordPress 개발 제품군인 DevKinsta를 사용할 수 있습니다(Kinsta 고객이 아니어도 사용할 수 있음).

DevKinsta는 Windows, Mac 및 Linux에서 사용할 수 있으며 WordPress와 모든 종속성을 로컬 컴퓨터에 설치합니다.

DevKinsta를 설치하기 전에 Docker가 로컬에서 실행되고 있어야 하므로 아직 Docker 엔진이 없다면 다운로드하여 설치하십시오.

Docker Desktop을 설치한 후 OS에 맞는 패키지를 자동으로 다운로드할 수 있습니다.

DevKinsta의 다운로드 페이지 스크린샷.
DevKinsta 설치 페이지.

DevKinsta 설치 프로그램을 실행하면 Docker가 즉시 초기화를 시작합니다.

DevKinsta의 Docker 시작 화면.
DevKinsta는 Docker를 로컬로 시작합니다.

그런 다음 새 사이트 만들기 메뉴에서 새 WordPress 사이트 를 선택합니다.

DevKinsta의 새로운 WordPress 사이트 생성 화면.
DevKinsta의 새 사이트 만들기 메뉴.

이제 DevKinsta 설치 프로그램을 사용하려면 WordPress 관리자 계정에 대한 자격 증명을 생성해야 합니다.

DevKinsta의 새로운 WordPress 사이트 생성 화면.
새 WordPress 사이트 양식을 표시하는 DevKinsta.

일단 설치되면 DevKinsta는 독립 실행형 응용 프로그램입니다. 이제 WordPress 사이트(사이트 열기 버튼을 통해)와 WordPress 관리 대시보드( WP 관리 버튼)에 모두 액세스할 수 있습니다.

DevKinsta의 WordPress 사이트 정보 화면.
DevKinsta의 사이트 정보 패널.

다음으로 웹 사이트에 SSL 및 HTTPS를 활성화해야 합니다. 이렇게 하면 SSL 인증서를 통해 웹사이트의 보안이 향상됩니다.

DevKinsta의 SSL 및 HTTPS 옵션 활성화.
DevKinsta의 "SSL 및 HTTPS" 옵션.

이제 DevKinsta 앱으로 이동하여 사이트 열기 버튼을 클릭합니다. 새 브라우저 탭에 WordPress 사이트의 홈 페이지가 표시됩니다.

로컬 WordPress 사이트의 홈 페이지.
워드프레스 홈페이지.

이것은 글쓰기를 시작할 수 있는 WordPress 블로그입니다. 그러나 Python이 WordPress REST API에 액세스하고 사용할 수 있도록 하려면 먼저 WordPress 관리자를 구성해야 합니다.

이제 DevKinsta 앱에서 WP Admin 버튼을 클릭한 다음 WordPress 대시보드 에 액세스하기 위한 사용자와 비밀번호를 제공합니다.

WordPress 관리자 대시보드 로그인 화면.
워드프레스 로그인 양식.

로그인하면 WordPress 대시보드 가 ​​표시됩니다.

WordPress 관리자 화면에 오신 것을 환영합니다.
워드프레스 대시보드 페이지.

WordPress는 쿠키 인증을 표준 방법으로 사용합니다. 그러나 REST API를 사용하여 제어하려면 WordPress REST API에 대한 액세스 권한을 부여하는 기술로 인증해야 합니다.

이를 위해 응용 프로그램 암호를 사용합니다. WordPress에서 생성하고 웹사이트 관리 권한이 있는 사용자 프로필과 연결하는 24자 길이의 문자열입니다.

애플리케이션 비밀번호를 사용하려면 대시보드에서 플러그인 메뉴를 클릭한 후 동일한 이름의 플러그인을 검색합니다. 그런 다음 응용 프로그램 암호 플러그인을 설치하고 활성화합니다.

WordPress 애플리케이션 비밀번호 플러그인 설치 및 활성화.
WordPress용 애플리케이션 비밀번호 플러그인.

애플리케이션 비밀번호 생성을 시작하려면 먼저 사용자 메뉴를 확장하고 모든 사용자 를 클릭합니다.

확장된 사용자 WordPress 메뉴.
확장된 사용자 메뉴.

이제 관리자 이름 아래에 있는 편집 을 클릭합니다.

사용자 메뉴에서 WordPress 사용자 아래의 "편집" 버튼을 클릭합니다.
WP-Admin WordPress 인터페이스.

사용자 편집 페이지를 아래로 스크롤하여 응용 프로그램 암호 섹션을 찾습니다. 여기에 나중에 Python 앱 요청을 인증하고 REST API를 사용하는 데 사용할 애플리케이션 비밀번호의 이름을 제공합니다.

애플리케이션 비밀번호 플러그인 대시보드.
애플리케이션 비밀번호 페이지.

새 응용 프로그램 암호 추가 를 클릭하면 WordPress에서 임의의 24자 암호를 생성할 수 있습니다.

애플리케이션 비밀번호 플러그인에 의해 생성된 새 비밀번호입니다.
새 응용 프로그램 암호 페이지.

그런 다음 이 암호를 복사하여 나중에 사용할 수 있도록 안전한 위치에 저장합니다. 이 페이지를 닫으면 이 비밀번호를 검색할 수 없습니다.

마지막으로 영구 링크를 구성해야 합니다. WordPress를 사용하면 영구 링크 및 아카이브에 대한 사용자 지정 URL 구조를 만들 수 있습니다. 직관적인 URL https://your-website.local:port/your-first-wordpress-website/를 통해 "Your First WordPress Website"와 같은 WordPress 게시물에 액세스할 수 있도록 변경해 보겠습니다. 이 접근 방식은 향상된 유용성과 미학을 포함하여 여러 이점을 제공합니다.

영구 링크를 구성하려면 설정 섹션을 확장하고 영구 링크 메뉴를 클릭합니다. 여기에서 공통 설정게시물 이름으로 변경합니다.

WordPress 영구 링크 설정 변경.

Post 이름 구조를 사용하여 영구 링크 구조를 설정하는 것도 필요합니다. 그래야 나중에 JSON 형식을 사용하여 Python 코드에서 게시물을 검색할 수 있기 때문입니다. 그렇지 않으면 JSON 디코딩 오류가 발생합니다.

Python에서 WordPress를 제어하는 ​​방법

WordPress는 PHP로 작성되었지만 다른 프로그래밍 언어, 사이트 및 앱에서 콘텐츠를 사용할 수 있도록 하는 REST API가 있습니다. REST 아키텍처에서 WordPress 콘텐츠를 노출하면 JSON 형식으로 사용할 수 있습니다. 따라서 다른 서비스는 WordPress와 통합되어 로컬 WordPress 설치 없이도 생성, 읽기, 업데이트 및 삭제(CRUD) 작업을 수행할 수 있습니다.

다음으로 간단한 Python 앱을 빌드하여 WordPress REST API를 사용하여 게시물을 생성, 검색, 업데이트 및 삭제하는 방법을 확인합니다.

새로운 간단한 Python 프로젝트를 위한 새 디렉터리를 PythonWordPress 와 같은 이름을 지정합니다.

 ../PythonWordPress

이제 프로젝트에 대한 가상 환경을 만들어 설치된 Python 패키지의 독립적인 집합을 유지 관리하고 시스템 디렉터리에서 격리하고 버전 충돌을 방지할 수 있습니다. venv 명령을 실행하여 가상 환경을 만듭니다.

 python3 -m venv .venv

이제 명령을 실행하여 .venv 가상 환경을 활성화합니다. 이 명령은 OS에 따라 다릅니다.

  • Windows: .venvScriptsactivate
  • 맥/리눅스: .venv/bin/activate

다음으로 WordPress 계정과 관련된 구성을 저장합니다. Python 코드에서 앱 구성을 분리하려면 프로젝트 디렉터리에 .env 파일을 만들고 다음 환경 변수를 파일에 추가합니다.

 WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"

다행히도 Python 앱에서 위의 데이터를 읽는 것은 쉽습니다. 애플리케이션이 .env 파일에서 구성을 읽을 수 있도록 Python-dotenv 패키지를 설치할 수 있습니다.

 pip install python-dotenv

그런 다음 Python용 비동기 HTTP 클라이언트/서버인 aiohttp 를 설치합니다.

 pip install aiohttp

이제 다음 코드를 사용하여 app.py 라는 파일을 추가합니다.

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

위의 코드는 콘솔 메뉴를 표시하고 옵션을 선택하기 위해 숫자를 입력하도록 요청합니다. 다음으로 이 프로젝트를 확장하고 모든 게시물을 나열하고 해당 게시물 ID를 사용하여 특정 게시물을 검색할 수 있는 코드를 구현합니다.

코드에서 게시물 가져오기

WordPress REST API와 상호 작용하려면 새 Python 파일을 만들어야 합니다. 다음 내용으로 wordpress_api_helper.py 라는 파일을 만듭니다.

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

위의 iohttp 라이브러리 사용에 주목하십시오. 현대 언어는 비동기 프로그래밍을 가능하게 하는 구문과 도구를 제공합니다. 이렇게 하면 프로그램이 웹 요청, 데이터베이스 작업 및 디스크 I/O와 같은 작업과 함께 작업을 수행할 수 있으므로 응용 프로그램 응답성이 향상됩니다. Python은 비동기 프로그래밍 프레임워크의 기반으로 asyncio를 제공하며, aiohttp 라이브러리는 asyncio 위에 구축되어 Python에서 만든 HTTP 클라이언트/서버 작업에 대한 비동기 액세스를 제공합니다.

위의 ClientSession 함수는 비동기식으로 실행되고 우리 프로그램이 /wp-json/wp/v2/posts 끝점에 대해 HTTP GET 작업을 수행하는 데 사용하는 session 개체를 반환합니다. 모든 게시물 검색 요청과 특정 게시물 요청 간의 유일한 차이점은 이 마지막 요청이 URL 경로( /wp-json/wp/v2/posts/{id} )의 post id 매개변수를 전달한다는 것입니다.

이제 app.py 파일을 열고 import 문을 추가합니다.

 from wordpress_api_helper import get_all_posts, get_post

다음으로 get_all_postsget_post 함수를 호출하도록 main 함수를 수정합니다.

 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)

그런 다음 앱을 실행합니다.

 python app.py

그러면 응용 프로그램 메뉴가 표시됩니다.

WordPress에 연결된 Python 앱을 시작합니다.
파이썬 애플리케이션 메뉴.

이제 옵션 1을 사용하여 Python 앱이 검색하는 게시물 목록을 보고 옵션 2를 사용하여 게시물을 선택합니다.

옵션 1을 사용하여 Python 앱이 검색하는 게시물 목록을 보고 옵션 2를 사용하여 게시물을 선택합니다.
게시물 목록과 사용자가 선택한 단일 게시물을 표시하는 Python 앱.

코드에서 게시물 만들기

Python에서 WordPress 게시물을 만들려면 먼저 wordpress_api_helper.py 파일을 열고 create_post 함수를 추가하세요.

다운타임 및 WordPress 문제로 어려움을 겪고 계십니까? Kinsta는 시간을 절약하도록 설계된 호스팅 솔루션입니다! 우리의 기능을 확인하십시오
 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}')

이 코드는 session 객체에서 post 함수를 호출하여 REST API 끝점 URL 옆에 auth 매개변수를 전달합니다. 이제 auth 객체에 WordPress 사용자와 애플리케이션 비밀번호를 사용하여 생성한 비밀번호가 포함됩니다. 이제 app.py 파일을 열고 create_post 및 메뉴를 가져오는 코드를 추가합니다.

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

그런 다음 세 번째 메뉴 옵션을 추가합니다.

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

그런 다음 앱을 실행하고 옵션 3을 시도하고 제목과 콘텐츠를 전달하여 WordPress에서 새 게시물을 만듭니다.

Python으로 워드프레스 게시물 만들기.
새로 생성된 WordPress 게시물을 표시하는 Python 앱.

옵션 1을 다시 선택하면 새로 추가된 게시물의 ID와 제목이 반환됩니다.

새로 추가된 게시물의 id와 제목을 반환합니다.
새 게시물의 제목과 ID를 반환하는 Python 앱.

WordPress 웹사이트를 열어 새 게시물을 볼 수도 있습니다.

브라우저에서 새로 생성된 게시물입니다.
새 WordPress 게시물의 브라우저 이미지입니다.

코드에서 게시물 업데이트

wordpress_api_helper.py 파일을 열고 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}')

그런 다음 app.py 파일을 열고 update_post 및 메뉴를 가져오는 코드를 추가합니다.

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

그런 다음 네 번째 메뉴 옵션을 추가합니다.

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

그런 다음 앱을 실행하고 옵션 4를 시도하여 게시물 ID, 제목 및 콘텐츠를 전달하여 기존 게시물을 업데이트합니다.

WordPress 게시물 업데이트.
업데이트된 메뉴를 보여주는 Python 앱.

옵션 2를 선택하고 업데이트된 게시물 ID를 전달하면 새로 추가된 게시물의 세부정보가 반환됩니다.

새로 업데이트된 게시물의 세부정보를 반환합니다.
업데이트된 게시물을 보여주는 Python 앱.

코드에서 게시물 삭제

게시물 ID를 REST API에 전달하여 게시물을 삭제할 수 있습니다.

wordpress_api_helper.py 파일을 열고 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.')

이제 app.py 파일을 열고 delete_post 및 메뉴를 가져오는 코드를 추가합니다.

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

그런 다음 다섯 번째 메뉴 옵션을 추가합니다.

 elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)

이제 앱을 실행하고 WordPress에서 기존 게시물을 삭제하기 위해 ID를 전달하여 옵션 5를 시도합니다.

Python 앱으로 WordPress 게시물 삭제.
선택한 게시물의 삭제를 보여주는 Python 앱.

참고: 게시물 나열 옵션을 실행하면 삭제된 게시물이 계속 나타날 수 있습니다.

Python 앱 목록 게시물.
원본 게시물 목록을 보여주는 Python 앱.

게시물을 삭제했는지 확인하려면 몇 초 동안 기다렸다가 게시물 나열 옵션을 다시 시도하세요. 그리고 그게 다야!

요약

WordPress REST API와 Python의 HTTP 클라이언트 라이브러리 덕분에 Python 앱과 WordPress는 팀을 이루어 서로 대화할 수 있습니다. REST API의 장점은 Python 앱에서 원격으로 WordPress를 작동할 수 있다는 것입니다. Python의 강력한 언어를 사용하면 원하는 구조와 빈도에 따라 콘텐츠를 자동으로 생성할 수 있습니다.

DevKinsta를 사용하면 로컬 WordPress 사이트를 빠르고 쉽게 만들고 개발할 수 있습니다. WordPress 테마 및 플러그인 개발을 위한 로컬 환경을 제공하고 Docker 기반의 자체 포함 설치 모델을 통해 단순화된 배포 모델을 제공합니다.

Python 및 WordPress로 작업한 경험은 무엇입니까?

해당 경험을 확장할 준비가 되면 WordPress REST API 기본 사항에 대한 전체 가이드를 읽고 다른 가능성을 탐색할 수 있습니다.