WordPress xmlrpc call Beispiel XML

Nachdem ich jetzt relativ lange nach einen Beispiel XML Code für das Erstellen eines Blogeintrages auf einer WordPress Instanz gesucht habe hier ein Bsp XML. Leider nur metaWeblog.newPost und nicht wp.newPost, die Hilfeseiten auf der WordPress.org Seite lassen leider sehr zu wünschen übrig. Es ist nicht ersichtlich wie das XML aussehen soll meiner Meinung nach,


<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.newPost</methodName>
<params>
<param><value><int>1</int></value></param>
<param><value><string>admin</string></value></param>
<param><value><string>password</string></value></param>
<param><value><struct>
  <member><name>title</name><value><string>Beitragstitle</string></value></member>
  <member><name>categories</name><value><array><data>
  <value><string>Kategorie 1</string></value>
  <value><string>Kategorie 2</string></value>
</data></array></value></member>
  <member><name>mt_keywords</name><value><string>tag1, tag2, tag3</string></value></member>
  <member><name>content</name><value><string>Hier könnte Inhalt stehen</string></value></member>
</struct></value></param>
<param><value><boolean>1</boolean></value></param>
</params></methodCall>
 

Hier das Script für das Erzeugen des XML, mit der Klasse die im WordPress Ordner liegt.

<!--?php require_once("../wp-includes/class-IXR.php"); 
$rpc = new IXR_Client('http://localhost/wordpress/xmlrpc.php'); 
$post = array(); // das Post construct: // Metadaten 
$post['title']     = 'Beitragstitle'; 
$post['categories']   = array('Kategorie 1', 'Kategorie 2'); 
$post['mt_keywords']   = 'tag1, tag2, tag3'; // Posttext 
$post['content']   = 'Hier könnte Inhalt stehen'; 

print_r($rpc--->getXml('metaWeblog.newPost', // Methode
1, // Blog ID, in der Regel 1
'username', // Benutzer
'password', // Passwort
$post, // Post construct
true // Veröffentlichen?
));

echo "\n \n send to server \n";
$status = $rpc-&gt;query('metaWeblog.newPost', // Methode
1, // Blog ID, in der Regel 1
'username', // Benutzer
'password', // Passwort
$post, // Post construct
true // Veröffentlichen?
);

// Ergebnis überprüfen und ggf. eine Fehlermeldung ausgeben
if(!$status) {
echo 'Error ('.$rpc-&gt;getErrorCode().'): '.$rpc-&gt;getErrorMessage();
echo " \n";
exit;
}

// Sonst: ID des neuen Posts ausgeben
echo 'New Post ID: '.$rpc-&gt;getResponse();
echo " \n";

http://felixtriller.de/2009/12/22/wordpress-mit-php-und-xml-rpc-bloggen/. Code wurde hier entnommen und die Klasse wurde um 1e Methode erweitert.



    function getXml($args){
        $args = func_get_args();
        $method = array_shift($args);
        $request = new IXR_Request($method, $args);
        return $request->getXml();
    }

Language Switch

Heute stelle ich eine Lösung für einen Language switch im Zend2 Framework mit Ajax und Cookies.

Zu allererst muss die module.config.php Datei angepasst werden. In der Sekeletton Application von Zend2 ist der Translator bereits Konfiguriert und im Service Manager eingebunden. Ich habe lediglich die Übersetzungsdatei auf ein php – Array umgestellt:

(type => phparray und pattern => %s.php)


    'service_manager' => array(
        'factories' => array(
            'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
        ),
    ),
    'translator' => array(
        'locale' => 'de_DE',
        'translation_file_patterns' => array(
            array(
                'type'     => 'phparray',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.php',
            ),
        ),
    ),

Außerdem habe ich für die Cookies die Module Klasse modifiziert:


class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        $e->getApplication()->getServiceManager()->get('translator');

        $translator = $e->getApplication()->getServiceManager()->get('translator');
        if(isset($e->getRequest()->getCookie()->language) && $e->getRequest()->getCookie()->language != '' && $e->getRequest()->getCookie()->language != null){
            $language = $e->getRequest()->getCookie()->language;
            $translator->setLocale($language)->setFallbackLocale('en_EN');
        }
     }
}

Hierbei wird der Translator geladen. Weiters wird in der onBoostrap – Methode der Request abgefangen und ausgelesen. Ich hole mir mithilfe von getCookie() die Cookies aus den Request. Warum hier konkret language geholt wird werden wir anschließend im Controller sehen. Wenn die Sprache gesetzt worden ist wird sie dem Translator übergeben bzw. die Locale gesetzt. Also jene Variable die die Sprache bestimmt. Als Fallback wird hier z.B. Englisch angenommen.

Weiters benötigen wir für die Lösung einen Controller der uns den Cookie setzt. ich habe ihn hier in einen ApiController von mir geladen der Json für den Ajax Call als Antwort zurückliefert.


class LanguageApiController extends AbstractActionController
{

   public function indexAction(){
      $language = htmlspecialchars($this->getRequest()->getQuery('language', 'de_DE'));
      $cookie = new SetCookie('language', $language);
      $this->getResponse()->setStatusCode(Response::STATUS_CODE_201);
      $this->getResponse()->getHeaders()->addHeader($cookie);
      return new JsonModel(array('cookiecreated'=>'ok', 'language'=>$language));
   }
}

Hier wird, wie wir später noch sehen werden, einfach die Sprache mit einen GET Parameter gesetzt. Es wird ein Cookie erstellt der ‚language‘ auf den ausgelesen Wert speichert. Anschließend wird er der Response übergeben und dem Header des Requests hinzugefügt. Zum Schluss benötigen wir noch das notwendige JavaScript um die Sprache umzustellen.


$(document).ready(function(){

    $(document).on('click','a[data-action|=languagechanger]',function(event){
        event.preventDefault();

        $.ajax({
            url: baseUrl + '/languagesetter',
            data: 'language='+$(this).attr('data-value')
        }).always(function(){
           location.reload();
        });
    })

});

Mit dieser einfachen Methode wird nun der Controller aufgerufen und der Cookie gesetzt. Anschließend wird die Seite neu geladen und wir haben die Sprache im Cookie gespeichert. Wir können nun einfach in der View die translate Methode des Viewhelpers aufrufen.


## übersetzungsfile
return array(
    'Search'=>'Suche', 
....);

## in der view
echo $this->translate('Search')