На днях встал вопрос автопостинга в 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. На этом у меня всё, удачи.