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>

*

*