如何在Wiki扩展(WPMW)中使用Wiki Media API工具来向页面写入/添加内容


How to use Wiki Media API tools inside a Wiki extension (WPMW) to write/add content to a page

这是场景:

我正在开发一个Wordpress网站,该网站应该将其用户集成到媒体Wiki设置中。通过使用一个名为WPMW的媒体Wiki扩展,一切都很好。当Wordpress的用户登录时,他们会自动添加到Media Wiki用户数据库中,并成为Wiki的附属用户迄今为止的成功

以下是我需要做的:

我需要在Wordpress+Media Wiki用户登录后(通过WPMW扩展),根据我从当前用户那里收集的信息,找到一种更新单个特定Media Wiki页面的方法。例如:当Wordpress用户名为OlafEditor角色)连接到Media Wiki时,我只想在一个特殊的Wiki页面(称为Editor拉夫,该名称将与其他现有名称一起使用。

因此,我研究了媒体Wiki API,在下面的一些示例之后,我能够创建一个PHP文件,在服务器上访问后,它会定位特定的代码并将文本附加到其中(甚至使用之前构建的媒体Wiki模板)再次成功,但仅限于单独使用。。。我需要访问example.com/my-script.php才能使其正常工作。

问题是:

我试图在WPMW扩展中插入我的API代码,但很明显,事情并没有这么简单,一切都停止了工作。因此,我想知道,在媒体Wiki扩展内部调用媒体Wiki API并根据WPMW登录执行时出现的PHP变量向其发出指令以将文本附加到媒体Wiki页面的正确方法是什么?

例如:当Olaf(编辑)登录Wordpress并进入Wiki时,WPMW扩展会激活并建立桥梁——通过自动将Olaf注册到Wiki数据库(如果这是他第一次)——或者简单地将Olaf登录到Media Wiki网站。

此时,我可以从Wordpress中获得与我相关的所有数据,如用户名用户角色。但是,如何使用它们将Olaf名称附加到名为EditorsWiki页面

这是我的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());
}
?>

首先,请参阅本文,了解在内部调用API的正确方法。

其次,对事件做出反应的正确方法是使用钩子(在您的情况下,可能是AddNewAccount)。

第三,您确定要通过编辑普通页面来完成此操作吗?创建一个只生成动态用户列表的特殊页面对我来说似乎没有那么麻烦