all07

Всего понемногу ...

Вселенский опыт говорит, что погибают царства не оттого, что тяжек быт или страшны мытарства.
А погибают оттого (и тем больней, чем дольше), что люди царства своего не уважают больше. (Булат Окуджава)

Те, кто готовы пожертвовать насущной свободой в обмен на то, чтобы получить временную безопасность, — недостойны ни свободы ни безопасности. (Бенджамин Франклин)

Война — это мир! Свобода — это рабство! Незнание — сила! (Джордж Оруэлл)

WordPress: XML-RPC - побеждаем время

Довольно продолжительное время я пользуюсь XML-RPC протоколом WordPress для публикации своих статей. Все работает исправно (чур меня - как бы не сглазить), мой скрипт постепенно дополняется все новым функционалом. Единственная оставшееся проблема - не возможность задать произвольную дату и время публикации для новой статьи или изменить его для статей, уже находящихся на сервере. При изучении данного вопроса, оказалось - что "виновник" всему формат ISO 8601, в котором стандарт XML-RPC требует передавать дату и время.

Изучить данный формат - дело не хитрое, но даже задав строку в соответствии с его требованиями: 19700101T00:00:00Z (год из четырех цифр, месяц, день, разделитель символ "T", часы, минуты, секунды, символ "Z" указывает, что время дано по UTC) WordPress продолжал категорически отвергать все мои попытки повлиять на время публикаций. Дабы не "лезть в дебри" и не "заниматься изобретением очередного велосипеда", я решил узнать, как другие "соратники по несчастью" борятся с этой проблемой. Как оказалось - решение было совсем простое: необходимо просто убрать вызов метода getIso() (документации на него я не нашел) при обработке сервером XML-RPC строки, содержащей время в указанном формате, и все станет нормально работать. Для этого изменяем строку, которая находится в файле wp-includes/class-wp-xmlrpc-server.php:

  • $dateCreated = $post_data['post_date']->getIso();

на

  • $dateCreated = $post_data['post_date'];

Время постов стало изменятся, но только при условии, если задавать его с символом "Z" в конце строки, что означает - передаваемое время установлено по UTC, но я хочу передавать локальное время. При попытках передавать строку без "Z" - время не изменялось. Опять, приехали! И здесь без очередного "велосипеда" обойтись не удалось. Время, задаваемое в таком виде расходилось на четыре часа, которые надо учитывать при задании даты поста. Кроме того, сама запись времени в подобном формате не очень удобна для визуального восприятия, что бы непосредственно с ней работать. Для преодоления указанных неудобств пришлось дополнительно написать небольшой обработчик, поместив его в скрипт, для обработки шаблона статьи (об основных принципах работы скрипта я рассказывал в этой статье):

  • // ...
  •  else if ( $key == 'post_date' ) {
  •    $post_date = $value// значение ключа 'post_date' - дата в формате "1970-01-01 00:00:00"
  •    // проверяем правильность полученной строки (для простоты - только общий вид) и разбираем на части
  •    if( preg_match( '/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/', $post_date, $mt )) {
  •      date_default_timezone_set( 'UTC' ); // можно установить любую зону времени
  •      // вычитаем 4 часа
  •      $u_time_Z_post = mktime( $mt[4], $mt[5], $mt[6], $mt[2], $mt[3], $mt[1] ) - 3600 * 4;
  •      // приводим к форме ISO8601 UTC
  •      $meta['post_date'] = date( "Ymd\TH:i:s\Z", $u_time_Z_post );
  •    }       
  •  }
  •  // ...

Только после таких приемов, все стало на свои места. Конечно, можно было бы решить данную проблему на много элегантнее, и в свое оправдание, могу лишь сказать скромное: "оно - работает и лично меня такой вариант пока устраивает". Не смотря на недостатки предложенного решения, не оставляю надежды, что (возможно) мой опыт сможет дать некую отправную точку для всех интересующихся возможностями WordPress, в области обработки протокола XML-RPC.

Еще нет комментариев к «WordPress: XML-RPC - побеждаем время»

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Captcha Обновить картинку Каптчи

Пожалуйста, введите символы,
показанные внутри треугольников