Создание постов wordpress средствами python достаточно не сложный процесс.
Выясняя как это сделать, я обнаружил примеры либо слишком сложные либо очень простые.
Я не хотел использовать сложные методы аутентификации требующие установки специальных плагинов на блог. И мне нужен был пример с постом содержащим более одной строки.
Наиболее простой пример создания wordpress поста средствами Python это использовать библиотеку python-wordpress-xmlrpc.
Библиотека Python для создание постов WordPress
Для того чтобы создавать посты WordPress средствами Python потребуется всего одна библиотека: python-wordpress-xmlrpc.
Установить её можно командой Pip из командной строки.
pip install python-wordpress-xmlrpc
Импортируем необходимые классы из wordpress-xmlrpc
В начале вашего скрипта нужно импортировать несколько классов из библиотеки wordpress-xmlrpc:
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
from wordpress_xmlrpc.methods import posts
Как подключиться к вашему блогу на WordPress
Чтобы создавать посты или страницы блога на WordPress, вашему скрипту нужно подключиться к WordPress и пройти аутентификацию.
Для подключения к блогу потребуется:
- Адрес файла xmlrpc.php
- Логин
- Пароль
wp = Client('https://адрес_сайта.ру/xmlrpc.php', 'username', 'password')
Важно: на некоторых хостингах файл xmlrpc.php заблокирован и к нему нету доступа (это связано с безопасностью, т.к. через данный файл злоумышленники пытаются взломать сайт). Открывать доступ к xmlrpc.php через хостера плохая идея. Быстрее и проще сделать копию данного файла и переименовать его.
Задаём название поста и категорию
После подключения, следующими строчками кода создаём объект поста WordPress и задаём ему название и категорию.
Это создаёт объект поста:
Имейте в виду, что код не создаёт пост на WordPress. Мы просто создали объект в коде питона.
Название поста
Следующая строка задаёт название поста.
Обратите внимание, что когда вы задаёте название (title), нет необходимости указывать тег заголовка H1. В противном случае этот тег задвоится.
post.title = f'My Post Title'
Категория поста и метки
Можно задать одновременно и категорию и метки для поста.
Эти строки задают категорию поста. Если этого не сделать, то WordPress добавить пост в категорию по умолчанию.
post.terms_names = {
'category': ['name-of-category'],
'post_tag': ['tag1', 'tag2']
}
Создаём пост в WordPress используя Python
Итак, у нас есть название поста и категория, это необходимый минимум чтобы создать пост на нашем WordPress движке.
На самом деле категорию, тоже можно не указывать!
А как же насчет контента поста? Мы перейдём к этому в следующем разделе.
К этому моменту мы мы создали скелет поста. Вот всё что нам нужно:
post.id = wp.call(NewPost(post))
Ранее мы определили переменную «wp» как объект прошедший авторизацию на блоге. Функция NewPost() добавляет пост на ваш сайт WoredPress, и возвращает идентификатор ID, уникальный для каждого поста.
Теперь, если вы войдёте в админку WordPress, то обнаружите во вкладке «Все записи» черновик нового поста.
Черновик или опубликованный пост?
Я намеренно оставил пост в режиме черновика. Вы можете опубликовать сообщение немедленно, но это может быть нежелательно, когда вы тестируете код.
Но если вы захотели опубликовать пост? добавьте эти две строчки кода после вызова функции NewPost(). Функции EditPost() требуется передать уникальный идентификатор поста.
post.post_status = 'publish'
wp.call(posts.EditPost(post.id, post))
Пишем простой контент поста на Python
В простом примере найденном в интернете в качестве контента используется лишь одна строка текста.
Код при этом выглядит примерно так:
post.content = 'Hello World.'
post.id = wp.call(NewPost(post))
Этот пример заставил меня задуматься, а как обходиться с подзаголовками и другими элементами кода страницы.
Пример как создавать реалистичный WordPress пост на Python
Есть несколько способов как это можно сделать, но далее будет приведен наиболее простой для способ на мой взгляд.
Содержимое записи должно быть составлено на HTML, при этом блоки html должны быть обрамлены в специальную «обёртку» wordpress.
Вот пример создания многострочного поста блога wordpress:
wpcontent += f'<!-- wp:paragraph -->'
wpcontent = f'<p>Это открывающий абзац текста записи.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
wpcontent += f'<!-- wp:heading -->'
wpcontent += f'<h2>Первый заголовок поста</h2>'
wpcontent += f'<!-- /wp:heading -->'
wpcontent += f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это первый абзац следующий на первым заголовком H2.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
wpcontent += f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это второй абзац следующий на первым заголовком H2.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
На мой взгляд выглядит несколько громоздко. В принципе, можно написать функцию и передавать в неё просто html код, а она будет обрамлять теги в нужную обёртку wordpress в зависимости от тега. Можно в переменной wpcontent передавать просто html без «обёртки», но в таком случае пост будет написан в «классическом» режиме. Его можно будет преобразовать в «блоки» при редактировании поста из админки WordPress.
Когда контент поста готов, задайте атрибут post.content и создайте пост:
post.content = wpcontent
post.id = wp.call(NewPost(post))
Собираем всё вместе: готовый код
Вот скрипт Python который создаёт новый пост WordPress:
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
from wordpress_xmlrpc.methods import posts
def create_content():
wpcontent = f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это открывающий абзац текста записи.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
wpcontent += f'<!-- wp:heading -->'
wpcontent += f'<h2>Первый заголовок поста</h2>'
wpcontent += f'<!-- /wp:heading -->'
wpcontent += f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это первый абзац следующий на первым заголовком H2.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
wpcontent += f'<!-- wp:paragraph -->'
wpcontent += f'<p>Это второй абзац следующий на первым заголовком H2.</p>'
wpcontent += f'<!-- /wp:paragraph -->'
return wpcontent
def new_post(wpcontent):
wp = Client('https://адрес_сайта.ру/xmlrpc.php', 'login', 'password')
post = WordPressPost()
post.title = f'My Post Title'
post.content = wpcontent
post.terms_names = {
'category': ['test'],
'post_tag': ['tag1', 'tag2']
}
post.post_status = 'publish' # Сразу публикуем создаваемый пост минуя черновик
post.id = wp.call(NewPost(post))
if __name__ == '__main__':
wpcontent = create_content()
new_post(wpcontent)