Когда-то я писал пост про скрипт удаленной публикации в блог wordpress используя встроенный метод xmlrpc. Он до сих пор у меня работает на тех проектах, на которых я его обкатывал. Но сейчас, на другом сайте понадобилось мне задать вложенные категории для постов, причем делать это скриптом на автомате. Оказалось, что xml-rpc НЕ ПОДДЕРЖИВАЕТ эту фичу.
Самое интересное, что создать вложенную категорию можно, достаточно вместо названия категории задать ассоциативный массив с двумя переменными — «name» и «parent_id». Поковыряв xmlrpc я увидел кусок кода, который принимает в таком виде входные данные и уже дальше обращается к WP для создания такой категории.

Я долго искал то место, где происходит тоже самое, но в случае с публикацией поста. Но, как видно из анонса поста, не нашел. Там все просто — при публикации задается имя категории, на сервере xmlrpc преобразует имя в category_id и добавляет в БД в таблицу term_relationships строку о соответствии категории и поста. ВСЁ! Тут надо дать небольшое пояснение. Конечно, возможно, я слошил и в xmlrpc есть возможность задавать вложенные категории.. но я честно искал и не нашел. Если кто знает — буду рад узнать.

Так вот, из вышенаписанного следует, что если у вас все категории имеют уникальные названия, то не имеет значения, вложенные они или нет, публикации будут идти куда надо. Но у меня вложенные категории имели одинаковые названия с другими вложенными категориями другой категории, поэтому мне надо было найти способ публиковать посты, указывая не имя категории, а ее ID. Этот айди я могу узнать, использовав функцию получения всех категорий блога ($cats = $blog->wp_getCategories()). Эта функция возвращает в удобном виде все категории с указанием их имени, ID, parent_id, описания и пр.

Чтобы xmlrpc схавал ID категории вместо ее имени, я предлагаю очень простой хак, который позволит это сделать. Лезем в xmlrpc.php (который на сервере), ищем строку

// We've got all the data -- post it:

Чуть выше будет такая конструкция:

if ( is_array($catnames) ) {
    foreach ($catnames as $cat) {
        $post_category[] = get_cat_ID($cat);
    }
}

В цикле foreach как раз и происходит замена имени категории на ее ID. Надо заменить строку в цикле на

if (is_numeric($cat)) $post_category[] = $cat;
else $post_category[] = get_cat_ID($cat);

Таким образом, получается, что если при публикации поста будет в качестве категории указано число — оно будет приниматься как ID категории. Это накладывает некоторое ограничение — при таком хаке нельзя создавать категории с названием, состоящим только из цифр.