WordPress. Работа с XML-RPC в Delphi. Читаем комментарии.

Источник: webdelphi

Продолжим разбираться с 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)

Информации по комментарию выдается более, чем достаточно для работы.

Так как метод содержит ряд необязательных параметров, то вначале попробуем действовать "в лоб", используя только обязательные параметры и посмотрим, что вернет нам метод.

Формируем запрос:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 значений, например, применительно к моему блогу это может быть:

  1. WordPress. Работа с XML-RPC в Delphi.
  2. WordPress. Работа с XML-RPC в Delphi.
  3. WordPress. Работа с XML-RPC в Delphi.
  4. WordPress. Работа с XML-RPC в Delphi.
  5. XML-RPC в Delphi. Первое знакомство с WordPress изнутри.
  6. XML-RPC в Delphi. Первое знакомство с WordPress изнутри.
  7. Подсветка синтаксиса. Алгоритм Delphi.
  8. Подсветка синтаксиса. Алгоритм Delphi.
  9. Подсветка синтаксиса. Алгоритм Delphi.
  10. Подсветка синтаксиса. Алгоритм Delphi.

Продолжаем разбираться. У метода есть необязательный параметр filter. Попробуем использовать его. Добавляем в функцию всего одну строку

1
2
3
[...]
  SetParam(tsString,'any_filter',@Doc);
[...]

Выполняем функцию и на выходе получаем список с заголовками постов для всех комментариев блога. Даже при такой малой части информации, получаемой из XML-документа (мы читаем только заголовки) у меня получился файл размером 23,5 Кб (всего на момент написания поста было 433 комментария). Теперь представьте сколько информации прокачивается по Сети вообще при таком запросе? Для моего случая получилось около 1 Мб за раз. Много, не экономично и может очень сильно "подвесить" программу. Поэтому в зависимости от ситуации будем получать либо последние 10 комментариев в блоге, либо использовать в запросе дополнительную структуру.

Как раз сейчас и научимся записывать структуры. Как Вы помните, структура, в отличие от массива содержит тег member и каждый member содержит название поля ( name ) и значение ( value ). Чтобы заполнить структуру данными можно, например, использовать вариантный массив в Delphi . Или использовать заранее определенный тип данных, который будет использоваться в работе с конкретным видом запросов к серверу. Вариантные массивы - это отдельная и довольно интересная тема (может рассмотрим её позднее), а сегодня просто учимся работе с XML-RPC в Delphi и используем второй вариант.

Заводим новый тип данных для структуры в запросе  wp.getComments:

1
2
3
4
5
6
7
type
TCommentStruct = record
  post_id: integer;
  status: string;
  offset: integer;
  number: integer;
end;

Теперь пишем метод для добавления структуры в документ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;

Пишу и представляю себе негодование программистов, читающих пост и восклицания типа: "Что за с..нь?!", "Кто так делает??" и т.д.  Поэтому сразу прошу у Вас прощения и в оправдание говорю следующее:

  1. Согласен, что использовать на каждый метод WordPress API свою запись и свой метод класса для добавления структуры в запрос - неэффективно, неправильно и вообще не логично
  2. Сейчас я просто хочу разобраться и показать Вам, что мы будем иметь на выходе, после выполнения запроса
  3. Обещаю, что в ближайшее время я предоставлю 1 метод для добавления любой структуры в документ.

Вроде бы все  Итак, продолжаем дальше. Дописываем  GetComments, например так:

1
2
3
4
5
6
7
8
9
10
11
12
[...]
  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, а я тем временем накидаю метод для добавления структуры в запрос.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=23207