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

Продовжимо розбиратися з XML-RPC та API
WordPress. Сьогодні спробуємо навчитися
зчитувати коментарі з постів.

Минулого разу ми зупинилися а читанні
даних про пости, зокрема, написали
невелику функцію для читання заголовків
постів і деякої службової інформації.
Ця інформація нам стане в нагоді, тому що буде
використовуватися в декількох методах,
надаються нам WordPress API.

Взагалі, в xmlrpc.php
є такі методи для роботи з
коментарями:

Сьогодні розглянемо роботу з методом
wp.getComments.
Думаю, що
інформації буде достатньо.

Спочатку розглянемо вхідні параметри
методу.

Як бачите, сьогодні додатково
навчимося формувати запит містить
структуру (struct).

На виході ми отримаємо, як і у випадку з
читанням заголовків постів, масив структур,
де кожна структура буде містити
наступні значення:

Інформації з коментарю видається більш,
ніж достатньо для роботи.

Так як метод містить ряд необов'язкових
параметрів, то спочатку спробуємо діяти
"В лоб", використовуючи тільки обов'язкові
параметри і подивимося, що поверне нам метод.

Формуємо запит:

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*