<?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>Remco Tolsma</title>
	<atom:link href="http://remcotolsma.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://remcotolsma.nl</link>
	<description></description>
	<lastBuildDate>Wed, 05 Jun 2013 08:58:47 +0000</lastBuildDate>
	<language>nl-NL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Unit tests voor WordPress plugins</title>
		<link>http://remcotolsma.nl/2013/06/unit-tests-voor-wordpress-plugins/</link>
		<comments>http://remcotolsma.nl/2013/06/unit-tests-voor-wordpress-plugins/#comments</comments>
		<pubDate>Wed, 05 Jun 2013 08:57:22 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=695</guid>
		<description><![CDATA[Een aantal WordPress plugins die we ontwikkelen bij Pronamic worden steeds complexer. Om de verschillende functionaliteiten van deze plugins bij elke release goed te testen kan het interessant zijn om gebruik te maken van unit testing. Met behulp van PHPUnit kunnen eenvoudig tests gedefinieerd worden en vervolgens automatisch uitgevoerd worden. Er zijn een aantal zeer [...]]]></description>
				<content:encoded><![CDATA[<p>Een aantal WordPress plugins die we ontwikkelen bij Pronamic worden steeds complexer. Om de verschillende functionaliteiten van deze plugins bij elke release goed te testen kan het interessant zijn om gebruik te maken van unit testing. Met behulp van PHPUnit kunnen eenvoudig tests gedefinieerd worden en vervolgens automatisch uitgevoerd worden. Er zijn een aantal zeer interessante tools beschikbaar waarmee deze tests eenvoudig opgezet kunnen worden.</p>
<ul>
<li><a href="http://michaelheap.com/installing-phpunit-under-php-5-4-from-homebrew/">http://michaelheap.com/installing-phpunit-under-php-5-4-from-homebrew/</a></li>
<li><a href="http://wp-cli.org/blog/plugin-unit-tests.html">http://wp-cli.org/blog/plugin-unit-tests.html</a></li>
<li><a href="http://make.wordpress.org/core/handbook/automated-testing/">http://make.wordpress.org/core/handbook/automated-testing/</a></li>
<li><a href="http://codex.buddypress.org/developer/automated-testing/">http://codex.buddypress.org/developer/automated-testing/</a></li>
<li><a href="https://github.com/wp-cli/sample-plugin">https://github.com/wp-cli/sample-plugin</a></li>
<li><a href="https://travis-ci.org/">https://travis-ci.org/</a></li>
</ul>
<pre class="brush:shell">svn co https://unit-tests.svn.wordpress.org/trunk wordpress-tests</pre>
<pre class="brush:shell">export WP_TESTS_DIR="/Users/remco/wp/wordpress-tests"</pre>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/06/unit-tests-voor-wordpress-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zoeken naar enter na afsluitende ?&gt; PHP tag</title>
		<link>http://remcotolsma.nl/2013/05/zoeken-naar-enter-na-afsluitende-php-tag/</link>
		<comments>http://remcotolsma.nl/2013/05/zoeken-naar-enter-na-afsluitende-php-tag/#comments</comments>
		<pubDate>Wed, 22 May 2013 13:49:03 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=690</guid>
		<description><![CDATA[Als WordPress ontwikkelaar kom ik regelmatig thema&#8217;s tegen waarin in functie bestanden zoals functions.php een afsluiten ?&#62; PHP tag wordt gebruikt. Deze afsluitende PHP-tag kan problemen geven als daar nog een spatie of lege regel achter staat. Als je de broncode van een website bekijkt zie je dan vaak bovenaan voor de DOCTYPE declaratie een [...]]]></description>
				<content:encoded><![CDATA[<p>Als WordPress ontwikkelaar kom ik regelmatig thema&#8217;s tegen waarin in functie bestanden zoals functions.php een afsluiten ?&gt; PHP tag wordt gebruikt. Deze afsluitende PHP-tag kan problemen geven als daar nog een spatie of lege regel achter staat. Als je de broncode van een website bekijkt zie je dan vaak bovenaan voor de DOCTYPE declaratie een spatie of een lege regel.</p>
<pre class="brush:php">?&gt;</pre>
<p>Hierdoor kunnen probleem ontstaan met bijvoorbeeld de XML-RPC-server of XML-sitemaps binnen WordPress. Binnen Eclipse kan gelukkig eenvoudig gezocht worden met behulp van reguliere expressies. Met behulp van de volgende zoekopdracht kan ik dergelijke problemen eenvoudig opspeuren binnen een Eclipse-project:</p>
<pre class="brush:plain">\?&gt;\s\z</pre>
<p>De \s zal overeenkomen met white space en de \z met het einde van het bestand.</p>
<p>We adviseren zelf altijd om PHP niet af te sluiten met een ?&gt; PHP-tag, dit levert vaak meer problemen op dan dat je er profijt van hebt.</p>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/05/zoeken-naar-enter-na-afsluitende-php-tag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming is terrible</title>
		<link>http://remcotolsma.nl/2013/05/programming-is-terrible/</link>
		<comments>http://remcotolsma.nl/2013/05/programming-is-terrible/#comments</comments>
		<pubDate>Sat, 11 May 2013 14:27:35 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[Geen categorie]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=681</guid>
		<description><![CDATA[Collega Leon wees me op de volgende video waarin Thomas Figg verteld over fouten van programmeurs en wat we daarvan kunnen leren . &#8220;Schrijf code wat eenvoudig is te vervangen, niet wat eenvoudig is uit te breiden.&#8221; http://youtu.be/csyL9EC0S0c?t=41m8s &#160;]]></description>
				<content:encoded><![CDATA[<p>Collega <a href="http://leon.rowland.nl/">Leon</a> wees me op de volgende video waarin <a href="https://plus.google.com/109990074487019855297/posts">Thomas Figg</a> verteld over fouten van programmeurs en wat we daarvan kunnen leren <img src='http://remcotolsma.nl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='625' height='382' src='http://www.youtube.com/embed/csyL9EC0S0c?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>&#8220;Schrijf code wat eenvoudig is te vervangen, niet wat eenvoudig is uit te breiden.&#8221;</p>
<p><a href="http://youtu.be/csyL9EC0S0c?t=41m8s">http://youtu.be/csyL9EC0S0c?t=41m8s</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/05/programming-is-terrible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Een succesvolle Git vertakking model</title>
		<link>http://remcotolsma.nl/2013/05/een-succesvolle-git-vertakking-model/</link>
		<comments>http://remcotolsma.nl/2013/05/een-succesvolle-git-vertakking-model/#comments</comments>
		<pubDate>Sat, 11 May 2013 14:13:22 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[Geen categorie]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=677</guid>
		<description><![CDATA[Op mijn werk bij Pronamic maken we al enige tijd gebruik van Git voor het bijhouden van ontwikkelingen in een versiebeheersysteem. We werkten hierbij voornamelijk met één tak, de &#8216;master&#8217; branch. Sinds ons team echter is versterk met een extra ontwikkelaar bleek dit echter niet altijd meer even handig te werken. Collega Leon stelde daarom [...]]]></description>
				<content:encoded><![CDATA[<p>Op mijn werk bij Pronamic maken we al enige tijd gebruik van Git voor het bijhouden van ontwikkelingen in een versiebeheersysteem. We werkten hierbij voornamelijk met één tak, de &#8216;master&#8217; branch. Sinds ons team echter is versterk met een extra ontwikkelaar bleek dit echter niet altijd meer even handig te werken. Collega <a href="http://leon.rowland.nl/">Leon</a> stelde daarom voor om te gaan werken volgens het <a href="http://nvie.com/posts/a-successful-git-branching-model/">branching model</a> van <a href="http://nvie.com/">Vincent Driessen</a>.</p>
<p>Vicent heeft een eenvoudige en logische manier van vertakken binnen Git in kaart gebracht. Hieronder is een mooi overzicht te zien van hoe het vertakken in de praktijk gebruikt kan worden:</p>
<p><a href="http://remcotolsma.nl/wp-content/uploads/git-branche-model.png"><img class="alignnone size-full wp-image-678" alt="Git branche model" src="http://remcotolsma.nl/wp-content/uploads/git-branche-model.png" width="611" height="815" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/05/een-succesvolle-git-vertakking-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress optimaliseren door WPEngine</title>
		<link>http://remcotolsma.nl/2013/05/wordpress-optimaliseren-door-wpengine/</link>
		<comments>http://remcotolsma.nl/2013/05/wordpress-optimaliseren-door-wpengine/#comments</comments>
		<pubDate>Sat, 11 May 2013 13:58:34 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=670</guid>
		<description><![CDATA[WPEngine is naar mijn idee één van de weinige partijen die echt goed weten wat er komt kijken bij het hosten van WordPress websites. Ze bieden een krachtige hosting oplossing aan die schaalbaar is voor de grotere WordPress websites. Ook bieden ze veel informatie over welke WordPress plugins je beter niet kunt gebruiken en hoe [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://wpengine.com/">WPEngine</a> is naar mijn idee één van de weinige partijen die echt goed weten wat er komt kijken bij het hosten van WordPress websites. Ze bieden een krachtige hosting oplossing aan die schaalbaar is voor de grotere WordPress websites. Ook bieden ze veel informatie over welke <a href="http://support.wpengine.com/disallowed-plugins/">WordPress plugins je beter niet kunt gebruiken</a> en hoe je je WordPress website kunt optimaliseren.</p>
<p><a href="http://markkelnar.com/">Mark Kelnar</a> (<a href="https://twitter.com/renderandserve">@renderandserve</a>) geeft in een presentatie tijdens <a href="http://2012.atlanta.wordcamp.org/">WordCamp Atlanta 2012</a> een aantal WordPress optimalisatie tips. De presentatie is terug te vinden op de volgende pagina en zeker de moeite waard om eens door te lezen:</p>
<p><a href="http://wpengine.com/optimizing-wordpress/">http://wpengine.com/optimizing-wordpress/</a></p>
<p>WPEngine heeft een zeer krachtige hosting omgeving voor WordPress neergezet. Volgens <a href="https://news.ycombinator.com/item?id=1614740">raheemm</a> draaien de WPEngine diensten op de volgende configuratie:</p>
<ul>
<li>NGINX (reverse proxy)</li>
<li>Apache (webserver)</li>
<li>APC (PHP Accelerator)</li>
<li>CDN ingebakken in de architectuur</li>
<li>Ongelooflijk krachtige hardware</li>
</ul>
<p>Ik denk dat veel Nederlandse WordPress hossting providers nog veel kunnen leren van de manier waarop WPEngine WordPress hosting aanbiedt.</p>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/05/wordpress-optimaliseren-door-wpengine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nederlandse vertaling WooCommerce 2.0.5</title>
		<link>http://remcotolsma.nl/2013/04/nederlandse-vertaling-woocommerce-2-0-5/</link>
		<comments>http://remcotolsma.nl/2013/04/nederlandse-vertaling-woocommerce-2-0-5/#comments</comments>
		<pubDate>Sat, 06 Apr 2013 17:56:22 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=642</guid>
		<description><![CDATA[In WooCommerce versie 2.0.5 kunnen de vertalingen voor de WordPress beheerdersomgeving ingeladen vanuit een eigen bestand. Op die manier hoeven niet alle WooCommerce vertalingen altijd geladen te worden. In de WooCommerce &#8216;load_plugin_textdomain&#8217; function is duidelijk te zien hoe dit is opgezet. Om de vertalingen zo efficiënt mogelijk op te zetten moeten er 2 .PO of [...]]]></description>
				<content:encoded><![CDATA[<p>In WooCommerce versie 2.0.5 kunnen de vertalingen voor de WordPress beheerdersomgeving ingeladen vanuit een eigen bestand. Op die manier hoeven niet alle WooCommerce vertalingen altijd geladen te worden. In de <a href="https://github.com/woothemes/woocommerce/blob/v2.0.5/woocommerce.php#L534">WooCommerce &#8216;load_plugin_textdomain&#8217; function</a> is duidelijk te zien hoe dit is opgezet.</p>
<p>Om de vertalingen zo efficiënt mogelijk op te zetten moeten er 2 .PO of .POT bestanden aangemaakt worden. Normaliter scande ik altijd met behulp van Poedit naar alle vertaalbare teksten binnen een plugin. Echter kan ik met Poedit niet onderscheid maken tussen vertalingen binnen de admin omgeving.</p>
<p>Er zijn meerdere gebruikers van Poedit die wel graag van een dergelijke functionaliteit gebruik willen maken. De ontwikkelaar van Poedit geeft echter in een <a href="http://www.poedit.net/trac/ticket/359">ticket</a> het volgende aan:</p>
<blockquote><p> The scanning feature of Poedit is intended for basic, simple uses. If you have more demanding needs, they you should write a proper makefile and call xgettext in it to create a POT file from your sources; then use Poedit just to translate PO catalogs and update them from that POT file.</p>
<p>At this time, I don&#8217;t want additional complications in this part of Poedit. Maybe later, when all the other, more serious, problems are fixed.</p></blockquote>
<p>Ik ben me daarom gaan verdiepen in de werking van xgettext:</p>
<ul>
<li><a href="http://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html">http://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html</a></li>
<li><a href="http://www.lxg.de/code/playing-with-xgettext">http://www.lxg.de/code/playing-with-xgettext</a></li>
<li><a href="http://stackoverflow.com/questions/1864233/recusive-xgettext">http://stackoverflow.com/questions/1864233/recusive-xgettext</a></li>
<li><a href="http://stackoverflow.com/questions/1352995/xgettext-vs-gettext">http://stackoverflow.com/questions/1352995/xgettext-vs-gettext</a></li>
<li><a href="http://stackoverflow.com/questions/11451105/recursive-scan-for-files-with-xgettext">http://stackoverflow.com/questions/11451105/recursive-scan-for-files-with-xgettext</a></li>
</ul>
<p>Uiteindelijk heb ik de volgende twee commando&#8217;s geschreven waarmee we de WooCommerce vertalingen kunnen opdelen in verschillende bestanden.</p>
<p><strong>WooCommerce admin</strong></p>
<pre class="brush:shell">find ./admin -iname "*.php" -type f | xgettext \
--from-code=UTF-8 \
--keyword=__ \
--keyword=_e \
--keyword=_n:1,2 \
--keyword=_x:1,2c \
--keyword=_ex:1,2c \
--keyword=_nx:1,2,4c \
--default-domain=woocommerce \
--language=PHP \
--copyright-holder="Remco Tolsma" \
--package-name=WooCommerce \
--package-version=2.0.5 \
--msgid-bugs-address="Remco Tolsma &lt;info@remcotolsma.nl&gt;" \
--files-from=- \
--output=woocommerce-admin.pot</pre>
<p><strong>WooCommerce</strong></p>
<pre class="brush:shell">find ./ -iname "*.php" -type f | xgettext \
--from-code=UTF-8 \
--keyword=__ \
--keyword=_e \
--keyword=_n:1,2 \
--keyword=_x:1,2c \
--keyword=_ex:1,2c \
--keyword=_nx:1,2,4c \
--default-domain=woocommerce \
--language=PHP \
--copyright-holder="Remco Tolsma" \
--package-name=WooCommerce \
--package-version=2.0.5 \
--msgid-bugs-address="Remco Tolsma &lt;info@remcotolsma.nl&gt;" \
--files-from=- \
--exclude-file=woocommerce-admin.pot \
--output=woocommerce.pot</pre>
<p>Bovenstaande commando&#8217;s bestaan uit  2 delen, een &#8216;find&#8217; commando waarmee alle PHP-bestanden binnen de plugin worden gevonden. En een &#8216;xgettext&#8217; commando die alle vertalingen binnen deze bestanden op zoekt. Hier worden de <a href="http://codex.wordpress.org/L10n">WordPress vertaalfuncties</a> als &#8216;keyword&#8217; meegegeven.</p>
<ul>
<li><a title="Function Reference/ 2" href="http://codex.wordpress.org/Function_Reference/_2"> __()</a></li>
<li><a title="Function Reference/ e" href="http://codex.wordpress.org/Function_Reference/_e"> _e()</a></li>
<li><a title="Function Reference/ n" href="http://codex.wordpress.org/Function_Reference/_n"> _n()</a></li>
<li><a title="Function Reference/ x" href="http://codex.wordpress.org/Function_Reference/_x"> _x()</a></li>
<li><a title="Function Reference/ ex" href="http://codex.wordpress.org/Function_Reference/_ex"> _ex()</a></li>
<li><a title="Function Reference/ nx" href="http://codex.wordpress.org/Function_Reference/_nx"> _nx()</a></li>
</ul>
<p>Mocht je overigens bij het uitvoeren van het tweede commando een &#8220;Segmentation&#8221; fout krijgen dan moet je misschien je gettext pakket updaten. Ik kreeg op mijn Mac deze fout met gettext versie 0.18.1. Na het updaten van <a href="https://trac.macports.org/browser/trunk/dports/devel/gettext/Portfile">gettext via MacPorts</a> naar versie 0.18.2 was dit probleem opgelost:</p>
<pre class="brush:shell">sudo port selfupdate
sudo port upgrade outdated</pre>
<p>Vervolgens hebben we de gegenereerde .POT-bestanden toegevoegd aan onze GlotPress installatie.</p>
<table>
<thead>
<tr>
<th scope="col">Omgeving</th>
<th scope="col">Aantal teksten</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://glotpress.pronamic.nl/projects/woocommerce/2.0.5-formal">WooCommerce</a></td>
<td>1391</td>
</tr>
<tr>
<td><a href="http://glotpress.pronamic.nl/projects/woocommerce/2.0.5-formal/admin">WooCommerce admin</a></td>
<td>1112</td>
</tr>
</tbody>
</table>
<p>Waar in WooCommerce 1.6.6 nog 2058 teksten in één bestand stonden en altijd geladen werden is dit met deze wijziging bijna gehalveerd. Deze verbetering hebben we ook verwerkt in de <a href="https://github.com/pronamic/wp-woocommerce-nl">&#8220;WooCommerce (nl)&#8221; plugin</a>. Met behulp van een Makefile kunnen we eenvoudig de 2 .POT-bestanden aanmaken:</p>
<pre class="brush:shell">WOOCOMMERCE_DIR=../woocommerce/

# Make POT files
extract:
	cd $(WOOCOMMERCE_DIR) &amp;&amp; \
	find ./admin -iname "*.php" -type f | xgettext \
	--from-code=UTF-8 \
	--keyword=__ \
	--keyword=_e \
	--keyword=_n:1,2 \
	--keyword=_x:1,2c \
	--keyword=_ex:1,2c \
	--keyword=_nx:1,2,4c \
	--default-domain=woocommerce \
	--language=PHP \
	--copyright-holder="Remco Tolsma" \
	--package-name=WooCommerce \
	--package-version=2.0.5 \
	--msgid-bugs-address="Remco Tolsma &lt;info@remcotolsma.nl&gt;" \
	--files-from=- \
	--output=$(CURDIR)/languages/woocommerce/woocommerce-admin.pot \

	cd $(WOOCOMMERCE_DIR) &amp;&amp; \
	find ./ -iname "*.php" -type f | xgettext \
	--from-code=UTF-8 \
	--keyword=__ \
	--keyword=_e \
	--keyword=_n:1,2 \
	--keyword=_x:1,2c \
	--keyword=_ex:1,2c \
	--keyword=_nx:1,2,4c \
	--default-domain=woocommerce \
	--language=PHP \
	--copyright-holder="Remco Tolsma" \
	--package-name=WooCommerce \
	--package-version=2.0.5 \
	--msgid-bugs-address="Remco Tolsma &lt;info@remcotolsma.nl&gt;" \
	--files-from=- \
	--exclude-file=$(CURDIR)/languages/woocommerce/woocommerce-admin.pot \
	--output=$(CURDIR)/languages/woocommerce/woocommerce.pot</pre>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/04/nederlandse-vertaling-woocommerce-2-0-5/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>W3 Total Cache mobile check</title>
		<link>http://remcotolsma.nl/2013/03/w3-total-cache-mobile-check/</link>
		<comments>http://remcotolsma.nl/2013/03/w3-total-cache-mobile-check/#comments</comments>
		<pubDate>Fri, 08 Mar 2013 10:10:07 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=635</guid>
		<description><![CDATA[Gebruikers van de &#8220;W3 Total Cache&#8221; plugin weten dat je per &#8220;User Agent Groups&#8221;, ook wel browser groepen, verschillende pagina caches kunt hanteren. Dit is erg handig voor als je WordPress website voor mobiele apparaten anders is opgebouwd dan voor desktop browsers. Met de wp_is_mobile() functie kun je dan eenvoudig je WordPress thema aanpassen voor [...]]]></description>
				<content:encoded><![CDATA[<p>Gebruikers van de &#8220;<a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a>&#8221; plugin weten dat je per &#8220;User Agent Groups&#8221;, ook wel browser groepen, verschillende pagina caches kunt hanteren. Dit is erg handig voor als je WordPress website voor mobiele apparaten anders is opgebouwd dan voor desktop browsers. Met de <a href="http://codex.wordpress.org/Function_Reference/wp_is_mobile">wp_is_mobile() functie</a> kun je dan eenvoudig je WordPress thema aanpassen voor mobiele appareten.</p>
<p><a href="http://remcotolsma.nl/wp-content/uploads/w3-total-cache-user-agent-groups.png"><img class="alignnone size-large wp-image-636" alt="W3 Total Cache mobile User Agent Groups" src="http://remcotolsma.nl/wp-content/uploads/w3-total-cache-user-agent-groups-1024x878.png" width="625" height="535" /></a></p>
<p>We liepen echter tegen problemen dat de <a href="http://codex.wordpress.org/Function_Reference/wp_is_mobile">wp_is_mobile() functie</a> check niet overeenkwam met de standaard W3 Total Cache &#8220;User Agent Groups&#8221;. Hierdoor werd soms op desktop browsers toch de mobiele versie van de website weergegeven. Daarom zijn we opzoek gegaan naar een manier om de W3 Total Cache check te gebruiken.</p>
<p>Na het doorzoeken van de W3 Total Cache code kwamen uit op de volgende classes en functies:</p>
<ul>
<li><a href="http://plugins.trac.wordpress.org/browser/w3-total-cache/tags/0.9.2.8/lib/W3/Mobile.php">http://plugins.trac.wordpress.org/browser/w3-total-cache/tags/0.9.2.8/lib/W3/Mobile.php</a></li>
<li><a href="http://plugins.trac.wordpress.org/browser/w3-total-cache/tags/0.9.2.8/lib/W3/CacheCase.php#L26">http://plugins.trac.wordpress.org/browser/w3-total-cache/tags/0.9.2.8/lib/W3/CacheCase.php#L26</a></li>
</ul>
<p>Aan de hand hiervan hebben we de volgende help functie kunnen schrijven:</p>
<pre class="brush:php">if ( ! function_exists( 'is_mobile' ) ) { 
	function is_mobile() {
		$is_mobile = false;

		if ( class_exists( 'W3_Mobile' ) ) {
			$w3_mobile = new W3_Mobile();

			$group = $w3_mobile-&gt;get_group();

			$is_mobile = $group !== false;
		}

		return $is_mobile;
	}
}</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/03/w3-total-cache-mobile-check/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WooCommerce teksten wijzigen</title>
		<link>http://remcotolsma.nl/2013/03/woocommerce-teksten-wijzigen/</link>
		<comments>http://remcotolsma.nl/2013/03/woocommerce-teksten-wijzigen/#comments</comments>
		<pubDate>Fri, 01 Mar 2013 14:57:02 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[E-commerce]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=629</guid>
		<description><![CDATA[In het bericht &#8220;WooCommerce ‘Toevoegen aan winkelwagen’ tekst wijzigen&#8221; schreef ik al hoe je een specifieke WooCommerce tekst kon wijzigen. Helaas zijn met behulp van deze oplossing niet alle WooCommerce teksten te wijzigen. Toch komt het wel eens voor dat ook andere teksten gewijzigd moet worden. Binnen bepaalde webwinkels is &#8220;Bestellen&#8221; bijvoorbeeld een betere vertaling [...]]]></description>
				<content:encoded><![CDATA[<p>In het bericht &#8220;<a title="WooCommerce ‘Toevoegen aan winkelwagen’ tekst wijzigen" href="http://remcotolsma.nl/2012/11/woocommerce-toevoegen-aan-winkelwagen-tekst-wijzigen/">WooCommerce ‘Toevoegen aan winkelwagen’ tekst wijzigen</a>&#8221; schreef ik al hoe je een specifieke WooCommerce tekst kon wijzigen. Helaas zijn met behulp van deze oplossing niet alle WooCommerce teksten te wijzigen. Toch komt het wel eens voor dat ook andere teksten gewijzigd moet worden. Binnen bepaalde webwinkels is &#8220;Bestellen&#8221; bijvoorbeeld een betere vertaling voor  &#8220;Checkout&#8221;  in plaats van &#8220;Afrekenen&#8221;.</p>
<p>Met behulp van de volgende code kunnen alle WooCommerce teksten eenvoudig aangepast worden.</p>
<pre class="brush:php">/**
 * Translate WooCommerce text
 *
 * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/gettext
 */
function prefix_translate_woocommerce( $translated_text, $text, $domain ) {
	if ( $domain == 'woocommerce' ) {
		switch ( $text ) {
			case 'Checkout &amp;rarr;' :
				$translated_text = 'Bestellen';
				break;
			case 'Add to Cart' :
			case 'Add to cart' :
				$translated_text = 'Bestellen';
				break;
		}
	}

	return $translated_text;
}

add_filter( 'gettext', 'prefix_translate_woocommerce', 20, 3 );</pre>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/03/woocommerce-teksten-wijzigen/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Twinfield factuur sjabloon wijzigen in LibreOffice (OpenOffice)</title>
		<link>http://remcotolsma.nl/2013/02/twinfield-factuur-sjabloon-wijzigen-in-libreoffice-openoffice/</link>
		<comments>http://remcotolsma.nl/2013/02/twinfield-factuur-sjabloon-wijzigen-in-libreoffice-openoffice/#comments</comments>
		<pubDate>Tue, 26 Feb 2013 20:02:40 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[Geen categorie]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=577</guid>
		<description><![CDATA[Binnen Twinfield kunnen facturen gemaakt worden op basis van Word sjabloon. Deze sjablonen kunnen eenvoudig met behulp van Word gewijzigd worden. In de volgende YouTube video is te zien hoe dit gerealiseerd kan worden: We maken bij Pronamic echter geen gebruik van Word, maar van OpenOffice en/of LibreOffice. Als we de sjablonen met deze programma&#8217;s [...]]]></description>
				<content:encoded><![CDATA[<p>Binnen Twinfield kunnen facturen gemaakt worden op basis van Word sjabloon. Deze sjablonen kunnen eenvoudig met behulp van Word gewijzigd worden. In de volgende <a href="http://youtu.be/hk8rol6sgJY">YouTube video</a> is te zien hoe dit gerealiseerd kan worden:</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='625' height='382' src='http://www.youtube.com/embed/hk8rol6sgJY?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>We maken bij Pronamic echter geen gebruik van Word, maar van <a href="http://nl.wikipedia.org/wiki/OpenOffice">OpenOffice</a> en/of <a href="http://nl.wikipedia.org/wiki/LibreOffice">LibreOffice</a>. Als we de sjablonen met deze programma&#8217;s wijzigden dan ontstonden er helaas problemen. Hierdoor konden we bij Pronamic de Twinfield factuur sjablonen helaas niet wijzigen.</p>
<p>In de <a href="https://c1.twinfield.com/support/salesforce.aspx">Twinfield Knowledge Base</a> staan verschillende voorbeelden van hoe een factuur sjabloon er uit moet zien:</p>
<ul>
<li>Hoe maak ik een Word-factuur, een aanmaning of een betaalspecificatie?</li>
<li>How do I create a Word-invoice, a dunning or a payment specification?</li>
</ul>
<h2>Nederlandse sjablonen</h2>
<table>
<thead>
<tr>
<th scope="col">Bestand</th>
<th scope="col">Grootte</th>
<th scope="col">Laatst gewijzigd</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P2000000Guvde&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">uitleg_Word_sjabloon.doc</a></td>
<td>123KB</td>
<td>06/08/2012 13:18</td>
</tr>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P2000000Fyi9Y&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">sjabloon-NL-FactuurExclBTW-4.1.docx</a></td>
<td>15KB</td>
<td>16/07/2012 13:48</td>
</tr>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P20000009yVpW&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">sjabloon-NL-TimePlus-1.2.dot</a></td>
<td>48KB</td>
<td>30/06/2011 13:12</td>
</tr>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P20000009yVlm&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">sjabloon-NL-Time-1.3.dot</a></td>
<td>45KB</td>
<td>30/06/2011 13:12</td>
</tr>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P20000009yVoe&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">sjabloon-NL-FactuurInclBTW-4.1.dot</a></td>
<td>47KB</td>
<td>30/06/2011 13:12</td>
</tr>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P20000009yVp2&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">sjabloon-NL-BetalenIncasseren-1.2.dot</a></td>
<td>35KB</td>
<td>30/06/2011 13:11</td>
</tr>
<tr>
<td><a href="https://emea.salesforce.com/servlet/servlet.FileDownloadPkb?file=00P20000009yVoi&amp;orgId=00D20000000McGC&amp;pPid=50120000000TtfE">sjabloon-NL-Aanmaning-1.6.dot</a></td>
<td>37KB</td>
<td>30/06/2011 13:10</td>
</tr>
</tbody>
</table>
<h2>Engelse sjablonen</h2>
<table>
<thead>
<tr>
<th scope="col">Bestand</th>
<th scope="col">Grootte</th>
<th scope="col">Laatst gewijzigd</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P2000000HmIR1&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">ChequeTemplate.doc</a></td>
<td>46KB</td>
<td>27/09/2012 12:21</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P2000000GuvJs&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">explanation_Word_template.doc</a></td>
<td>126KB</td>
<td>06/08/2012 13:20</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P20000009yWxR&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">template-EN-TimePlus-1.3.dot</a></td>
<td>58KB</td>
<td>30/06/2011 16:42</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P20000009yWvv&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">template-EN-Time-1.4.dot</a></td>
<td>47KB</td>
<td>30/06/2011 16:41</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P20000009yWx7&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">template-EN-PayCollect-1.2.dot</a></td>
<td>36KB</td>
<td>30/06/2011 16:41</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P20000009yWnK&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">template-EN-Invoice-VatIncl-4.1.dot</a></td>
<td>46KB</td>
<td>30/06/2011 16:40</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P20000009yWwY&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">template-EN-Invoice-VatExcl-4.1.dot</a></td>
<td>46KB</td>
<td>30/06/2011 16:39</td>
</tr>
<tr>
<td><a href="http://beta.remcotolsma.nl/servlet/servlet.FileDownloadPkb?file=00P20000009yWwT&amp;orgId=00D20000000McGC&amp;pPid=50120000000Ttg7" class="broken_link">template-EN-Dunning-1.6.dot</a></td>
<td>36KB</td>
<td>30/06/2011 16:39</td>
</tr>
</tbody>
</table>
<p>In het uitleg document van Twinfield wordt aangegeven dat de volgende samenvoeg velden beschikbaar zijn:</p>
<pre class="brush:plain">HeaderStart
HeaderEnd
FooterStart
FooterEnd
addressinv_name
addressinv_addr1
addressinv_addr2
addressinv_addr3
addressinv_postcode
addressinv_city
addressinv_country_@code
addressinv_country
addressinv_addr4
addressinv_addr5
addressdel_name
addressdel_addr1
addressdel_addr2
addressdel_addr3
addressdel_postcode
addressdel_city
addressdel_country_@code
addressdel_country
addressdel_addr4
addressdel_addr5
header_invdate
header_duedate
header_perfdate
header_invnum
header_vatnumber
header_customer
header_customername
header_period
header_headerdescr
header_footerdescr
header_printstatus
header_paycode
bank_name
bank_account
header_print
header_printcount
header_usrcode_@name
header_authoriser_@name
TableStart:lines
TableEnd:lines
lines_line_@id
header_currency
lines_line_artcode
lines_line_subcode
lines_line_name
lines_line_sname
lines_line_extref1
lines_line_extref2
lines_line_extref3
lines_line_dim2
lines_line_dim2_@name
lines_line_dim3
lines_line_dim3_@name
lines_line_dim4
lines_line_dim4_@name
lines_line_fincode
lines_line_finnumber
lines_line_acpay_@name
lines_line_perfdate
lines_line_qty
lines_line_descr
lines_line_unitsprice_@regional
lines_line_unitspriceinc_@regional
lines_line_currency
lines_line_taxrate
lines_line_taxvalue_@regional
lines_line_invvalue_@regional
lines_line_invvalueinc_@regional
TableStart:taxlines
TableEnd:taxlines
calclines_taxline_currency
calclines_taxline_taxname
calclines_taxline_perftype
calclines_taxline_perfyearmonth
calclines_taxline_taxover_@regional
calclines_taxline_taxvalue_@regional
calclines_taxline_valueincl_@regional
calclines_totalline_valueexcl_@regional
calclines_totalline_taxvalue_@regional
calclines_totalline_value_@regional
lines_line_teq_week
lines_line_teq_month
lines_line_teq_quarter
lines_line_dim1
lines_line_dim1_@name
lines_line_dim1_@sname
lines_line_dim1_@prjinvdescr
lines_line_dim2_@sname
lines_line_dim2_@prjinvdescr
lines_line_transdate
TableStart:timelines
TableEnd:timelines
time_line_user_@name
time_line_user_@sname
time_line_user
time_line_transdate
time_line_project_@name
time_line_project_@sname
time_line_project_@prjinvdescr
time_line_project
time_line_activity_@name
time_line_activity_@sname
time_line_activity_@actinvdescr
time_line_activity
time_line_descr
time_line_qty
time_line_price
calclines_totalline_value_@predecimal
calclines_totalline_value_@postdecimal
header_customer_@account
customer_custname
customer_name
customer_addr1
customer_addr2
customer_addr3
customer_postcode
customer_city
customer_country
customer_country_@name
customer_modified
customer_dimcode
customer_basecurrency
customer_basecurrency_@name
customer_basecurrency_@shortname
customer_reportingcurrency
customer_reportingcurrency_@name
customer_reportingcurrency_@shortname
customer_invoicecurrency
customer_invoicecurrency_@name
customer_invoicecurrency_@shortname
customer_totalbasevalueopen
customer_totalrepvalueopen
customer_totalvalueopen
TableStart:customer
TableEnd:customer
customer_detail_invnumber
customer_detail_inpdate
customer_detail_basevalueopen
customer_detail_valueopen
customer_detail_repvalueopen
customer_detail_basevalue
customer_detail_value
customer_detail_repvalue
customer_detail_basevaluepaid
customer_detail_valuepaid
customer_detail_repvaluepaid
customer_detail_days
customer_detail_duedate
customer_detail_currency
customer_detail_currency_@name
customer_detail_currency_@shortname
customer_detail_description
customer_totalbasevalueopen_@predecimal
customer_totalrepvalueopen_@predecimal
customer_totalvalueopen_@predecimal
customer_totalbasevalueopen_@postdecimal
customer_totalrepvalueopen_@postdecimal
customer_totalvalueopen_@postdecimal
customer_account
name
addr1
addr2
addr3
addr4
addr5
postcode
city
country
dimcode
dimname
date
office_code
office_name
office_vatnumber
office_address_line1
office_address_line2
office_address_line3
office_address_line4
office_address_line5
office_address_line6
office_address_zipcode
office_address_city
office_address_country
office_address_telephone
office_address_fax
bank_code
bank_ascription
bank_iban
bank_accountnumber
bank_nationalbic
bank_bic
bank_address_line1
bank_address_line2
bank_address_line3
bank_address_line4
bank_address_line5
bank_address_line6
bank_address_zipcode
bank_address_city
bank_address_country
bank_address_telephone
bank_address_fax
TableStart:details
TableEnd:details
details_detail_invdate
details_detail_duedate
details_detail_invnumber
details_detail_origvalue
details_detail_value
details_detail_origbasevalue
details_detail_basevalue
details_detail_trscode_@name
details_detail_trsnumber
origvalue
value
currency
valuetext
TableStart:cheque_details
TableEnd:cheque_details
cheque_details_detail_invdate
cheque_details_detail_duedate
cheque_details_detail_invnumber
cheque_details_detail_origvalue
cheque_details_detail_value
cheque_details_detail_origbasevalue
cheque_details_detail_basevalue
cheque_details_detail_trscode_@name
cheque_details_detail_trsnumber
millions
hundreds_of_thousands
tens_of_thousands
thousands
hundreds
tens
units
cents</pre>
<p>Helaas gaan deze Word samenvoeg velden verloren bij het opslaan van .doc bestanden in LibreOffice. Na veel uitzoekwerk bleek dit te komen doordat de samenvoeg velden niet gekoppeld zijn aan een database.</p>
<p>Binnen LibreOffice kan er net als in Microsoft Word gewerkt worden met samenvoeg velden. In het LibreOffice worden deze samenvoeg velden ook wel &#8220;Mail merge fields&#8221; genoemd.</p>
<p><a href="http://remcotolsma.nl/wp-content/uploads/libreoffice-mail-merge-fields.png"><img class="alignnone size-large wp-image-615" alt="LibreOffice - Mail merge fields" src="http://remcotolsma.nl/wp-content/uploads/libreoffice-mail-merge-fields-1024x758.png" width="625" height="462" /></a></p>
<p>Deze &#8220;Mail merge fields&#8221; kunnen echter niet vrij ingevoerd worden. In plaats daarvan moeten er kolommen uit een database tabel geselecteerd worden. Door een CSV bestand aan te maken met alle beschikbare Twinfield samenvoeg velden is dit echter eenvoudig te realiseren.</p>
<pre class="brush:plain">HeaderStart,HeaderEnd,FooterStart,FooterEnd,addressinv_name,addressinv_addr1,addressinv_addr2,addressinv_addr3,addressinv_postcode,addressinv_city,addressinv_country_@code,addressinv_country,addressinv_addr4,addressinv_addr5,addressdel_name,addressdel_addr1,addressdel_addr2,addressdel_addr3,addressdel_postcode,addressdel_city,addressdel_country_@code,addressdel_country,addressdel_addr4,addressdel_addr5,header_invdate,header_duedate,header_perfdate,header_invnum,header_vatnumber,header_customer,header_customername,header_period,header_headerdescr,header_footerdescr,header_printstatus,header_paycode,bank_name,bank_account,header_print,header_printcount,header_usrcode_@name,header_authoriser_@name,TableStart:lines,TableEnd:lines,lines_line_@id,header_currency,lines_line_artcode,lines_line_subcode,lines_line_name,lines_line_sname,lines_line_extref1,lines_line_extref2,lines_line_extref3,lines_line_dim2,lines_line_dim2_@name,lines_line_dim3,lines_line_dim3_@name,lines_line_dim4,lines_line_dim4_@name,lines_line_fincode,lines_line_finnumber,lines_line_acpay_@name,lines_line_perfdate,lines_line_qty,lines_line_descr,lines_line_unitsprice_@regional,lines_line_unitspriceinc_@regional,lines_line_currency,lines_line_taxrate,lines_line_taxvalue_@regional,lines_line_invvalue_@regional,lines_line_invvalueinc_@regional,TableStart:taxlines,TableEnd:taxlines,calclines_taxline_currency,calclines_taxline_taxname,calclines_taxline_perftype,calclines_taxline_perfyearmonth,calclines_taxline_taxover_@regional,calclines_taxline_taxvalue_@regional,calclines_taxline_valueincl_@regional,calclines_totalline_valueexcl_@regional,calclines_totalline_taxvalue_@regional,calclines_totalline_value_@regional,lines_line_teq_week,lines_line_teq_month,lines_line_teq_quarter,lines_line_dim1,lines_line_dim1_@name,lines_line_dim1_@sname,lines_line_dim1_@prjinvdescr,lines_line_dim2_@sname,lines_line_dim2_@prjinvdescr,lines_line_transdate,TableStart:timelines,TableEnd:timelines,time_line_user_@name,time_line_user_@sname,time_line_user,time_line_transdate,time_line_project_@name,time_line_project_@sname,time_line_project_@prjinvdescr,time_line_project,time_line_activity_@name,time_line_activity_@sname,time_line_activity_@actinvdescr,time_line_activity,time_line_descr,time_line_qty,time_line_price,calclines_totalline_value_@predecimal,calclines_totalline_value_@postdecimal,header_customer_@account,customer_custname,customer_name,customer_addr1,customer_addr2,customer_addr3,customer_postcode,customer_city,customer_country,customer_country_@name,customer_modified,customer_dimcode,customer_basecurrency,customer_basecurrency_@name,customer_basecurrency_@shortname,customer_reportingcurrency,customer_reportingcurrency_@name,customer_reportingcurrency_@shortname,customer_invoicecurrency,customer_invoicecurrency_@name,customer_invoicecurrency_@shortname,customer_totalbasevalueopen,customer_totalrepvalueopen,customer_totalvalueopen,TableStart:customer,TableEnd:customer,customer_detail_invnumber,customer_detail_inpdate,customer_detail_basevalueopen,customer_detail_valueopen,customer_detail_repvalueopen,customer_detail_basevalue,customer_detail_value,customer_detail_repvalue,customer_detail_basevaluepaid,customer_detail_valuepaid,customer_detail_repvaluepaid,customer_detail_days,customer_detail_duedate,customer_detail_currency,customer_detail_currency_@name,customer_detail_currency_@shortname,customer_detail_description,customer_totalbasevalueopen_@predecimal,customer_totalrepvalueopen_@predecimal,customer_totalvalueopen_@predecimal,customer_totalbasevalueopen_@postdecimal,customer_totalrepvalueopen_@postdecimal,customer_totalvalueopen_@postdecimal,customer_account,name,addr1,addr2,addr3,addr4,addr5,postcode,city,country,dimcode,dimname,date,office_code,office_name,office_vatnumber,office_address_line1,office_address_line2,office_address_line3,office_address_line4,office_address_line5,office_address_line6,office_address_zipcode,office_address_city,office_address_country,office_address_telephone,office_address_fax,bank_code,bank_ascription,bank_iban,bank_accountnumber,bank_nationalbic,bank_bic,bank_address_line1,bank_address_line2,bank_address_line3,bank_address_line4,bank_address_line5,bank_address_line6,bank_address_zipcode,bank_address_city,bank_address_country,bank_address_telephone,bank_address_fax,TableStart:details,TableEnd:details,details_detail_invdate,details_detail_duedate,details_detail_invnumber,details_detail_origvalue,details_detail_value,details_detail_origbasevalue,details_detail_basevalue,details_detail_trscode_@name,details_detail_trsnumber,origvalue,value,currency,valuetext,TableStart:cheque_details,TableEnd:cheque_details,cheque_details_detail_invdate,cheque_details_detail_duedate,cheque_details_detail_invnumber,cheque_details_detail_origvalue,cheque_details_detail_value,cheque_details_detail_origbasevalue,cheque_details_detail_basevalue,cheque_details_detail_trscode_@name,cheque_details_detail_trsnumber,millions,hundreds_of_thousands,tens_of_thousands,thousands,hundreds,tens,units,cents</pre>
<p>Dit bestand kan opslagen worden in <a href="http://remcotolsma.nl/wp-content/uploads/Twinfield.csv">Twinfield.csv</a> en vervolgens gebruikt worden bij het invoegen van een &#8220;Mail merge field&#8221;. Vervolgens kun je je sjabloon helemaal naar wens inrichten en opslaan in het ODF Text Document (.odt) formaat.</p>
<p>Zodra het sjabloon geüpload moet worden naar Twinfield is een bestandsnaam met de extensie .doc, .dot, .docx of .dotx nodig. Bij het uploaden van andere bestanden zal Twinfield de volgende foutmelding weergeven:</p>
<blockquote><p>Selecteer een DOC-, DOT-, DOCX- of DOTX-bestand.</p></blockquote>
<p>Als we ons ODF Text Document echter opslaan volgens het &#8220;&#8221; of &#8220;&#8221; formaat geeft Twinfield de volgende foutmelding:</p>
<blockquote><p>De Word-sjabloon bevat geen samenvoegvelden.</p></blockquote>
<p>Daarom slaan we ons bestand niet op volgens dit formaat maar wijzigen we ons &#8220;bestandsnaam.odt&#8221; simpelweg naar &#8220;bestandsnaam.odt.dot&#8221;. Vreemd genoeg kan Twinfield het ODF Text Document met een geldige extensie gewoon correct verwerken.</p>
<p>Helaas werken niet alle aspecten van een ODF Text Document even goed in Word en dus Twinfield. Zo wordt de opmaak van afbeeldingen en frames niet altijd goed over genomen. Dit probleem is echter vrij eenvoudig te omzeilen door puur met een tabellen opmaak te werken.</p>
<ul>
<li><a href="http://remcotolsma.nl/wp-content/uploads/pronamic-logo.png">Pronamic logo (PNG)</a></li>
<li><a href="http://remcotolsma.nl/wp-content/uploads/pronamic-twinfield-factuur.odt">Pronamic Twinfield factuur sjabloon (ODT)</a></li>
<li><a href="http://remcotolsma.nl/wp-content/uploads/pronamic-twinfield-voorbeeld.pdf">Pronamic Twinfield factuur voorbeeld (PDT)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/02/twinfield-factuur-sjabloon-wijzigen-in-libreoffice-openoffice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress database prefix wijzigen</title>
		<link>http://remcotolsma.nl/2013/01/wordpress-database-prefix-wijzigen/</link>
		<comments>http://remcotolsma.nl/2013/01/wordpress-database-prefix-wijzigen/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 18:33:59 +0000</pubDate>
		<dc:creator>remcotolsma</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://remcotolsma.nl/?p=571</guid>
		<description><![CDATA[Voor het wijzigen van de WordPress database prefix zijn verschillende plugins beschikbaar. Deze plugins wijzigen echter niet altijd alle prefixes. De WordPress database prefix wordt namelijk naast in de tabel namen ook gebruikt in de &#8216;options&#8217; en &#8216;usermeta&#8217; tabellen. Jan Egbert tipte me daarom over de volgende SQL query: UPDATE wp_usermeta SET meta_key = REPLACE(meta_key, [...]]]></description>
				<content:encoded><![CDATA[<p>Voor het wijzigen van de WordPress database prefix zijn verschillende plugins beschikbaar. Deze plugins wijzigen echter niet altijd alle prefixes. De WordPress database prefix wordt namelijk naast in de tabel namen ook gebruikt in de &#8216;options&#8217; en &#8216;usermeta&#8217; tabellen. <a href="http://www.janegbert.nl/" target="_blank">Jan Egbert</a> tipte me daarom over de volgende SQL query:</p>
<pre class="brush:sql">UPDATE wp_usermeta SET meta_key = REPLACE(meta_key, 'wp_', 'nieuweprefix_') WHERE meta_key LIKE 'wp\_%';</pre>
<p>Via een aantal andere websites kwam ik er achter dat ook de &#8216;options&#8217; tabel de WordPress database prefix wordt gebruikt. Daarom zal waarschijnlijk ook de volgende query uitgevoerd moeten worden:</p>
<pre class="brush:sql">UPDATE wp_options SET option_name = REPLACE(option_name, 'wp_', 'nieuweprefix_') WHERE option_name LIKE 'wp\_%';</pre>
<p>Bovenstaande queries gaat echter fout zodra de WordPress database prefix terug komt in de optie naam of de user meta key.</p>
<table>
<thead>
<tr>
<th scope="col">umeta_id</th>
<th scope="col">user_id</th>
<th scope="col">meta_key</th>
<th scope="col">meta_value</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>1</td>
<td>wp_pronamic_wp_version</td>
<td>3.5</td>
</tr>
</tbody>
</table>
<p>Zal na het uitvoeren van de query gewijzigd worden naar:</p>
<table>
<thead>
<tr>
<th scope="col">umeta_id</th>
<th scope="col">user_id</th>
<th scope="col">meta_key</th>
<th scope="col">meta_value</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>1</td>
<td>nieuweprefix_pronamic_nieuweprefix_version</td>
<td>3.5</td>
</tr>
</tbody>
</table>
<p>De &#8220;<a href="http://wordpress.org/extend/plugins/db-prefix-change/" target="_blank">Change DB Prefix</a>&#8221; plugin lijkt uitgerust zijn met de juiste queries:</p>
<p><a href="http://plugins.trac.wordpress.org/browser/db-prefix-change/tags/1.1/db_prefix.php#L83" target="_blank">http://plugins.trac.wordpress.org/browser/db-prefix-change/tags/1.1/db_prefix.php#L83</a></p>
<h2>Meer informatie:</h2>
<ul>
<li><a href="http://digwp.com/2010/10/change-database-prefix/" target="_blank">http://digwp.com/2010/10/change-database-prefix/</a></li>
<li><a href="http://tdot-blog.com/wordpress/6-simple-steps-to-change-your-table-prefix-in-wordpress" target="_blank">http://tdot-blog.com/wordpress/6-simple-steps-to-change-your-table-prefix-in-wordpress</a></li>
<li><a href="http://www.wpbeginner.com/wp-tutorials/how-to-change-the-wordpress-database-prefix-to-improve-security/" target="_blank">http://www.wpbeginner.com/wp-tutorials/how-to-change-the-wordpress-database-prefix-to-improve-security/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://remcotolsma.nl/2013/01/wordpress-database-prefix-wijzigen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
