Продолжим разбираться с XML-RPC и API WordPress. Сегодня попробуем научиться считывать комментарии из постов.
В прошлый раз мы остановились а чтении данных о постах, в частности, написали небольшую функцию для чтения заголовков постов и некоторой служебной информации. Эта информация нам пригодится, т.к. будет использоваться в нескольких методах, предоставляемых нам WordPress API.
Вообще, в xmlrpc.php есть следующие методы для работы с комментариями:
- wp.getCommentCount — возвращает количество комментариев к одной записи блога.
- wp.getComment — возвращает информацию по одному комментарию для одной записи блога.
- wp.getComments — возвращает список комментариев по заданному фильтру
- wp.editComment — редактирует комментарий
- wp.newComment — добавляет новый комментарий к записи
Сегодня рассмотрим работу с методом wp.getComments. Думаю, что информации будет достаточно.
Вначале рассмотрим входные параметры метода.
- (string) blog_id
- (string) username
- (string) password
- (struct) filter [необязательный параметр]
- (string) status (approve, hold, spam) [необязательный параметр]
- (int) post_id [необязательный параметр]
- (int) number [необязательный параметр — по умолчанию: 10]
- (int) offset [необязательный параметр]
Как видите, сегодня дополнительно научимся формировать запрос содержащий структуру (struct).
На выходе мы получим, как и в случае с чтением заголовков постов, массив структур, где каждая структура будет содержать следующие значения:
- (dateTime.iso8601) date_created_gmt
- (int) user_id
- (int) comment_id
- (int) parent
- (string) status (approve, hold, spam)
- (string) content
- (string) link
- (int) post_id
- (string) post_title
- (string) author
- (string) author_url
- (string) author_email
- (string) author_ip
- (string) type (<empty>, trackback, pingback)
Информации по комментарию выдается более, чем достаточно для работы.
Так как метод содержит ряд необязательных параметров, то вначале попробуем действовать «в лоб», используя только обязательные параметры и посмотрим, что вернет нам метод.
Формируем запрос:
function TBlog.GetComments: TComments; var i,j:integer; Doc: IXMLDocument; Values: IDOMNodeList;//все тэги value массива Members: IDOMNodeList;//все тэги member элемента value begin Doc:=GetDocument('wp.getComments'); SetParam(tsInt,'1',@Doc); SetParam(tsString,FUserName,@Doc); SetParam(tsString,FPassword,@Doc); SendQuery(@Doc,FURL); Doc.XML.SaveToFile(ExtractFilePath(Application.ExeName)+'comments.txt'); Values:=Doc.DOMDocument.getElementsByTagName('data').item[0].childNodes; SetLength(Result,Values.length); for i:= 0 to Values.length-1 do begin Members:=Values[i].firstChild.childNodes;//получили все members для 1 value for j:=0 to Members.length - 1 do begin with Result[i]do if j=8 then post_title:=(Members[j].lastChild.firstChild as IDOMNodeEx).text; IDOMNodeEx).text); end; end; end;
Здесь я считываю только заголовки постов (восьмое значение в структуре) для которых оставлен комментарий, используя уже имеющиеся методы для формирования запроса, просто чтобы проверить, что вернется от сервера.
В итоге получаем 10 значений, например, применительно к моему блогу это может быть:
- WordPress. Работа с XML-RPC в Delphi.
- WordPress. Работа с XML-RPC в Delphi.
- WordPress. Работа с XML-RPC в Delphi.
- WordPress. Работа с XML-RPC в Delphi.
- XML-RPC в Delphi. Первое знакомство с WordPress изнутри.
- XML-RPC в Delphi. Первое знакомство с WordPress изнутри.
- Подсветка синтаксиса. Алгоритм Delphi.
- Подсветка синтаксиса. Алгоритм Delphi.
- Подсветка синтаксиса. Алгоритм Delphi.
- Подсветка синтаксиса. Алгоритм Delphi.
Продолжаем разбираться. У метода есть необязательный параметр filter. Попробуем использовать его. Добавляем в функцию всего одну строку
[...] SetParam(tsString,'any_filter',@Doc); [...]
Выполняем функцию и на выходе получаем список с заголовками постов для всех комментариев блога. Даже при такой малой части информации, получаемой из XML-документа (мы читаем только заголовки) у меня получился файл размером 23,5 Кб (всего на момент написания поста было 433 комментария). Теперь представьте сколько информации прокачивается по Сети вообще при таком запросе? Для моего случая получилось около 1 Мб за раз. Много, не экономично и может очень сильно «подвесить» программу. Поэтому в зависимости от ситуации будем получать либо последние 10 комментариев в блоге, либо использовать в запросе дополнительную структуру.
Как раз сейчас и научимся записывать структуры. Как Вы помните, структура, в отличие от массива содержит тег member и каждый member содержит название поля (name) и значение (value). Чтобы заполнить структуру данными можно, например, использовать вариантный массив в Delphi. Или использовать заранее определенный тип данных, который будет использоваться в работе с конкретным видом запросов к серверу. Вариантные массивы — это отдельная и довольно интересная тема (может рассмотрим её позднее), а сегодня просто учимся работе с XML-RPC в Delphi и используем второй вариант.
Заводим новый тип данных для структуры в запросе wp.getComments:
type TCommentStruct = record post_id: integer; status: string; offset: integer; number: integer; end;
Теперь пишем метод для добавления структуры в документ:
procedure TBlog.SetStructComment(Document: PXMLDocument; Struct: TCommentStruct); var Root,Member: IXMLNode; begin Root:=Document^.DocumentElement.ChildNodes.FindNode('params'); Root:=Root.AddChild('param').AddChild('struct');//добавляем тэг структуры member:=Root.AddChild('member'); member.AddChild('name').NodeValue:='post_id'; member.AddChild('value').AddChild('int').NodeValue:=Struct.post_id; member:=Root.AddChild('member'); member.AddChild('name').NodeValue:='status'; member.AddChild('value').AddChild('string').NodeValue:=Struct.status; member:=Root.AddChild('member'); member.AddChild('name').NodeValue:='offset'; member.AddChild('value').AddChild('int').NodeValue:=Struct.offset; member:=Root.AddChild('member'); member.AddChild('name').NodeValue:='number'; member.AddChild('value').AddChild('int').NodeValue:=Struct.number; end;
Пишу и представляю себе негодование программистов, читающих пост и восклицания типа: «Что за с..нь?!», «Кто так делает??» и т.д. Поэтому сразу прошу у Вас прощения и в оправдание говорю следующее:
- Согласен, что использовать на каждый метод WordPress API свою запись и свой метод класса для добавления структуры в запрос — неэффективно, неправильно и вообще не логично
- Сейчас я просто хочу разобраться и показать Вам, что мы будем иметь на выходе, после выполнения запроса
- Обещаю, что в ближайшее время я предоставлю 1 метод для добавления любой структуры в документ.
Вроде бы все :) Итак, продолжаем дальше. Дописываем GetComments, например так:
[...] var Struct: TCommentStruct; [...] SetParam(tsString,FPassword,@Doc); Struct.post_id:=2068; Struct.status:='approve'; Struct.offset:=0; Struct.number:=100; SetStructComment(@Doc,Struct); [...]
В результате получимтело запроса со следующим содержимым:
<?xml version="1.0"?> <methodCall> <methodName>wp.getComments</methodName> <params> <param> <value><int>1</int></value> </param> <param> <value><string>admin</string></value> </param> <param> <value><string>vlad383</string></value> </param> <param> <struct> <member> <name>post_id</name> <value><int>2068</int></value> </member> <member> <name>status</name> <value><string>approve</string></value> </member> <member> <name>offset</name> <value><int>0</int></value> </member> <member> <name>number</name> <value><int>100</int></value> </member> </struct> </param> </params> </methodCall>
В результате для поста с id=2068 мы получим первые 100 или, если комментариев меньше, то все посты, которые были одобрены и опубликованы в блоге.
Аналогичным образом получаются данные по комментариям с отметкой «спам» или «на модерации».
Другие методы для работы с комментариями, я полагаю, рассматривать не стоит,т.к. в них используются те же простые запросы и данные только в другом порядке и повторять одно и тоже как-то нет желания. Так что пока можете поучиться работать с методом GetComments, а я тем временем накидаю метод для добавления структуры в запрос.
[…] прошлый раз я рассматривал процедуру получения комментариев из […]