(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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, а я тем временем накидаю метод для добавления структуры в запрос.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Обсудить материал в конференции Embarcadero »
Написать редактору 
 Рекомендовать » Дата публикации: 21.01.2010 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Delphi Professional Named User
Enterprise Connectors (1 Year term)
DeviceLock Base (базовый компонент) от 1 ПК до 49 ПК
Panda Antivirus Pro - Лицензии для SMB - (лицензия на 1 год)
Купить WinRAR : 5 : Академическая лицензия 1 лицензия
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Разработка программ базы данных (54)
Написание прикладных компьютерных программ (базы данных) на заказ. Разработка корпоративных...
 
Беговая дорожка (3)
Купила беговую дорожку вот здесь https://4gym.com.ua/product/technogym-artis-run Очень классная,...
 
Аналоги виагры (3)
Если мужчине, по каким либо причинам, не подходит виагра, существуют качественные аналоги...
 
работа на дому! (8)
Доброго времени суток дорогие друзья. Многоуровневый маркетинг окончательно признан...
 
Отличается ли ДрифтКазино от беттинга? (16)
Друзья, давно заметил, что на Дрифте уже несколько месяцев во всю рекламируется и предлагается...
 
 
 



    
rambler's top100 Rambler's Top100