<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>juust ~ php oddities &#187; xml-rpc</title>
	<atom:link href="http://www.juust.org/index.php/tag/xml-rpc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.juust.org</link>
	<description>Link theory and search engine optimization</description>
	<lastBuildDate>Thu, 19 Jan 2012 09:39:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>RpSequel : rfc sql crud with wordpress</title>
		<link>http://www.juust.org/index.php/rpsequel-rfc-sql-crud-with-wordpress/2009/10/</link>
		<comments>http://www.juust.org/index.php/rpsequel-rfc-sql-crud-with-wordpress/2009/10/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 09:50:07 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=1011</guid>
		<description><![CDATA[I set out to use MsAccess with xhr/ajax to maintain tables I added to my wordpress database, from my desktop. (Because I suck at html forms backends and consider them a waste of time.) I used a similar technique ten &#8230; <a href="http://www.juust.org/index.php/rpsequel-rfc-sql-crud-with-wordpress/2009/10/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I set out to use MsAccess with xhr/ajax to maintain tables I added to my wordpress database, from my desktop. (Because I suck at html forms backends and consider them a waste of time.) </p>
<p>I used a similar technique ten years ago, setting up msaccess as reporting tool for SAP R/3 with RFC dll&#8217;s and ActiveX. That remained stable for eight years without maintenance. Hey, I might get lucky with WordPress xml-rpc and xhr/ajax.</p>
<p>I called the example RpSequel.</p>
<h3>adding sql rpc functions</h3>
<p>To sync the data sets, I will duplicate a list with sequel operations from my desktop database as rfc call to my blog&#8217;s  xmlrpc-endpoint. To handle that list, I plug a sql crud method into the xml-rpc method array in WordPress :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">add_filter<span class="br0">&#40;</span> <span class="st0">&#39;xmlrpc_methods&#39;</span><span class="sy0">,</span> <span class="st0">&#39;rpsequel_methods&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> rpsequel_methods<span class="br0">&#40;</span> <span class="re1">$methods</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$methods</span><span class="br0">&#91;</span><span class="st0">&#39;rpsequel.rpsequelInsert&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;rpsequelInsert&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$methods</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> rpsequelInsert<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The basic INSERT method itself can be simple:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> rpsequelInsert<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">global</span> <span class="re1">$wpdb</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the first parameters</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$blog_id</span> <span class="sy0">=</span> <span class="br0">&#40;</span>int<span class="br0">&#41;</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$username</span> <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$password</span> <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$tablename</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//get the structs</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$structs</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//pick the first </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$struct</span> <span class="sy0">=</span> <span class="re1">$structs</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//compose the mysql insert statement &nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$struct</span> <span class="kw1">as</span> <span class="re1">$key</span> <span class="sy0">=&gt;</span> <span class="re1">$value</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$SqlFields</span> <span class="sy0">.=</span> <span class="st0">&quot; `&quot;</span><span class="sy0">.</span><span class="re1">$key</span> <span class="sy0">.</span> <span class="st0">&quot;`,&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$SqlValues</span> <span class="sy0">.=</span> <span class="st0">&quot; &#39;&quot;</span><span class="sy0">.</span><span class="re1">$value</span> <span class="sy0">.</span> <span class="st0">&quot;&#39;,&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$SqlFields</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$SqlFields</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$SqlFields</span><span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$SqlValues</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$SqlValues</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$SqlValues</span><span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$SqlStatement</span> <span class="sy0">.=</span> <span class="st0">&quot;INSERT INTO &quot;</span><span class="sy0">.</span><span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prefix</span><span class="sy0">.</span><span class="re1">$tablename</span><span class="sy0">.</span> <span class="st0">&quot; (&quot;</span><span class="sy0">.</span> <span class="re1">$SqlFields</span> <span class="sy0">.</span> &nbsp;<span class="st0">&quot;) VALUES (&quot;</span><span class="sy0">.</span><span class="re1">$SqlValues</span> <span class="sy0">.</span> <span class="st0">&quot;)&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//execute the query &nbsp; &nbsp; &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prepare</span><span class="br0">&#40;</span><span class="re1">$SqlStatement</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//return the record id</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">insert_id</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That in itself is not very exciting, it stuffs records in the host&#8217;s database. Which is fine, however, I want the blog to respond to individual operations. </p>
<p>I can write rpc-functions for every single function I want the blog to perform, that means truckloads of rpc-functions, on both client and server end. I am incredibly lazy, so I ain&#8217;t gonna go there.</p>
<h3>adding hooks to sql rpc functions</h3>
<p>Lucky for me, WordPress has hooks, hooks are cool. </p>
<p>Adding action hooks (before_insert and after_insert) to the crud method makes it more powerful. Two hooks are enough to separate the business logic of the desktop database from the blogs reporting logic.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> rpsequelInsert<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">global</span> <span class="re1">$wpdb</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the first parameters</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$blog_id</span> <span class="sy0">=</span> <span class="br0">&#40;</span>int<span class="br0">&#41;</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$username</span> <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$password</span> <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$tablename</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//get the structs</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$structs</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//here is the first action hook,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//it hands the tablename and the records over to any</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//function that &#39;listens&#39; on the action hook</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">do_action<span class="br0">&#40;</span><span class="st0">&#39;rpsequel_before_insert&#39;</span><span class="sy0">,</span> &nbsp;<span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$structs</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the rest of the rather dull method</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$struct</span> <span class="sy0">=</span> <span class="re1">$structs</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//&#8230;. </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//execute the query &nbsp; &nbsp; &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prepare</span><span class="br0">&#40;</span><span class="re1">$SqlStatement</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//here is the second action hook,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//it hands the table name with the new record id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//to any function that &#39;listens&#39; on the action hook</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">do_action<span class="br0">&#40;</span><span class="st0">&#39;rpsequel_after_insert&#39;</span><span class="sy0">,</span> &nbsp;<span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">insert_id</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//return the record id</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">insert_id</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now it is more exciting. </p>
<ul>
<li>I can send a list of records and a rfc insert-method to the blogs xmlrpc endpoint</li>
<li>the rfc crud-plugin can process the records one by one</li>
<li>Before and after each insert operation, the method triggers an action. </li>
<li>Before inserting, it exposes the record data.</li>
<li>After inserting, it exposes the record id.</li>
</ul>
<p>And the last two, was exactly what I wanted. </p>
<h3>adding functionality with plugins</h3>
<p>Now I can add tiny plugins, that &#8216;listen&#8217; on the action hooks in the rfc-methods. If there is an INSERT into the database, my plugins read which table it affects. They can perform actions, either before the insert, with the new record data, or after the insert, with the new record id.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">add_action <span class="br0">&#40;</span> <span class="st0">&#39;rpsequel_before_insert&#39;</span><span class="sy0">,</span> <span class="st0">&#39;before_insert_logic&#39;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">add_action <span class="br0">&#40;</span> <span class="st0">&#39;rpsequel_after_insert&#39;</span><span class="sy0">,</span> <span class="st0">&#39;after_insert_logic&#39;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> before_insert_logic<span class="br0">&#40;</span><span class="re1">$rpc_tablename</span><span class="sy0">,</span> <span class="re1">$rpc_array</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$rpc_tablename</span><span class="sy0">==</span><span class="st0">&quot;ships&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//do some stuff before inserting incoming records</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> after_insert_logic<span class="br0">&#40;</span><span class="re1">$rpc_tablename</span><span class="sy0">,</span> <span class="re1">$rpc_insert_id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$rpc_tablename</span><span class="sy0">==</span><span class="st0">&quot;ships&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//do some stuff after inserting incoming records</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s basically all it takes. As technique, it has it&#8217;s limitations, but it can come in handy sometimes. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/rpsequel-rfc-sql-crud-with-wordpress/2009/10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>integrating ms office and wordpress with vba and xml-rpc</title>
		<link>http://www.juust.org/index.php/integrating-ms-office-and-wordpress-with-vba-and-xml-rpc/2009/10/</link>
		<comments>http://www.juust.org/index.php/integrating-ms-office-and-wordpress-with-vba-and-xml-rpc/2009/10/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 11:20:53 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[juust]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xml-rpc]]></category>
		<category><![CDATA[vba]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=979</guid>
		<description><![CDATA[Okay. Yesterday I made some basic stuff to grab my WordPress blog data with visual basic for applicationsn cos I don&#8217;t feel like programming php admin pages for tables. So let&#8217;s make a basic xml-rpc crud plugin and put my &#8230; <a href="http://www.juust.org/index.php/integrating-ms-office-and-wordpress-with-vba-and-xml-rpc/2009/10/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Okay. </p>
<p>Yesterday I made some basic stuff to grab my WordPress blog data with visual basic for applicationsn cos I don&#8217;t feel like programming php admin pages for tables. </p>
<p>So let&#8217;s make a basic xml-rpc crud plugin and put my agenda on vba remote control.</p>
<p>The basic xml-rpc plugin is simple, plug extra methods into the xml-rpc method array, and write a function per crud-method. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">add_filter<span class="br0">&#40;</span> <span class="st0">&#39;xmlrpc_methods&#39;</span><span class="sy0">,</span> <span class="st0">&#39;add_agenda_xmlrpc_methods&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> add_agenda_xmlrpc_methods<span class="br0">&#40;</span> <span class="re1">$methods</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$methods</span><span class="br0">&#91;</span><span class="st0">&#39;agenda.addAgendaItem&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;addAgendaItem&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$methods</span><span class="br0">&#91;</span><span class="st0">&#39;agenda.updateAgendaItem&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;updateAgendaItem&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$methods</span><span class="br0">&#91;</span><span class="st0">&#39;agenda.deleteAgendaItem&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;deleteAgendaItem&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$methods</span><span class="br0">&#91;</span><span class="st0">&#39;agenda.reportAgendaItem&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;reportAgendaItem&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$methods</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> addAgendaItem<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> updateAgendaItem<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> deleteAgendaItem<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> reportAgendaItem<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//basic login helper function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> CheckLogin<span class="br0">&#40;</span><span class="re1">$user</span><span class="sy0">,</span> <span class="re1">$pwd</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>There now, if I call on the xmlrpc.php file, the extra methods are added to the callback array and I can use the table CRUD functions from my vba desktop.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> addAgendaItem<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$blog_id</span> <span class="sy0">=</span> <span class="br0">&#40;</span>int<span class="br0">&#41;</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$username</span> <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$password</span> <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$AgendaItem</span> &nbsp; &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//remember : add a login check</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//(for the example it is irrelevant)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">global</span> <span class="re1">$wpdb</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$sql</span> <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO &quot;</span><span class="sy0">.</span><span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prefix</span><span class="sy0">.</span><span class="st0">&quot;Agenda (</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`userid`, `tags`, `description`, `firstdate`, `enddate`, `link`, `price`, `location`</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;) VALUES (</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;userid&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;tags&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;description&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;firstdate&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;enddate&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;link&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;price&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39;,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$AgendaItem</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;location&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prepare</span><span class="br0">&#40;</span><span class="re1">$sql</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">insert_id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>note : the agendaitem is a struct in an array (see below), I use [0] to get the first struct (which is the actual array with field-value pairs, my record with agenda info).</p>
<p>Activate the plugin, and write a simple test </p>
<div class="geshi no vb">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;Type to hold an agenda info record</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">Type</span> AgendaItem</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; userid <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; tags <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Description <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; firstdate <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; enddate <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; link <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; price <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">End</span> <span class="kw1">Type</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">Function</span> AddAgendaItem<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">txtURL = <span class="st0">&quot;http://wwwblog.com/xmlrpc.php&quot;</span></div>
</li>
<li class="li1">
<div class="de1">txtUserName = <span class="st0">&quot;MyUsername&quot;</span></div>
</li>
<li class="li1">
<div class="de1">txtPassword = <span class="st0">&quot;MyPassword&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">Dim</span> objSvrHTTP <span class="kw1">As</span> ServerXMLHTTP</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">Dim</span> strT <span class="kw1">As</span> <span class="kw1">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">Set</span> objSvrHTTP = <span class="kw1">New</span> ServerXMLHTTP</div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; objSvrHTTP.<span class="kw1">Open</span> <span class="st0">&quot;POST&quot;</span>, txtURL, <span class="kw1">False</span>, <span class="kw1">CStr</span><span class="br0">&#40;</span>txtUserName<span class="br0">&#41;</span>, _</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">CStr</span><span class="br0">&#40;</span>txtPassword<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; objSvrHTTP.<span class="me1">setRequestHeader</span> <span class="st0">&quot;Accept&quot;</span>, <span class="st0">&quot;application/xml&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; objSvrHTTP.<span class="me1">setRequestHeader</span> <span class="st0">&quot;Content-Type&quot;</span>, <span class="st0">&quot;application/xml&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = <span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;methodcall&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;methodname&gt;agenda.addAgendaItem&lt;/methodname&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;params&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;param&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; txtBlogId &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;param&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; txtUserName &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;param&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; txtPassword &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;now we go make the struct, I use a Type (stdobject), normally</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;you&#39;d use a recordset</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">Dim</span> a <span class="kw1">As</span> AgendaItem</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">With</span> a</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">userid</span> = <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">Description</span> = <span class="st0">&quot;rpc testing&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">firstdate</span> = <span class="st0">&quot;2009/10/14&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">enddate</span> = <span class="st0">&quot;2009/10/14&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">link</span> = <span class="st0">&quot;http://www.juust.org/&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">price</span> = <span class="st0">&quot;rpc testing&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">location</span> = <span class="st0">&quot;limmen&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">tags</span> = <span class="st0">&quot;php, xml-rpc&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">End</span> <span class="kw1">With</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;param&gt;&lt;value&gt;&lt;array&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;data&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;value&gt;&lt;struct&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;userid&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">userid</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;tags&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">tags</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;description&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">Description</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;firstdate&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">firstdate</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;enddate&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">enddate</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;link&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">link</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;price&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">price</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;member&gt;&lt;name&gt;location&lt;/name&gt;&lt;value&gt;&lt;string&gt;&quot;</span> &amp; a.<span class="me1">location</span> &amp; <span class="st0">&quot;&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;close the struct &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;/struct&gt;&lt;/value&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;/data&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;close the struct array</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;/array&gt;&lt;/value&gt;&lt;/param&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;end parameters</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;/params&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;end method</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; strT = strT &amp; <span class="st0">&quot;&lt;/methodcall&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;send the lot to the blog &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; objSvrHTTP.<span class="me1">send</span> strT</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">&#39;print the response to debug </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Debug.<span class="kw1">Print</span> &nbsp;objSvrHTTP.<span class="me1">responseText</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">End</span> <span class="kw1">function</span></div>
</li>
</ol>
</div>
<p>Et voila : </p>
<p><img src="http://www.juust.org/wp-content/uploads/2009/10/agenda-rpc.png" alt="agenda rpc" title="agenda rpc" width="550" height="150" class="alignleft size-full wp-image-980" /></p>
<p>That&#8217;s yer basic Office-Wordpress XML-RPC integration.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/integrating-ms-office-and-wordpress-with-vba-and-xml-rpc/2009/10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>a social spider</title>
		<link>http://www.juust.org/index.php/a-social-spider/2009/01/</link>
		<comments>http://www.juust.org/index.php/a-social-spider/2009/01/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 04:10:22 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=310</guid>
		<description><![CDATA[I was reading about the BloGee project and some other stuff and then I thought &#8220;how much trouble would it be writing a WordPress plugin to do some basic &#8216;social spidering&#8217;&#8221;. BloGee is about a micro-content format and that&#8217;s a &#8230; <a href="http://www.juust.org/index.php/a-social-spider/2009/01/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I was reading about the BloGee project and some other stuff and then I thought &#8220;how much trouble would it be writing a WordPress plugin to do some basic &#8216;social spidering&#8217;&#8221;. BloGee is about a micro-content format and that&#8217;s a bit out of my scope. </p>
<p>I want a simple &#8216;social&#8217; spider for WordPress so I am going to take some functions of simpleTags and add them to the WordPress xml-rpc server methods, to get some basic functionality I can call upon through the xml-rpc endpoint. </p>
<p>I don&#8217;t know if I mentioned that, adding methods to WordPress XML-RPC differs from the straight forward use of Incutio because WordPress uses its own filter/hook system, the actual IXR_Server instance is made and managed by WordPress itself.</p>
<p>I hence don&#8217;t use the </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> PeekAtYouServer <span class="kw2">extends</span> IXR_Server <span class="br0">&#123;</span></div>
</li>
</ol>
</div>
<p>style class instancing,  in stead I make a class where I hook the function I would normally hand to the IXR_Server as callback into wordpress by adding method/callback to the &#8216;xmlrpc_methods&#8217; filter array. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">class</span> PeekAtYouServer <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> PeekAtYouServer<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// &nbsp;add callbacks as methods to the array (filter) xmlrpc_methods </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;add_filter<span class="br0">&#40;</span><span class="st0">&#39;xmlrpc_methods&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re1">$this</span><span class="sy0">,</span> <span class="st0">&#39;filterXmlrpcMethods&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;* Here I connect the methodName pay.PeekAtYou to a custom function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;* This is the array that is added (as pair) to the xmlrpc_methods filter</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;**/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> filterXmlrpcMethods<span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re1">$methods</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$methods</span><span class="br0">&#91;</span><span class="st0">&#39;pay.PeekAtYou&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re1">$this</span><span class="sy0">,</span> <span class="st0">&#39;onXmlRpcpayPeekAtYou&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$methods</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;* the custom function used as callback for pay.PeekAtYou</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;**/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> onXmlRpcpayPeekAtYou<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">global</span> <span class="re1">$wpdb</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//grab posts</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$sql</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT ID, post_title FROM &quot;</span> <span class="sy0">.</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">posts</span> <span class="sy0">.</span> <span class="st0">&quot; WHERE post_status = &#39;publish&#39;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$posts</span> <span class="sy0">=</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_results</span><span class="br0">&#40;</span><span class="re1">$sql</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//cycle through all posts and grab the IDs</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$result</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re1">$posts</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$posts</span> <span class="kw1">as</span> <span class="re1">$post</span><span class="br0">&#41;</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">postids</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//I got all the ids in an array, </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//now I grab the tags (query is from the simpleTags plugin)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getTagsFromCurrentPosts</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">new</span> IXR_Error<span class="br0">&#40;</span><span class="nu0">404</span><span class="sy0">,</span> <span class="st0">&#39;no posts for the selected criterium.&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">tags_currentposts</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * Get tags from current post views</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * (SimpleTags plugin)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @return boolean</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> getTagsFromCurrentPosts<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">postids</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">postids</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Generate SQL from post id</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$postlist</span> <span class="sy0">=</span> <span class="kw3">implode</span><span class="br0">&#40;</span> <span class="st0">&quot;&#39;, &#39;&quot;</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">postids</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">global</span> <span class="re1">$wpdb</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$results</span> <span class="sy0">=</span> <span class="re1">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_results</span><span class="br0">&#40;</span><span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;SELECT t.name AS name, t.term_id AS term_id, tt.count AS count</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;FROM {$wpdb-&gt;term_relationships} AS tr</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;INNER JOIN {$wpdb-&gt;term_taxonomy} AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;INNER JOIN {$wpdb-&gt;terms} AS t ON (tt.term_id = t.term_id)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;WHERE tt.taxonomy = &#39;post_tag&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;AND ( tr.object_id IN (&#39;{$postlist}&#39;) )</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;GROUP BY t.term_id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp;ORDER BY tt.count DESC&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">tags_currentposts</span> <span class="sy0">=</span> <span class="re1">$results</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">unset</span><span class="br0">&#40;</span><span class="re1">$results</span><span class="sy0">,</span> <span class="re1">$key</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I saved the file as PeekAtYouServer.class.php. </p>
<p>Now I need a simple file for WordPress to &#8216;spot the plugin&#8217;, so I can activate it and make the class instance, that adds the custom method and callback function.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;Plugin Name: PeekAtYou XMLRPC Server</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;Plugin URI: http://www.juust.org/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;Description: Adds Social Spidering to your blog</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;Author: juust</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;Author URI: http://www.juust.org/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;License: GPL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;Version: 1.1</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">require_once</span> <span class="st0">&#39;PeekAtYouServer.class.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$PeekAtYouServer</span> <span class="sy0">=</span> <span class="kw2">new</span> PeekAtYouServer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>I save that as PeekAtYouServer.php and upload the lot to a directory /wp-plugins/pay-xmlrpc-server.</p>
<p>In the Plugin screen (wp 2.5) I can activate the plugin, and then make a call to the xmlrpc-endpoint of the blog using <strong>pay.PeekAtYou</strong> as methodName. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#39;wp-includes/class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> IXR_Client<span class="br0">&#40;</span><span class="st0">&#39;http://www.juust.org/xmlrpc.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#39;pay.PeekAtYou&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$response</span> <span class="sy0">=</span> <span class="sy0">&amp;</span><span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">print_r</span><span class="br0">&#40;</span> <span class="re1">$response</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>That returns all tags the blog uses. </p>
<p>Next week : adding some basic social blog-spider functions. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/a-social-spider/2009/01/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>hands on xml-rpc : copying msql tables</title>
		<link>http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/</link>
		<comments>http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 17:13:41 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=286</guid>
		<description><![CDATA[I don&#8217;t have anything to blog on, so I will bore you all with a quick generic function to copy mysql tables from one host to another, using xml-rpc. I use the Incutio xml-rpc library on both hosts, to handle &#8230; <a href="http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t have anything to blog on, so I will bore you all with a quick generic function to copy mysql tables from one host to another, using xml-rpc. </p>
<p>I use the <a href="http://scripts.incutio.com/xmlrpc/manual.php" rel="nofollow" title="Incutio xml rpc class manual">Incutio xml-rpc library</a> on both hosts, to handle the tedious stuff (xml formatting and parsing). That leaves only some snippets to send and receive table data and store it on a mysql database. </p>
<p>First : how to handle the table data on the sending end:</p>
<ul>
<li>I take an associative array from a mysql query</li>
<li>I make an array to hold the records </li>
<li>I add each row as array</li>
<li>I make an IXR-client.</li>
<li>I add some general parameters</li>
<li>I hand these and the entire table array to my IXR-client.</li>
<li>send&#8230;</li>
</ul>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//the snippet with the client is at the bottom of the post</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span> <span class="sy0">=</span> <span class="kw2">New</span> SerpClient<span class="br0">&#40;</span><span class="st0">&#39;http://serp.trismegistos.net/db/xmlrpc.php&#39;</span><span class="sy0">,</span> <span class="st0">&#39;user&#39;</span><span class="sy0">,</span> <span class="st0">&#39;pass&#39;</span><span class="sy0">,</span> <span class="st0">&#39;sender&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$tablename</span> <span class="sy0">=</span> <span class="st0">&quot;serp_tags_keys&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$tableid</span> <span class="sy0">=</span> <span class="st0">&quot;id&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$serpdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM &quot;</span><span class="sy0">.</span><span class="re1">$tablename</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$recordcount</span> <span class="sy0">=</span> <span class="kw3">mysql_num_rows</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">=</span><span class="kw3">mysql_fetch_assoc</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$record</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$row</span> <span class="kw1">as</span> <span class="re1">$key</span> <span class="sy0">=&gt;</span> <span class="re1">$value</span><span class="br0">&#41;</span> <span class="re1">$record</span><span class="br0">&#91;</span><span class="re1">$key</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$value</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$records</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$record</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span><span class="sy0">-&gt;</span><span class="me1">putTable</span><span class="br0">&#40;</span><span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$recordcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$records</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p><em>I consider some additional fields necessary for basic integrity checks : I add &#8220;ID&#8221; as key field, so on the receiving end the server knows which field is my table&#8217;s auto-increment field. Other fields are a username, password, tablename and the batch recordcount.</em> </p>
<p>The IXR_Client then generates a tangled mess of xml-tags holding the entire prodecure call and data. (you can put the client on &#8216;debug&#8217;, then it dumps the generated xml to the screen).</p>
<p>The first part of the xml file contains the single parameters :</p>
<ul>
<li>username</li>
<li>password</li>
<li>tablename</li>
<li>recordcount</li>
<li>id-field</li>
</ul>
<p>&lt;methodCall&gt;<br />
&lt;methodName&gt;serp.putTable&lt;/methodName&gt;<br />
&lt;params&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;user&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;pass&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;serp_tags_keys&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;int&gt;91&lt;/int&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;id&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;</p>
<p>Then the entire table is sent as one parameter in the procedure call. </p>
<p>That parameter is built from an array containing the table rows as &#8216;struct&#8217;. If I want to use the routine for any table, I need the fieldname-value pairs to compose a standard mysql insert statement. A struct type allows me to use <em>key-value</em> pairs in the xml-file that can be parsed back into an array. </p>
<p>&lt;param&gt;&lt;value&gt;&lt;array&gt;</p>
<p>&lt;data&gt;</p>
<p>  &lt;value&gt;&lt;struct&gt;<br />
  &lt;member&gt;&lt;name&gt;id&lt;/name&gt;&lt;value&gt;&lt;string&gt;4&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;tag&lt;/name&gt;&lt;value&gt;&lt;string&gt;ranking&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;cat&lt;/name&gt;&lt;value&gt;&lt;string&gt;alexa ranking seo internet ranking internet positi&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;date&lt;/name&gt;&lt;value&gt;&lt;string&gt;200901&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
&lt;/struct&gt;&lt;/value&gt;</p>
<p>  &lt;value&gt;&lt;struct&gt;<br />
  &lt;member&gt;&lt;name&gt;id&lt;/name&gt;&lt;value&gt;&lt;string&gt;94&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;tag&lt;/name&gt;&lt;value&gt;&lt;string&gt;firm&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;cat&lt;/name&gt;&lt;value&gt;&lt;string&gt;firm seo&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;date&lt;/name&gt;&lt;value&gt;&lt;string&gt;200901&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
&lt;/struct&gt;&lt;/value&gt;</p>
<p>&lt;/data&gt;</p>
<p>&lt;/array&gt;&lt;/value&gt;&lt;/param&gt;</p>
<p>That was the last of the param holding the table, so the entire tag-mess is closed :</p>
<p>&lt;/params&#038;gt&lt;/methodCall&#038;gt</p>
<p>Then the second part : on the receiving end the Incutio class parses the whole tag-mess, and hands an array of the param sections as input to my function putTable. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> putTable<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$user</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$pass</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$tname</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$tcount</span> &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$id</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$table</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>$table is a straightforward array holding as items an array ($t) created from the struct with the pairs of fieldname-value. I turn the recordsets key-value struct into a mysql INSERT query :<br />
$query = &#8220;INSERT INTO `&#8221;.$tname.&#8221;` (&#8221; field, field&#8230; &#8220;) VALUES (&#8221; fieldvalue, fieldvalue &#8220;)&#8221;;</p>
<p>All I have to do is add the fieldnames and fieldvalues to the mysql insert query.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$table</span> <span class="kw1">as</span> <span class="re1">$t</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the fixed parts</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query0</span> <span class="sy0">=</span> <span class="st0">&#39;INSERT INTO `&#39;</span><span class="sy0">.</span><span class="re1">$tname</span><span class="sy0">.</span><span class="st0">&#39;` (&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query2</span> <span class="sy0">.=</span><span class="st0">&quot;) VALUES (&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the (`fieldname`, `fieldname`, `fieldname`) query-bit </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//and the (&#39;fieldvalue&#39;, &#39;fieldvalue&#39;, &#39;fieldvalue&#39;) query-bit :</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$t</span> <span class="kw1">as</span> <span class="re1">$key</span><span class="sy0">=&gt;</span><span class="re1">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$key</span><span class="sy0">!=</span><span class="re1">$id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$query1</span> <span class="sy0">.=</span><span class="st0">&quot;`&quot;</span><span class="sy0">.</span><span class="re1">$key</span><span class="sy0">.</span><span class="st0">&quot;`, &quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$query3</span> <span class="sy0">.=</span><span class="st0">&quot;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$value</span><span class="sy0">.</span><span class="st0">&quot;&#39;, &quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//remove the trailing &quot;, &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query1</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$query1</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$query1</span><span class="br0">&#41;</span><span class="nu0">-2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query3</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$query3</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$query3</span><span class="br0">&#41;</span><span class="nu0">-2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//glue em up and add the final &quot;)&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query0</span> <span class="sy0">.=</span> <span class="re1">$query1</span><span class="sy0">.</span><span class="re1">$query2</span><span class="sy0">.</span><span class="re1">$query3</span><span class="sy0">.</span><span class="st0">&quot;)&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//query&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">connection</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="re1">$query0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//reset the strings</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query0</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query1</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query2</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query3</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>that generates mysql queries like<br />
<em>INSERT INTO `serp_tags_keys` (`tag`, `cat`, `date`) VALUES (&#8216;ranking&#8217;, &#8216;alexa ranking&#8217;, &#8217;200901&#8242;)</em> and copies the entire table.</p>
<p>That is how I handle the table data. </p>
<p>Of course I have to define two custom classes to process the <em>serp.putTable</em> procedure itself, using the Incutio class.</p>
<p>First the class for the sending script, which is pretty straight forward : </p>
<ul>
<li>make an IXR_Client instance</li>
<li>hand the record set to it</li>
<li>
have it formatted and sent</li>
</ul>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//include the library</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#39;class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make a custom class that uses the IXR_client</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">Class</span> SerpClient </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$rpcurl</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//endpoint</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$username</span><span class="sy0">;</span> &nbsp; <span class="co1">//you go figure</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$password</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$bClient</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp;<span class="co1">//incutio ixr-client instance</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$myclient</span><span class="sy0">;</span> &nbsp;<span class="co1">//machine/host-id</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> SerpClient<span class="br0">&#40;</span><span class="re1">$rpcurl</span><span class="sy0">,</span> <span class="re1">$username</span><span class="sy0">,</span> <span class="re1">$password</span><span class="sy0">,</span> <span class="re1">$myclient</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rpcurl</span> <span class="sy0">=</span> <span class="re1">$rpcurl</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">//Standard variables to send in the message</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rpcurl</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$rpcurl</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$username</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">password</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$password</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">myclient</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$myclient</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw2">function</span> connect<span class="br0">&#40;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//basic client, it takes the endpoint url, tests and returns true if it exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bClient</span> <span class="sy0">=</span> <span class="kw2">new</span> IXR_Client<span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rpcurl</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the function I use to send the data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> putTable<span class="br0">&#40;</span><span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$recordcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$array</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//first parameter is always the methodname, then the parameters, which are</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//added sequential to the xml-file (with the appropriate tags for datatypes.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the script figures that out. note : it uses htmlentities on strings.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bClient</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#39;serp.putTable&#39;</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">password</span><span class="sy0">,</span> <span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$recordcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$array</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I use it in the snippets above with :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span> <span class="sy0">=</span> <span class="kw2">New</span> SerpClient<span class="br0">&#40;</span><span class="st0">&#39;http://serp.trismegistos.net/db/xmlrpc.php&#39;</span><span class="sy0">,</span> <span class="st0">&#39;user&#39;</span><span class="sy0">,</span> <span class="st0">&#39;pass&#39;</span><span class="sy0">,</span> <span class="st0">&#39;sender&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span><span class="sy0">-&gt;</span><span class="me1">putTable</span><span class="br0">&#40;</span><span class="re1">$tname</span><span class="sy0">,</span> <span class="re1">$tcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$records</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Then, on the receiving end, my program has to know how to handle the xml containing the remote procedure call. </p>
<p>I define an extension on IXR_server and pass serp.putTable as new &#8216;method&#8217; (callback function).</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//go away cookie&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$_COOKIE</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make sure you get the posted crap, the ixr instances grabs it input from it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span> <span class="st0">&#39;php://input&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//include the library</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#39;class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make an extended class</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> serp_xmlrpc_server <span class="kw2">extends</span> IXR_Server <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//use the same function name&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> serp_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//build an array of methods : </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//first the procedurename you use in the xml-text,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//then which function in the extended class (this one) it maps to </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//to be used as $this-&gt;method</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;serp.putTable&#39;</span> &nbsp;<span class="sy0">=&gt;</span> <span class="st0">&#39;this:putTable&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//hand em to the IXR server instance that will map it as callback</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">IXR_Server</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//now IXR_Server instance uses ($this-&gt;)putTable </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//to process incoming xml-text </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//containing serp.putTable as methodname</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> putTable<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//(for routine : see the snippet above to store the xml data in mysql)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the class instance like any regular get-post php program, </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the only actual program line, that instantiates the extended class,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//which handles the posted xml </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$serp_xmlrpc_server</span> <span class="sy0">=</span> <span class="kw2">new</span> serp_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s all. I am not going to list a cut-and-paste version. You have to build some stuff with it, then you will come up with lots of stuff you can do with it. </p>
<p>WordPress and iPhone built a plugin that receives pictures from iPhone. WordPress uses Incutio so you can &#8216;piggyback&#8217; on that and have an iPhone plugin for your own website in two days flat using an ajax lightbox gallery script. Or go monetize small websites with some seo oriented &#8216;optimisation&#8217; functions like ChangeFooterLinks(array($paidurl, $anchortext)) :) or whatever&#8230; boring, isn&#8217;t it ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RedHat Seo : scraper auto-blogging</title>
		<link>http://www.juust.org/index.php/redhat-seo-christmas-edition/2008/12/</link>
		<comments>http://www.juust.org/index.php/redhat-seo-christmas-edition/2008/12/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 18:07:01 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[seo tips and tricks]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xml-rpc]]></category>
		<category><![CDATA[scrape]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=270</guid>
		<description><![CDATA[Just give us your endpoint and we&#8217;ll take it from there, sparky! I was going to make one of these tools to scrape google and conjur a full blog out of nowhere, as Christmas special, RedHat Seo. The rough sketch &#8230; <a href="http://www.juust.org/index.php/redhat-seo-christmas-edition/2008/12/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Just give us your endpoint and we&#8217;ll take it from there, sparky!</p></blockquote>
<p>I was going to make one of these tools to scrape google and conjur a full blog out of nowhere, as Christmas special, RedHat Seo. The rough sketch has arrived , far from perfect, but it does produce a blog and don&#8217;t even look too shabby. I scraped a <a href="" rel="nofollow" target="_blank">small batch</a> of posts off of blogs, keeping the links intact and adding a tribute links. I hope they will pardon me for it. </p>
<h3>structure</h3>
<p>I use three main classes, </p>
<table>
<tbody>
<tr>
<td>BlogMaker    </td>
<td>     the application</td>
</tr>
<tr>
<td>Target         </td>
<td>     the blogs you aim for</td>
</tr>
<tr>
<td>WPContent   </td>
<td>     the scraped goodies</td>
</tr>
</tbody>
</table>
<p>&#8230;and two support classes</p>
<table>
<tbody>
<tr>
<td>SerpResult    </td>
<td>    scraped urls</td>
</tr>
<tr>
<td>Custom_RPC   </td>
<td>    a simple rpc-poster</td>
</tr>
</tbody>
</table>
<p>Target blogs have three texts, </p>
<table>
<tbody>
<tr>
<td>file</td>
<td>contents</td>
<td>maintenance</td>
</tr>
<tr>
<td>blog categories</td>
<td>category you post under</td>
<td>manual</td>
</tr>
<tr>
<td>blog tags</td>
<td> tags you list on the blog</td>
<td>manual</td>
</tr>
<tr>
<td>blog urls</td>
<td> urls already used for the blog</td>
<td>system</td>
</tr>
</tbody>
</table>
<h3>routine</h3>
<p>The BlogMaker class grabs a result list (up to 1000 urls per phrase) from Google, extracts the urls and stores them in SerpResult,  scrapes the urls and extracts the <strong>entry</strong> divs, stores div-entries in the WPContent class (that has some basic functions to sanitize the text), and uses the BlogTarget-definitions to post it up blogs with xml-rpc.</p>
<h3>usage</h3>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make main instance</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$Blog</span> <span class="sy0">=</span> <span class="kw2">new</span> BlogMaker<span class="br0">&#40;</span><span class="st0">&quot;keyword&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//define a target blog, you can define multiple blogs and refer with code</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//then add rpc-url, password and user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//and for every target blog three text-files </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$T</span><span class="sy0">=</span><span class="re1">$Blog</span><span class="sy0">-&gt;</span><span class="me1">AddTarget</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;blogcode&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;http://my.blog.com/xmlrpc.php&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;password&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;user&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;keyword.categories.txt&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;keyword.tags.txt&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;keyword.urls.txt&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//read the tags, cats and url text files stored on the server </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//all retrieved urls are tested, if the target blog already has that</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//scraped url, it is discarded.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">CSV_GetTags</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">List_GetCats</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">ReadURL</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//grab the google result list</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//use params (pages, keywords) to specify search</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$Blog</span><span class="sy0">-&gt;</span><span class="me1">GoogleResults</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$a</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$Blog</span><span class="sy0">-&gt;</span><span class="me1">Results</span> <span class="kw1">as</span> <span class="re1">$BlogUrl</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$a</span><span class="sy0">++;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">echo</span> <span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//see if the url isnt used yet</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">checkURL</span><span class="br0">&#40;</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">!=</span><span class="kw2">true</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">echo</span> <span class="st0">&#39;&#8230;checking &#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//if not used, get the source</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">scrape</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//check for divs marked &quot;entry&quot;, if they arent there, check &quot;post&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//some blogs use other indications for the content</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//but entry and post cover 40%</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$entries</span> <span class="sy0">=</span> <span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">get_entries</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$entries</span><span class="br0">&#41;</span><span class="sy0">&amp;</span>lt<span class="sy0">;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;no entries&#8230;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$entries</span> <span class="sy0">=</span> <span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">get_posts</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$entries</span><span class="br0">&#41;</span><span class="sy0">&amp;</span>lt<span class="sy0">;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;no posts either&#8230;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//if no entry-post div, mark url as done</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">RegisterURL</span><span class="br0">&#40;</span><span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$ct</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$BlogUrl</span><span class="sy0">-&gt;</span><span class="me1">WpContentPieces</span> <span class="kw1">as</span> <span class="re1">$WpContent</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//in the get_entries/get_post function the fragments are stored</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//as wpcontent</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$ct</span><span class="sy0">++;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$WpContent</span><span class="sy0">-&gt;</span><span class="me1">judge</span><span class="br0">&#40;</span><span class="nu0">2000</span><span class="sy0">,</span> <span class="nu0">200</span><span class="sy0">,</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$WpContent</span><span class="sy0">-&gt;</span><span class="me1">tribute</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1">//add tribute link</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">settags</span><span class="br0">&#40;</span><span class="re1">$WpContent</span><span class="sy0">-&gt;</span><span class="me1">divcontent</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//add tags</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">postCustomRPC</span><span class="br0">&#40;</span><span class="re1">$WpContent</span><span class="sy0">-&gt;</span><span class="me1">title</span><span class="sy0">,</span> <span class="re1">$WpContent</span><span class="sy0">-&gt;</span><span class="me1">divcontent</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//1=publish, 0=draft</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$T</span><span class="sy0">-&gt;</span><span class="me1">RegisterURL</span><span class="br0">&#40;</span><span class="re1">$WpContent</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1">//register use of url</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">usleep</span><span class="br0">&#40;</span><span class="nu0">20000000</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1">//20 seconds break, for sitemapping</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>notes</h3>
<ul>
<li>xml-rpc needs to be activated explicitly on the wordpress dashboard under settings/writing.</li>
<li>categories must be present in the blog</li>
<li>url file must be writeable by the server (777)</li>
</ul>
<p>It seems wordpress builds the sitemap as background process, the standard google xml sitemap plugin wil attempt to build in the cache (takes anywhere between 2 and 10 seconds), and apart from building a sitemap the posts also get pinged around. Giving the install 10 to 20 seconds between posts allows for all the hooked in functions to be completed.</p>
<h3>period</h3>
<p>That&#8217;s about all,<br />
consider it gpl, I added some comments in the source but I will not develop this any further. A mysql backed blogfarm tool (euphemistically called &#8216;publishing tool&#8217;) is more interesting, besides, I am off to the wharves to do some painting.</p>
<p>if you use it, send some feedback,<br />
merry christmas dogheads</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/redhat-seo-christmas-edition/2008/12/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>an xml rpc endpoint</title>
		<link>http://www.juust.org/index.php/how-to-program-an-xml-rpc-endpoint/2008/12/</link>
		<comments>http://www.juust.org/index.php/how-to-program-an-xml-rpc-endpoint/2008/12/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 02:21:15 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[linkdir]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=254</guid>
		<description><![CDATA[(geek content:) Integrating the Incutio xml rpc class into a phpLinkDirectory install opens a lot of possibilities for running remote control automated networks. For a basic example I took the submit routine of phpLD and the xml-rpc routine from wordpress, &#8230; <a href="http://www.juust.org/index.php/how-to-program-an-xml-rpc-endpoint/2008/12/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>(geek content:) Integrating the <a href="http://scripts.incutio.com/xmlrpc/" rel="nofollow">Incutio xml rpc class</a> into a phpLinkDirectory install opens a lot of possibilities for running remote control automated networks. For a basic example I took the submit routine of phpLD and the xml-rpc routine from wordpress, deleted all nonsense, and ended up with a simple xml-rpc endpoint for my link directory.</p>
<p>On the sender side, I make an xml file that holds the <em>methodName</em> (which is the function I want to execute remotely : <em>phpld.SubmitLink</em>), and the array values I want to pass to the function as parameters. I attach the xml-string as post to a curl call and fire it at the xmlrpc endpoint.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getmyxml<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the $data array</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//normally phpLd makes it when someone submits a site</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;LINK_TYPE&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;DESCRIPTION&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;DESCRIPTION&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;TITLE&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;TITLE&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;OWNER_NAME&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;OWNER_NAME&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;URL&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;http://www.domain.com/xmlrpc.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;ID&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//put the data array in an xml string to post to the xmlrpc endpoint</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the xml header</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$myxml</span><span class="sy0">=</span><span class="st0">&#39;&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; methodCall&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$myxml</span><span class="sy0">.=</span> <span class="st0">&#39;&lt; methodName&gt;phpld.SubmitLink&lt; /methodName&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; params&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//loop to add the $data elements as param-tags</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$data</span> <span class="kw1">as</span> <span class="re1">$d</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; param&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; value&gt;&lt; string&gt;&#39;</span><span class="sy0">.</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$d</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&#39;&lt; /string&gt;&lt; /value&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; /param&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//finish the xml file :</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; /params&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$myxml</span><span class="sy0">.=</span><span class="st0">&#39;&lt; /methodCall&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//return it</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="re1">$myxml</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the call to the endpoint </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$ch</span> <span class="sy0">=</span> curl_init<span class="br0">&#40;</span><span class="st0">&#39;http://www.domain.com/xmlrpc.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//use content-type text/xml as extra header</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_HTTPHEADER<span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type: text/xml&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//get the xml-string and use it as post var</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> getmyxml<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; curl_setopt<span class="br0">&#40;</span><span class="re1">$ch</span><span class="sy0">,</span> CURLOPT_TIMEOUT<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$return</span> <span class="sy0">=</span> curl_exec<span class="br0">&#40;</span><span class="re1">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">unset</span><span class="br0">&#40;</span><span class="re1">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So much for the sending end, now the receiving end : the xmlrpc.php endpoint file. I need the Incutio xml handler and the phpLinkdirectory database class, with the proper settings, and a function <em>SubmitLink</em> to add the data in the posted xml-file as a record to the database. </p>
<p>Some general settings : </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;XMLRPC_REQUEST&#39;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$_COOKIE</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span> <span class="st0">&#39;php://input&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> &nbsp;<span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>I include the Incutio class file, which is a general xml client/server class, and I include <em>init.php</em> from the phpLD script. In the init.php script the AdoDb database instance is declared, that handles the mysql connection, as well as the basic phpLd environment. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#39;include/class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#39;init.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$xmlrpc_logging</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Let&#8217;s put them both to work for me : the IXR_Server has to know it has to run the SubmitLink function if that function is set as methodName in the xml file. In php you can add methods dynamically to a class, and in the function <em>call($methodname, $args)</em> the IXR_Server handles callbacks.</p>
<p>In my <em>phpLD_xmlrpc_server</em> class, which extends IXR_Server, I add a function <em>SubmitLink</em> that stuffs the data in the phpld database, and I make an array with <strong>xml.methodName</strong>=><strong>class:function</strong> as key=>value pair and pass that to the IXR_Server, that&#8217;s enough. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> phpLD_xmlrpc_server <span class="kw2">extends</span> IXR_Server <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$methods</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> phpLD_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//mapping the custom methods</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span><span class="br0">&#91;</span><span class="st0">&#39;phpld.SubmitLink&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;this:SubmitLink&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//handing the custom methods to the base class</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">IXR_Server</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>When the IXR class parses the posted xml and finds the <em>phpld.SubmitLink</em> methodName, it executes the custom method <em>($this->)SubmitLink</em> with the data posted in the xml <em>param</em> tags as input :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> SubmitLink<span class="br0">&#40;</span><span class="re1">$params</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//use db and tables from include(init.php)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">global</span> <span class="re1">$db</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">global</span> <span class="re1">$tables</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//map the param-values passed to the $data array </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;LINK_TYPE&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$params</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;DESCRIPTION&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$params</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;TITLE&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$params</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;OWNER_NAME&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$params</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;URL&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$params</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;ID&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//pass the data array to the adodb $db instance&#39;s Replace function : </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">-&gt;</span><span class="me1">Replace</span><span class="br0">&#40;</span><span class="re1">$tables</span><span class="br0">&#91;</span><span class="st0">&#39;link&#39;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re1">$data</span><span class="sy0">,</span> <span class="st0">&#39;ID&#39;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;DESCRIPTION&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot; entered&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="st0">&quot; refused&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The AdoDb function <em>Replace</em> maps key-value to tablefield-value, so I use the database field names as keys for the $data array, and assign the $param-values to them. I pass the $data array to the adoDb function and that takes care of the rest.</p>
<p>After adding the includes, settings, and classes,<br />
all I have to do is add a final call at the end to start a new instance of the extended class to handle the posted xml-data :  </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$phpLD_xmlrpc_server</span> <span class="sy0">=</span> <span class="kw2">new</span> phpLD_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>&#8230;and I have an xml-rpc endpoint :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;XMLRPC_REQUEST&#39;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$_COOKIE</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span> <span class="st0">&#39;php://input&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#39;include/class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#39;init.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$xmlrpc_logging</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> phpLD_xmlrpc_server <span class="kw2">extends</span> IXR_Server <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$methods</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> phpLD_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span><span class="br0">&#91;</span><span class="st0">&#39;phpld.SubmitLink&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;this:SubmitLink&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">IXR_Server</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> SubmitLink<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">global</span> <span class="re1">$db</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">global</span> <span class="re1">$tables</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;STATUS&#39;</span><span class="br0">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;IPADDRESS&#39;</span><span class="br0">&#93;</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;VALID&#39;</span><span class="br0">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;LINK_TYPE&#39;</span><span class="br0">&#93;</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">-&gt;</span><span class="me1">Replace</span><span class="br0">&#40;</span><span class="re1">$tables</span><span class="br0">&#91;</span><span class="st0">&#39;link&#39;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re1">$data</span><span class="sy0">,</span> <span class="st0">&#39;ID&#39;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;DESCRIPTION&#39;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot; entered&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="st0">&quot; refused&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phpLD_xmlrpc_server</span> <span class="sy0">=</span> <span class="kw2">new</span> phpLD_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Short and sweet.</p>
<p>The actual strength of xml-rpc is in defining a set of standard methodNames and parameters passed with the methodCall (for instance for small website maintenance tasks and statistics reporting, an rpc.sms protocol as successor to Twitter, or standard socialgraph functions for ajax/javascript/widgets) for developing standard API&#8217;s. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/how-to-program-an-xml-rpc-endpoint/2008/12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>xml rpc &#8211; remote posting with incutio wordpress ixr class</title>
		<link>http://www.juust.org/index.php/xml-rpc-remote-posting-with-wordpress-incutio-ixr-class/2008/11/</link>
		<comments>http://www.juust.org/index.php/xml-rpc-remote-posting-with-wordpress-incutio-ixr-class/2008/11/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 23:42:22 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=205</guid>
		<description><![CDATA[In order to build a successful blog network I need xml-rpc. I read up on xml-rpc, incutio ixr and tried some basic flat file xml rpc. It&#8217;s either that or a custom php url to post data to and then &#8230; <a href="http://www.juust.org/index.php/xml-rpc-remote-posting-with-wordpress-incutio-ixr-class/2008/11/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In order to build a successful blog network I need xml-rpc. I read up on xml-rpc, incutio ixr and tried some basic flat file xml rpc. It&#8217;s either that or a custom php url to post data to and then use the wordpress functions to process it. </p>
<p>Xml-rpc is a lot easier especially with the <a href="http://scripts.incutio.com/xmlrpc/manual.php" rel="nofollow">WordPress Incutio-IXR</a> class:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#39;wp-includes/class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//just give us your endpoint and we&#39;ll take it from there Sparky&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> IXR_Client<span class="br0">&#40;</span><span class="st0">&#39;http://tryout.blacknorati.com/xmlrpc.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// xml rpc post function form : </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// metaWeblog.newPost( blog_id, username, password, struct, publish )</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//struct = structure for post data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&#39;title&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;test titel&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&#39;description&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&#39;test&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&#39;categories&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;frontpage&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//use &#39;query&#39; to interact with the server, set publish to 0 (draft) for now</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#39;metaWeblog.newPost&#39;</span><span class="sy0">,</span> <span class="nu0">6</span><span class="sy0">,</span> <span class="st0">&#39;user&#39;</span><span class="sy0">,</span> <span class="st0">&#39;password&#39;</span><span class="sy0">,</span> <span class="re1">$post</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">die</span><span class="br0">&#40;</span><span class="st0">&#39;Something went wrong &#8211; &#39;</span><span class="sy0">.</span><span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">getErrorCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&#39; : &#39;</span><span class="sy0">.</span><span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">getErrorMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Normally <strong>getResponse</strong> will return a PostID for this function.</p>
<p>Is it really that simple ? Yes. I skipped to the IXR_Client because my host does not have xmlrpc running and the IXR_class doesn&#8217;t use it, and solutions with email don&#8217;t easily allow access to tags and categories. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&#39;categories&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;frontpage&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&#39;mt_keywords&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;key1, key2&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&quot;mt_allow_comments&quot;</span><span class="br0">&#93;</span> <span class="sy0">=</span><span class="st0">&#39;closed&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$post</span><span class="br0">&#91;</span><span class="st0">&#39;mt_allow_pings&#39;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">&#39;open&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//$post[&#39;mt_tb_ping_urls&#39;] =&#39;url url url&#39;;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//$post[&#39;enclosure&#39;]=array(&#39;url&#39;, &#39;length&#39;, &#39;type&#39;)&#39;;</span></div>
</li>
</ol>
</div>
<p><em>mt_keywords</em> holds my tags, that&#8217;s a bit more flexible than categories. For my blogs the comments are closed (<em>mt_allow_comments</em>), <em>mt_allow_pings</em> is open, and the real tasty bit is the trackbacks (<em>mt_tb_ping_urls</em> : simply urls separated with a blank space, just like in the wordpress form). I played with the Arrousi trackback class, that one has an autodiscover routine, so I can try and fetch a trackback url from the content page I am &#8216;using&#8217;. </p>
<p>I don&#8217;t work with enclosures, but to be complete I added it here.</p>
<p>That covers most data I want to send around a blog network. Very nice class, Incutio IXR.</p>
<p>Next week : more nonsense.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/xml-rpc-remote-posting-with-wordpress-incutio-ixr-class/2008/11/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

