Как использовать инструменты Wiki Media API внутри расширения Wiki (WPMW) для записи / добавления контента на страницу
Привет всем!
Вот сцена:
Я работаю над сайтом Wordpress, пользователи которого должны быть интегрированы в настройку Media Wiki. Все отлично работает, используя расширение Media Wiki под названием WPMW. Когда пользователи из Wordpress входят в систему, они автоматически добавляются в базу данных пользователей Media Wiki и также становятся связанными с Wiki. Успех пока.
Вот что мне нужно сделать:
Мне нужно, после входа пользователя Wordpress + Media Wiki (через расширение WPMW), найти способ обновить одну конкретную страницу Media Wiki на основе информации, которую я собираю от текущего пользователя о процессе. Например: когда пользователь Wordpress с именем Olaf (рольредактора) подключается к Media Wiki, я хочу просто написать (добавить) на специальной странице Wiki (называемой Editor) имя Olaf, которое будет вместе с другими существующими именами.
Итак, я исследовал Media Wiki API и, следуя нескольким примерам, смог создать файл PHP, в котором после обращения к серверу он находит определенный код и добавляет к нему текст (даже с использованием шаблона Media Wiki, созданного ранее).). Снова успех, но только для самостоятельного использования... Мне нужно перейти на example.com/my-script.php, чтобы все заработало.
Вот проблема:
Я пытался вставить свой API-код в расширение WPMW, но очевидно, что все не так просто, и все перестало работать. Итак, мне интересно, что может быть правильным способом, в расширении Media Wiki, вызывать API Media Wiki и давать ему инструкции для добавления текста на страницу Media Wiki на основе переменных PHP, присутствующих в момент входа в WPMW исполнение?
Например: когда Олаф (редактор) вошел в Wordpress и перешел в вики, расширение WPMW становится активным и создает мост - путем автоматической регистрации Олафа в базе данных вики (если это его первый раз) - или просто регистрируя Олаф на сайт Media Wiki.
На данный момент я могу получить из Wordpress в качестве переменных все относящиеся ко мне данные, имя пользователя и роль пользователя. Но как их использовать, чтобы добавить имя Олафа на вики-страницу под названием " Редакторы"?
Вот мой код API, основанный на примерах, которые я нашел:
<?php
$settings['wikiroot'] = "http://example.com/wiki";
$settings['user'] = "shangchi";
$settings['pass'] = "my-password";
$settings['domain'] = 'Windows';
$settings['cookiefile'] = "cookies.tmp";
// Test: use a Wiki template to append to page
$prepend = "{{test}}\n\n";
function httpRequest($url, $post="") {
global $settings;
$ch = curl_init();
//Change the user agent below suitably
curl_setopt($ch, CURLOPT_USERAGENT, 'application/x-www-form-urlencoded');
curl_setopt($ch, CURLOPT_URL, ($url));
curl_setopt($ch, CURLOPT_ENCODING, "UTF-8" );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, $settings['cookiefile']);
curl_setopt($ch, CURLOPT_COOKIEJAR, $settings['cookiefile']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if (!empty($post)) curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
#UNCOMMENT TO DEBUG TO output.tmp
curl_setopt($ch, CURLOPT_VERBOSE, true); // Display communication with server
$fp = fopen("output.tmp", "w");
curl_setopt($ch, CURLOPT_STDERR, $fp); // Display communication with server
$xml = curl_exec($ch);
if (!$xml) {
throw new Exception("Error getting data from server ($url): " . curl_error($ch));
}
//var_dump($xml);
curl_close($ch);
return $xml;
}
function login ($user, $pass, $token='') {
global $settings;
$url = $settings['wikiroot'] . "/api.php?action=login&format=xml";
$params = "action=login&lgname=$user&lgpassword=$pass";
if (!empty($settings['domain'])) {
$params .= "&lgdomain=" . $settings['domain'];
}
if (!empty($token)) {
$params .= "&lgtoken=$token";
}
$data = httpRequest($url, $params);
if (empty($data)) {
throw new Exception("No data received from server. Check that API is enabled.");
}
$xml = simplexml_load_string($data);
if (!empty($token)) {
//Check for successful login
$expr = "/api/login[@result='Success']";
$result = $xml->xpath($expr);
if(!count($result)) {
throw new Exception("Login failed");
}
} else {
$expr = "/api/login[@token]";
$result = $xml->xpath($expr);
if(!count($result)) {
throw new Exception("Login token not found in XML");
}
}
return $result[0]->attributes()->token;
}
try {
global $settings;
$token = login($settings['user'], $settings['pass']);
login($settings['user'], $settings['pass'], $token);
// get edit token
$result = httpRequest($settings['wikiroot'] . "/api.php?action=query&format=json&meta=tokens");
$result = json_decode($result);
$editToken = $result->query->tokens->csrftoken;
// Get a specific wiki page: Main Page for testing
$result = httpRequest($settings['wikiroot'] . "/api.php?action=query&titles=Main%20Page&format=json&aplimit=500");
$result = json_decode($result);
$allpages = $result->query->pages;
foreach ($allpages as $page) {
echo "Fetching '{$page->title}' ({$page->pageid})...\n";
$revisions = httpRequest(sprintf($settings['wikiroot'] . "/api.php?action=query&prop=revisions&rvlimit=1&format=json&rvprop=content&titles=%s", urlencode($page->title)));
$revisions = json_decode($revisions);
if (isset($revisions->error)) {
echo "ERROR: " . $revisions->error->info . "\n";
continue;
}
$content = $revisions->query->pages->{$page->pageid}->revisions[0]->$star;
if (preg_match("/\{\{migration_/", $content)) {
echo "Already marked ... skipping.\n";
continue;
}
echo "Updating...";
// add text to content and edit page
$content = $prepend . $content;
$post = sprintf("title=%s&text=%s&token=%s", urlencode($page->title), urlencode($content), urlencode($editToken));
$result = httpRequest($settings['wikiroot'] . "/api.php?action=edit&format=json", $post);
echo "done\n";
}
echo ("Finished (".sizeof($allpages)." pages).\n");
} catch (Exception $e) {
die("FAILED: " . $e->getMessage());
}
?>
1 ответ
Во-первых, ознакомьтесь с этой статьей, чтобы узнать, как правильно вызывать API-интерфейс.
Во-вторых, правильный способ реагировать на событие - использовать ловушку (в вашем случае, вероятно, AddNewAccount).
В-третьих, вы уверены, что хотите сделать это, отредактировав обычную страницу? Создание специальной страницы, которая просто генерирует список пользователей на лету, кажется мне гораздо менее хлопотным.