Совершенствуйте свои навыки Python, подключив свое приложение к WordPress

Опубликовано: 2022-10-18

WordPress стал наиболее используемой системой управления контентом (CMS) во многом благодаря интерфейсу прикладного программирования (API). WordPress REST API позволяет WordPress «общаться» с другими приложениями, написанными на разных языках, включая Python.

Python — это расширяемый язык программирования с разнообразным использованием и понятным синтаксисом, что делает его мощным инструментом для удаленного управления контентом WordPress.

Вот несколько вариантов использования WordPress REST API для ваших приложений и то, как вы можете использовать Python для их поддержки:

  • Используйте предопределенные шаблоны, чтобы приложение могло быстро преобразовывать необработанные данные в отформатированные сообщения с пояснениями.
  • Создайте бэк-офисное приложение на Django и Python, которое отображает ограниченные по времени предложения для ваших клиентов каждый раз, когда происходит скидка или распродажа для конкретного объекта.
  • Интегрируйте скрипты Python для запуска на вашем сайте WordPress.

Этот учебник поможет вам создать простое консольное приложение Python, которое взаимодействует с API REST WordPress и выполняет операции. Также доступен полный код проекта.


Установка и настройка WordPress

Во-первых, давайте установим и запустим веб-сайт WordPress локально на вашем компьютере для разработки. Это отличный способ начать работу с WordPress, поскольку вам не нужно создавать учетную запись или покупать доменное имя для веб-хостинга.

Перед локальной установкой WordPress необходимо запустить на вашем компьютере некоторые компоненты, включая веб-сервер Apache, локальную базу данных и язык PHP, на котором написан WordPress.

К счастью, мы можем использовать DevKinsta, бесплатный локальный пакет разработки WordPress, доступный для всех основных операционных систем (для его использования не обязательно быть клиентом Kinsta).

DevKinsta доступен для Windows, Mac и Linux и устанавливает WordPress и все его зависимости на ваш локальный компьютер.

Перед установкой DevKinsta у вас должен быть запущен Docker локально, поэтому загрузите и установите Docker Engine, если вы еще этого не сделали.

После установки Docker Desktop вы можете автоматически загрузить пакет, подходящий для вашей ОС.

Скриншот страницы загрузки DevKinsta.
Страница установки DevKinsta.

Когда вы запускаете установщик DevKinsta, Docker сразу начинает инициализацию:

Стартовый экран Docker от DevKinsta.
DevKinsta запускает Docker локально.

Затем выберите « Новый сайт WordPress » в меню « Создать новый сайт »:

DevKinsta создает новый экран сайта WordPress.
Меню DevKinsta «Создать новый сайт».

Теперь установщик DevKinsta требует, чтобы вы создали учетные данные для учетной записи администратора WordPress:

Новый экран создания сайта WordPress от DevKinsta.
DevKinsta отображает форму нового сайта WordPress.

После установки DevKinsta становится самостоятельным приложением. Теперь вы можете получить доступ как к сайту WordPress (через кнопку « Открыть сайт »), так и к панели администратора WordPress (кнопка WP Admin ).

Информационный экран сайта DevKinsta WordPress.
Информационная панель сайта DevKinsta.

Затем вам нужно включить SSL и HTTPS для вашего сайта. Это повышает безопасность вашего веб-сайта с помощью SSL-сертификата.

Включение опции DevKinsta SSL и HTTPS.
Опция DevKinsta «SSL и HTTPS».

Теперь перейдите в приложение DevKinsta и нажмите кнопку « Открыть сайт ». Новая вкладка браузера покажет домашнюю страницу вашего сайта WordPress:

Домашняя страница вашего локального сайта WordPress.
Домашняя страница WordPress.

Это ваш блог WordPress, где вы можете начать писать. Но чтобы позволить Python получить доступ к REST API WordPress и использовать его, мы должны сначала настроить WordPress Admin.

Теперь нажмите кнопку WP Admin в приложении DevKinsta, затем укажите свой пользователь и пароль для доступа к панели инструментов WordPress :

Экран входа в панель администратора WordPress.
Форма входа в WordPress.

После входа в систему вы увидите панель инструментов WordPress :

Добро пожаловать на экран администратора WordPress.
Страница панели инструментов WordPress.

WordPress использует аутентификацию с помощью файлов cookie в качестве стандартного метода. Но если вы хотите управлять им с помощью REST API, вы должны пройти аутентификацию с помощью метода, который предоставляет доступ к WordPress REST API.

Для этого вы будете использовать пароли приложений. Это строки длиной 24 символа, которые WordPress генерирует и связывает с профилем пользователя, у которого есть разрешение на управление вашим сайтом.

Чтобы использовать пароли приложений, щелкните меню « Плагин » на панели инструментов, затем найдите подключаемый модуль с таким же именем. Затем установите и активируйте плагин Application Passwords:

Установка и активация плагина WordPress Application Passwords.
Плагин Application Passwords для WordPress.

Чтобы приступить к созданию пароля приложения, начните с расширения меню « Пользователи » и нажатия « Все пользователи »:

Расширенное меню пользователей WordPress.
Расширенное меню пользователей.

Теперь нажмите «Изменить » под своим именем администратора:

Нажмите кнопку «Изменить» под своим пользователем WordPress в меню «Пользователи».
Интерфейс WP-Admin WordPress.

Прокрутите вниз страницу « Редактировать пользователя » и найдите раздел « Пароли приложений ». Здесь укажите имя для пароля приложения, которое вы будете использовать позже для аутентификации запросов приложений Python и использования REST API:

Панель инструментов плагина Application Passwords.
Страница пароля приложения.

Нажмите « Добавить новый пароль приложения» , чтобы WordPress мог сгенерировать для вас случайный 24-значный пароль:

Новый пароль, сгенерированный плагином Application Passwords.
Страница нового пароля приложения.

Затем скопируйте этот пароль и сохраните его в безопасном месте, чтобы использовать позже. Помните, что вы не сможете восстановить этот пароль после закрытия этой страницы.

Наконец, вы должны настроить постоянные ссылки. WordPress позволяет вам создавать собственную структуру URL для ваших постоянных ссылок и архивов. Давайте изменим его так, чтобы запись WordPress под названием, например, «Ваш первый веб-сайт WordPress» могла быть доступна через интуитивно понятный URL-адрес https://your-website.local:port/your-first-wordpress-website/. Этот подход дает несколько преимуществ, включая улучшенное удобство использования и эстетику.

Чтобы настроить постоянные ссылки, разверните раздел « Настройки » и щелкните меню « Постоянные ссылки ». Здесь измените Общие настройки на Имя публикации :

Изменение настроек постоянной ссылки WordPress.

Установка структуры постоянной ссылки с использованием структуры имени сообщения также необходима, поскольку это позволит нам получать сообщения позже в нашем коде Python с использованием формата JSON. В противном случае будет выдана ошибка декодирования JSON.

Как управлять WordPress из Python

WordPress написан на PHP, но имеет REST API, который позволяет другим языкам программирования, сайтам и приложениям использовать его содержимое. Предоставление содержимого WordPress в архитектуре REST делает его доступным в формате JSON. Поэтому другие сервисы могут интегрироваться с WordPress и выполнять операции создания, чтения, обновления и удаления (CRUD) без необходимости локальной установки WordPress.

Далее вы создадите простое приложение Python, чтобы увидеть, как вы можете использовать WordPress REST API для создания, извлечения, обновления и удаления сообщений.

Создайте новый каталог для вашего нового простого проекта Python и назовите его как PythonWordPress :

 ../PythonWordPress

Теперь вы создадите виртуальную среду для своего проекта, что позволит ему поддерживать независимый набор установленных пакетов Python, изолируя их от ваших системных каталогов и избегая конфликтов версий. Создайте виртуальную среду, выполнив команду venv :

 python3 -m venv .venv

Теперь запустите команду, чтобы активировать виртуальную среду .venv . Эта команда зависит от ОС:

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

Затем сохраните конфигурацию, связанную с вашей учетной записью WordPress. Чтобы отделить конфигурацию приложения от кода Python, создайте файл .env в каталоге проекта и добавьте в него следующие переменные среды:

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

К счастью, прочитать приведенные выше данные из приложения Python несложно. Вы можете установить пакет Python-dotenv , чтобы ваше приложение могло считывать конфигурацию из файла .env :

 pip install python-dotenv

Затем установите aiohttp , асинхронный HTTP-клиент/сервер для Python:

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

Приведенный выше код отображает меню консоли и просит вас ввести число, чтобы выбрать вариант. Далее вы расширите этот проект и реализуете код, который позволит вам вывести список всех сообщений и получить определенное сообщение, используя его идентификатор сообщения.

Получение сообщений в коде

Для взаимодействия с 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("=====================================")

Обратите внимание на использование библиотеки aiohttp выше. Современные языки предоставляют синтаксис и инструменты для асинхронного программирования. Это повышает скорость отклика приложения, позволяя программе выполнять задачи наряду с такими операциями, как веб-запросы, операции с базами данных и дисковый ввод-вывод. Python предлагает asyncio в качестве основы для своей среды асинхронного программирования, а библиотека aiohttp построена поверх asyncio для обеспечения асинхронного доступа к операциям HTTP-клиент/сервер, выполненным в Python.

Приведенная выше функция ClientSession выполняется асинхронно и возвращает объект session , который наша программа использует для выполнения операции HTTP GET с конечной точкой /wp-json/wp/v2/posts . Единственная разница между запросом на получение всех сообщений и запросом на конкретное состоит в том, что этот последний запрос передает параметр post id в маршруте URL: /wp-json/wp/v2/posts/{id} .

Теперь откройте файл app.py и добавьте оператор import :

 from wordpress_api_helper import get_all_posts, get_post

Затем измените функцию main , чтобы она вызывала функции get_all_posts и 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)

Затем запустите приложение:

 python app.py

Затем вы увидите меню приложения:

Запуск приложения Python, подключенного к WordPress.
Меню приложения Python.

Теперь попробуйте вариант 1, чтобы просмотреть список сообщений, которые получает ваше приложение Python, и вариант 2, чтобы выбрать сообщение:

Попробуйте вариант 1, чтобы просмотреть список сообщений, которые получает ваше приложение Python, и вариант 2, чтобы выбрать сообщение.
Приложение Python, показывающее список сообщений и одно сообщение, выбранное пользователем.

Создание сообщений в коде

Чтобы создать запись WordPress на Python, начните с открытия файла 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}')

Этот код вызывает функцию post в объекте session , передавая параметр auth рядом с URL-адресом конечной точки REST API. Объект 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:

Создание поста WordPress с помощью Python.
Приложение Python, отображающее только что созданный пост WordPress.

Повторный выбор варианта 1 вернет идентификатор и заголовок вновь добавленного сообщения:

Возвращает идентификатор и заголовок вновь добавленного поста.
Приложение 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, передав идентификатор сообщения, заголовок и содержимое для обновления существующего сообщения.

Обновление записи WordPress.
Приложение Python с обновленным меню.

Выбор варианта 2 и передача обновленного идентификатора сообщения вернет сведения о недавно добавленном сообщении:

Возвращаем детали недавно обновленного поста.
Приложение Python, показывающее обновленный пост.

Удаление сообщений в коде

Вы можете передать идентификатор сообщения в 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)

Теперь запустите приложение и попробуйте вариант 5, передав идентификатор для удаления существующей записи в WordPress:

Удаление записи WordPress с помощью приложения Python.
Приложение Python, показывающее удаление выбранного сообщения.

Примечание. Удаленное сообщение может по-прежнему отображаться, если вы запустите параметр « Список сообщений »:

Публикации со списком приложений Python.
Приложение Python, показывающее исходный список сообщений.

Чтобы убедиться, что вы удалили публикацию, подождите несколько секунд и снова попробуйте опцию « Список сообщений ». Вот и все!

Резюме

Благодаря REST API WordPress и клиентским библиотекам HTTP Python приложения Python и WordPress могут объединяться и взаимодействовать друг с другом. Преимущество REST API заключается в том, что он позволяет вам управлять WordPress удаленно из приложения Python, где мощный язык Python позволяет автоматически создавать контент, соответствующий желаемой структуре и частоте.

DevKinsta позволяет быстро и легко создавать и развивать локальный сайт WordPress. Он предоставляет локальную среду для разработки тем и плагинов WordPress и предлагает упрощенную модель развертывания благодаря автономной модели установки на основе Docker.

Каков ваш опыт работы с Python и WordPress?

Когда вы будете готовы расширить этот опыт, вы можете прочитать Полное руководство по основам WordPress REST API, чтобы изучить другие возможности.