На днях встал вопрос автопостинга в cms WordPress на Delphi, хоть код и функция на php у меня и была написано под это дело, но я с толкнулся с проблемкой, прежде чем разобрать код постинга, опишу сначала её.
В WordPress стоит функция защиты которая при постинге, функция wp_insert_post (собственно которая осуществляет постинг) использует функцию sanitize_post, которая в свою очередь удаляет весь JavaScript код и нежелательный html, например вставки embded, iframe и т.п. чем можно подгрузить данные с левого хоста тем самым заюзав XSS и прочего вида уязвимости.
Поэтому, если хотите использовать JavaScript в своей программе, то следует в своём шаблоне отредактировать файл который лежит тут ‘../wp-includes/post.php’. Открываем файл post.php, ищем там функцию sanitize_post, после необходимо закомментировать всё её содержимое кроме последней строки ‘return $post;’.
Важно! Саму функцию стоит оставить, необходимо закомментировать только содержимое, то есть должно получится что-то типа этого
function sanitize_post() {
/*
тут код
*/
return $post;
}
Вот собственно и всё, теперь wp_insert_post будет пропускать любой код в том числе и JS. Вообще-то полезная функция, игнорируя которую можно как самому так и посетителей инфицировать различной вредносной штукой, поэтому следует раскомментировать её после работы, для большей надёжности. Теперь перейдём к постингу, как я уже писал в начале, сам постинг будем осуществлять с помощью WordPress функции wp_insert_post которой передаётся множество параметров, мол указание статуса, типа поста и прочее. Всё разбирать не будем, а только основное. Сразу привожу код который будет публиковать запись на сайте т.е. файл на php
require_once('wp-config.php'); // Указываем путь к wp-config.php
$mess = $_POST['mess'];
$capt = $_POST['capt'];
$meta = $_POST['meta'];
$capt = iconv("CP1251", "UTF-8", $capt); // заголовок
$mess = iconv("CP1251", "UTF-8", $mess); // сообщение
$meta = iconv("CP1251", "UTF-8", $meta); // и теги преобразуем в utf8
// Ниже идёт заполнение массива my_post который содержит необходимые нам настройки для функции wp_insert_post
$my_post = array(
'post_title' => $capt, // Указываем заголовок
'post_content' => $mess, // Тело контента
'post_type' => 'post', // Тип записи - пост, страница и т.п.
'post_status' => 'publish', // Статус - опубликовано
'post_category' => array(6), // Здесь по желанию через запятую можно указать айди рубрики в которую будет опубликован пост
'post_author' => 1, // айди юзера
'tags_input' => $meta // теги или как их ещё называют метки, указывать через запятую
);
wp_insert_post( $my_post ); // собственно вызываем функцию постинга и передаём наш массив данных
}
Теперь перейдём к коду на Delphi. Алгоритм работы простой — собираем данные в tstringlist и передаём данные нашему скрипту с помощью POST запроса, компонентом tidhttp. Кидаем на форму idhttp, button и memo затем в обработчик события onclick кнопки пишем:
var ts:tstringlist;
begin
...
ts:=tstringlist.create();
ts.add('mess='+memo1.lines.text);
ts.add('capt='+edit2.text);
ts.add('meta='+edit3.text);
idhttp1.post('http://site-pod-posting/script.php',ts);
Вот в принципе и всё, переменной mess присваиваем текст из мемо, затем берём заголовок с тегами из едитов и делаем POST запрос. Подобная конструкция используется в моей программе kinoposter. На этом у меня всё, удачи.