Как использовать инструменты 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).

В-третьих, вы уверены, что хотите сделать это, отредактировав обычную страницу? Создание специальной страницы, которая просто генерирует список пользователей на лету, кажется мне гораздо менее хлопотным.

Другие вопросы по тегам