<?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>Kevin Deldycke &#187; WordPress</title> <atom:link href="http://kevin.deldycke.com/tag/wordpress/feed/" rel="self" type="application/rss+xml" /><link>http://kevin.deldycke.com</link> <description>Free software engineer &#38; wannabe videomaker</description> <lastBuildDate>Fri, 03 Feb 2012 19:08:27 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Auto-advance WordPress&#8217; TwentyEleven showcase slides</title><link>http://kevin.deldycke.com/2011/12/auto-advance-wordpress-twentyeleven-showcase-slides/</link> <comments>http://kevin.deldycke.com/2011/12/auto-advance-wordpress-twentyeleven-showcase-slides/#comments</comments> <pubDate>Tue, 27 Dec 2011 11:44:02 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[showcase]]></category> <category><![CDATA[Template]]></category> <category><![CDATA[Theme]]></category> <category><![CDATA[twentyeleven]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=4227</guid> <description><![CDATA[WordPress default theme, TwentyEleven, has a built-in showcase mode that is displaying a set a slides (composed of sticky posts) at the top of a page. This mode can be activated by creating a static page and set its Template &#8230; <a href="http://kevin.deldycke.com/2011/12/auto-advance-wordpress-twentyeleven-showcase-slides/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>WordPress default theme, <a href="http://theme.wordpress.com/themes/twentyeleven/">TwentyEleven</a>, has a built-in <a href="http://twentyelevendemo.wordpress.com/showcase/">showcase mode</a> that is displaying a set a slides (composed of sticky posts) at the top of a page. This mode can be activated by creating a static page and set its <em>Template</em> page attribute to <em>Showcase Template</em>.</p><p>The problem with this mode to me was the lack of an auto-advance feature that will cycle through the slides every X seconds. Luckily I <a href="http://pastebin.com/s6JEthVi">found a way</a> to automate implement this with some lines of JavaScript:</p><pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
    // Auto-advance the showcase slider
    // Source: http://pastebin.com/s6JEthVi
    jQuery(document).ready(function(){
        var change_every = 5; // The number of seconds that the slider will auto-advance in
        var current = 1;
        function auto_advance(){
            if(current == -1) return false;
            jQuery('.feature-slider a').eq(current % jQuery('.feature-slider a').length).trigger('click', [true]);
            current++;
        };
        setInterval(function(){auto_advance()}, change_every * 1000);
    });
&lt;/script&gt;
</pre><p>All you have to do is to embed this snippet of code within your home page. It could either be in the static page you use as a showcase template or in a showcase widget. The latter is the exact same method I used earlier that year to <a href="http://kevin.deldycke.com/2011/01/new-blog-header-and-tiny-wordpress-theme-customizations/">customize CSS in WordPress without messing with the original code</a>.</p><p>And of course this code is currently live at the front page of that very blog.</p> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/12/auto-advance-wordpress-twentyeleven-showcase-slides/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>WordPress commands</title><link>http://kevin.deldycke.com/2011/12/wordpress-commands/</link> <comments>http://kevin.deldycke.com/2011/12/wordpress-commands/#comments</comments> <pubDate>Tue, 13 Dec 2011 11:41:07 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Blog]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=3410</guid> <description><![CDATA[To activate the debug mode of WordPress, add the following PHP code in wp-config.php: This SQL query remove all revisions of posts having the topic, reply and attachment type (tested on WordPress 3.1.x):]]></description> <content:encoded><![CDATA[<ul><li>To activate the debug mode of WordPress, add the following PHP code in <code>wp-config.php</code>:<pre class="brush: php; title: ; notranslate">
define('WP_DEBUG', true);
</pre></li><li>This SQL query remove all revisions of posts having the <code>topic</code>, <code>reply</code> and <code>attachment</code> type (tested on WordPress 3.1.x):<pre class="brush: sql; title: ; notranslate">
DELETE child.* FROM wp_posts AS child LEFT JOIN wp_posts AS parent ON parent.ID = child.post_parent WHERE child.post_type = &quot;revision&quot; AND parent.post_type IN (&quot;topic&quot;, &quot;reply&quot;, &quot;attachment&quot;);
</pre></li></ul> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/12/wordpress-commands/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>My Nginx + PHP-FPM + MySQL configuration</title><link>http://kevin.deldycke.com/2011/09/nginx-php-fpm-mysql-configuration/</link> <comments>http://kevin.deldycke.com/2011/09/nginx-php-fpm-mysql-configuration/#comments</comments> <pubDate>Tue, 20 Sep 2011 10:22:13 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Debian]]></category> <category><![CDATA[debian squeeze]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[nginx]]></category> <category><![CDATA[ovh]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[php-fpm]]></category> <category><![CDATA[Server]]></category> <category><![CDATA[virtual server]]></category> <category><![CDATA[virtualization]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=3594</guid> <description><![CDATA[This article is a follow-up to the one I wrote 3 months ago, in which I explained how to install a web stack based on Nginx, PHP-FPM and MySQL on a Debian Squeeze server. Now it&#8217;s time to tune this &#8230; <a href="http://kevin.deldycke.com/2011/09/nginx-php-fpm-mysql-configuration/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>This article is a follow-up to the one I wrote 3 months ago, in which I explained how to <a href="http://kevin.deldycke.com/2011/06/nginx-php-fpm-mysql-debian-squeeze-server/">install a web stack based on Nginx, PHP-FPM and MySQL</a> on a Debian Squeeze server. Now it&#8217;s time to tune this basic install to get some performance out of it.</p><p><a href="http://kevin.deldycke.com/wp-content/uploads/2011/08/ovh-vps-3-virtual-server.png"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/08/ovh-vps-3-virtual-server-150x150.png" alt="" title="ovh-vps-3-virtual-server" width="150" height="150" class="alignleft size-thumbnail wp-image-3801" /></a> The setup I&#8217;ll detail below runs on an <a href="http://www.ovh.co.uk/vps/">OVH VPS</a> instance. This virtual server has 4 CPU cores at 1.5GHz, 1 Go RAM and 50 Gb HDD.</p><p>I&#8217;m mostly running WordPress instances on that server, so you&#8217;ll see some reference of it in this post.</p><h2>MySQL</h2><p>First, let&#8217;s tune MySQL. That&#8217;s the easiest part of that article, as you only need to create a <code>.cnf</code> file in <code>/etc/mysql/conf.d/</code> and place there all your custom parameters. Here is the content of my <code>/etc/mysql/conf.d/kev.cnf</code>:</p><pre class="brush: plain; title: ; notranslate">
[mysqld]
interactive_timeout = 50
join_buffer = 1M
key_buffer = 250M
max_connections = 100
max_heap_table_size = 32M
myisam_sort_buffer_size = 96M
query_cache_limit = 4M
query_cache_size = 250M
query_prealloc_size = 65K
query_alloc_block_size = 128K
read_buffer_size = 1M
read_rnd_buffer_size = 768K
sort_buffer_size = 1M
table_cache = 4096
thread_cache_size = 1024
tmp_table_size = 32M
wait_timeout = 500
# Debug
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
# InnoDBinnodb_buffer_pool_size = 256Minnodb_additional_mem_pool_size = 10Minnodb_log_file_size = 32Minnodb_flush_method = O_DIRECTinnodb_file_per_table = 1innodb_flush_log_at_trx_commit = 0
[mysqld_safe]
nice = -5
open_files_limit = 8192

[isamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M
</pre><p>Most of these parameters were set for my particular usage and with insights from the <a href="http://launchpad.net/mysql-tuning-primer">MySQL Tuning Primer Script</a>.</p><h2>PHP-FPM</h2><p>Unlike MySQL, the structure of PHP configuration files on Debian Squeeze doesn&#8217;t let us easily add our customizations. We have to modify the default files provided at the package installation.</p><p>Here is my setup of the PHP processes pool:</p><pre class="brush: diff; title: ; notranslate">
--- /etc/php5/fpm/pool.d/www.conf.orig     2011-06-07 08:14:30.000000000 +0200
+++ /etc/php5/fpm/pool.d/www.conf  2011-08-15 17:34:09.000000000 +0200
@@ -237,3 +237,10 @@
 ;php_admin_value[error_log] = /var/log/fpm-php.www.log
 ;php_admin_flag[log_errors] = on
 ;php_admin_value[memory_limit] = 32M
+
+pm.max_children = 25
+pm.start_servers = 4
+pm.min_spare_servers = 2
+pm.max_spare_servers = 10
+pm.max_requests = 500
+request_terminate_timeout = 30
</pre><p>The second customization I made is not about performances but convenience. It just allow my WordPress&#8217; users to upload larger files:</p><pre class="brush: diff; title: ; notranslate">
--- /etc/php5/fpm/php.ini.orig      2011-06-18 13:32:37.000000000 +0200
+++ /etc/php5/fpm/php.ini   2011-06-22 22:50:49.000000000 +0200
@@ -725,7 +725,7 @@

 ; Maximum size of POST data that PHP will accept.
 ; http://php.net/post-max-size
-post_max_size = 8M
+post_max_size = 15M

 ; Magic quotes are a preprocessing feature of PHP where PHP will attempt to
 ; escape any character sequences in GET, POST, COOKIE and ENV data which might
@@ -876,7 +876,7 @@

 ; Maximum allowed size for uploaded files.
 ; http://php.net/upload-max-filesize
-upload_max_filesize = 2M
+upload_max_filesize = 15M

 ; Maximum number of files that can be uploaded via a single request
 max_file_uploads = 20
</pre><h2>Nginx</h2><p>Let&#8217;s say my WordPress blog is installed in <code>/var/www/my_wordpress</code>. To let it be served by Nginx, we add a configuration file for this site in <code>/etc/nginx/sites-available/my_wordpress</code>:</p><pre class="brush: plain; title: ; notranslate">
server {
  server_name blog.example.com;
  root /var/www/my_wordpress/;
  include /etc/nginx/wordpress.conf;
  location /static {
    autoindex on;
  }
}

server {
  listen 80 default_server;
  server_name .example.com .example.org .example.net;
  rewrite ^ http://blog.example.com$request_uri? permanent;
}
</pre><p>In the configuration above, you can see that I want my blog to be served at <code>http://blog.example.com</code>. I also added some domain redirections in the form of a second <code>server</code> section, and a way to better display my static file repository by letting Nginx generate index pages.</p><p>Then don&#8217;t forget to activate this site:</p><pre class="brush: bash; title: ; notranslate">
$ ln -s /etc/nginx/sites-available/my_wordpress /etc/nginx/sites-enabled/
</pre><p>The file above refer to <code>/etc/nginx/wordpress.conf</code> which is where I place all the configuration directives common to all the WordPress blogs on my server. Here is the content of that file:</p><pre class="brush: plain; title: ; notranslate">
# This order might seem weird - this is attempted to match last if rules below fail.
# See: http://wiki.nginx.org/HttpCoreModule
location / {
  try_files $uri $uri/ /index.php?q=$uri&amp;$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

include global.conf;

include php.conf;
</pre><p>Again, this file make a reference to <code>php.conf</code>, which is the same as <a href="http://kevin.deldycke.com/2011/06/nginx-php-fpm-mysql-debian-squeeze-server/">the one featured in my previous article</a>. I only removed the <code>index</code> directive to place it elsewhere, and added a limit on the number of PHP requests a client can make:</p><pre class="brush: plain; title: ; notranslate">
location ~ \.php$ {
  # Throttle requests to prevent abuse
  limit_req zone=antidos burst=5;

  # Zero-day exploit defense.
  # http://forum.nginx.org/read.php?2,88845,page=3
  # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
  # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
  try_files $uri =404;

  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  include /etc/nginx/fastcgi_params;

  # As explained in http://kbeezie.com/view/php-self-path-nginx/ some fastcgi_param are missing from fastcgi_params.
  # Keep these parameters for compatibility with old PHP scripts using them.
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  # Some default config
  fastcgi_connect_timeout        60;
  fastcgi_send_timeout          180;
  fastcgi_read_timeout          180;
  fastcgi_buffer_size          128k;
  fastcgi_buffers            4 256k;
  fastcgi_busy_buffers_size    256k;
  fastcgi_temp_file_write_size 256k;

  fastcgi_intercept_errors    on;
  fastcgi_ignore_client_abort off;

  fastcgi_pass 127.0.0.1:9000;
}
</pre><p>Here is where the <code>index</code> directive moved: <code>/etc/nginx/conf.d/kev.conf</code>. I also added there some tweaks and the global request throttling configuration:</p><pre class="brush: plain; title: ; notranslate">
# Hide Nginx version
server_tokens off;

# Set default index file names
index index.php index.html index.htm;

# Allow uploads up to 15 Mo
client_max_body_size 15m;

# Create a global request accounting pool to prevent DOS
limit_req_zone $binary_remote_addr zone=antidos:10m rate=3r/s;
</pre><p>The <code>global.conf</code> file we saw in <code>/etc/nginx/wordpress.conf</code> refer to <code>/etc/nginx/global.conf</code>, which contain additional measures to remove cruft from log files and enhance security:</p><pre class="brush: plain; title: ; notranslate">
# Do not log excessive request on common web content like favicon and robots.txt
location = /favicon.ico {
  log_not_found off;
  access_log off;
}
location = /robots.txt {
  allow all;
  log_not_found off;
  access_log off;
}

# Deny all attempts to access any dotfile (=hidden files) such as .htaccess, .htpasswd, .DS_Store, .directory, .svn, .git, ...
location ~ /\. {
  deny all;
  access_log off;
  log_not_found off;
}
</pre><p>All of default Nginx configuration can&#8217;t be overridden by additional files. We have to change <code>/etc/nginx/nginx.conf</code> itself:</p><pre class="brush: diff; title: ; notranslate">
--- /etc/nginx/nginx.conf.orig   2011-06-06 00:46:56.000000000 +0200
+++ /etc/nginx/nginx.conf        2011-08-15 17:44:58.000000000 +0200
@@ -3,8 +3,9 @@
 pid /var/run/nginx.pid;

 events {
-       worker_connections 768;
-       # multi_accept on;
+       use epoll;
+       worker_connections 1024;
+       multi_accept on;
 }

 http {
@@ -16,7 +17,7 @@
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
-       keepalive_timeout 65;
+       keepalive_timeout 3;
        types_hash_max_size 2048;
        # server_tokens off;
</pre><p>That&#8217;s all for our customizations. We can now restart all our servers:</p><pre class="brush: bash; title: ; notranslate">
$ /etc/init.d/mysql restart
$ /etc/init.d/php5-fpm restart
$ /etc/init.d/nginx restart
</pre><h2>Conclusion</h2><p>I&#8217;m running my websties under this configuration for about 3 months and I&#8217;m really happy with the results. I&#8217;m sure I can push optimizations further, but it may require lots of time and effort compared to the marginal gain I&#8217;ll get. My websites are responsive enough to me. And if they collapse in the future under the load of the Reddit crowd, I&#8217;ll still have the option to move to a bigger virtual server (vertical scaling FTW!).</p> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/09/nginx-php-fpm-mysql-configuration/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>e107 Importer plugin for WordPress v1.4 released !</title><link>http://kevin.deldycke.com/2011/07/e107-importer-plugin-wordpress-v1-4-released/</link> <comments>http://kevin.deldycke.com/2011/07/e107-importer-plugin-wordpress-v1-4-released/#comments</comments> <pubDate>Tue, 05 Jul 2011 10:16:12 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Blog]]></category> <category><![CDATA[e107]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=3374</guid> <description><![CDATA[I just released the version 1.4 of my e107 Importer plugin for WordPress. This is a special release as it ends the active development cycle. I officially declare this plugin unmaintained. I don&#8217;t plan to work on it again. The &#8230; <a href="http://kevin.deldycke.com/2011/07/e107-importer-plugin-wordpress-v1-4-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>I just released the version 1.4 of my <a href="http://wordpress.org/extend/plugins/e107-importer/">e107 Importer plugin for WordPress</a>.</p><p>This is a special release as it ends the active development cycle. <strong>I officially declare this plugin unmaintained</strong>. I don&#8217;t plan to work on it again.</p><p>The 1.4 will be the last version. Unless you send me code contribution, you&#8217;ll not see a 1.5 version.</p><p>The reason behind this decision is simple and straightforward: I&#8217;ve recently migrated my last e107 website to WordPress. Now that e107 is no longer part of my life, I have no interest in spending time and energy working on this plugin.</p><p>So if you plan to get rid of your e107 sites in favor of WordPress, do the migration now, as the plugin will self-deteriorate as WordPress API gets updated.</p> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/07/e107-importer-plugin-wordpress-v1-4-released/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>e107 Importer v1.3 released</title><link>http://kevin.deldycke.com/2011/05/e107-importer-v1-3-released/</link> <comments>http://kevin.deldycke.com/2011/05/e107-importer-v1-3-released/#comments</comments> <pubDate>Mon, 09 May 2011 09:35:32 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Cool Cavemen]]></category> <category><![CDATA[e107]]></category> <category><![CDATA[importer]]></category> <category><![CDATA[migration]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=3203</guid> <description><![CDATA[A month after the last one, here is a brand new version of my e107 Importer, numbered 1.3. This version add loads of polishing and is not far from being feature-complete. I think I&#8217;m reaching the end of the active &#8230; <a href="http://kevin.deldycke.com/2011/05/e107-importer-v1-3-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><a href="http://kevin.deldycke.com/wp-content/uploads/2011/05/e107-importer-v1-3-option-panel.png"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/05/e107-importer-v1-3-option-panel-150x150.png" alt="" title="e107-importer-v1-3-option-panel" width="150" height="150" class="alignleft size-thumbnail wp-image-3210" /></a> A month after <a href="http://kevin.deldycke.com/2011/04/e107-importer-1-2-enhanced-bbcode-parser/">the last one</a>, here is a brand <a href="http://wordpress.org/extend/plugins/e107-importer/">new version of my e107 Importer</a>, numbered 1.3.</p><p>This version add loads of polishing and is not far from being feature-complete. I think I&#8217;m reaching the end of the active development of this plugin. I don&#8217;t see the need to add new features.</p><p>I also feel this way because last week, I succeeded in moving to WordPress all news and pages from the old e107&#8242;s <a href="http://coolcavemen.com">Cool Cavemen</a> website. I now only need to import all forums to definitively get rid of e107 from my life. At that point, I will declare the plugin no longer active. This mean I will no longer update it, but will still integrate code other developers are willing to contribute.</p><p>Before that happen, I will of course release one or two revisions of this plugin in the next few months. But expect bug fixes and tiny enhancements, not big new features.</p><p>That being said, here is the changelog of the brand new e107 Importer 1.3:</p><ul><li>Upgrade embedded e107 code with latest <a href="http://e107.org/news.php?item.880">0.7.25</a>.</li><li>Redirect imported images to attachments.</li><li>Purge invalid mapping entries on import.</li><li>Replace old e107 URLs in content by new WordPress permalinks.</li><li>Allow both imported and already-existing content to by updated with new permalinks.</li><li>Let user specify the list of e107 forums to import.</li><li>Phased imports should work without major problems.</li></ul> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/05/e107-importer-v1-3-released/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>e107 Importer 1.2 is out, with an enhanced BBCode parser.</title><link>http://kevin.deldycke.com/2011/04/e107-importer-1-2-enhanced-bbcode-parser/</link> <comments>http://kevin.deldycke.com/2011/04/e107-importer-1-2-enhanced-bbcode-parser/#comments</comments> <pubDate>Tue, 05 Apr 2011 14:37:43 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Blog]]></category> <category><![CDATA[code]]></category> <category><![CDATA[e107]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=3084</guid> <description><![CDATA[Here is a brand new version of my e107 Importer plugin. This release fix lots of nasty bugs. Better, I added an enhanced BBCode parser which try to clean-up what e107&#8242;s parser output. This new parser also try to align &#8230; <a href="http://kevin.deldycke.com/2011/04/e107-importer-1-2-enhanced-bbcode-parser/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><a href="http://kevin.deldycke.com/wp-content/uploads/2011/04/e107-importer-12-option-panel.png"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/04/e107-importer-12-option-panel-150x150.png" alt="" title="e107-importer-12-option-panel" width="150" height="150" class="alignleft size-thumbnail wp-image-3085" /></a> Here is a brand new version of my e107 Importer plugin. This release fix lots of nasty bugs. Better, I added an enhanced BBCode parser which try to clean-up what e107&#8242;s parser output. This new parser also try to align the final HTML with what WordPress produce by default.</p><p>As usual, my <a href="http://wordpress.org/extend/plugins/e107-importer/">plugin is available on the official WordPress plugin directory</a>.</p><p>Here is the detailed changelog:</p><ul><li>Upgrade e107 code to match latest <a href="http://e107.org/news.php?item.879">0.7.25-rc1</a>.</li><li>Fix variable bleeding when importing items in batches.</li><li>Add a new way of handling e107 extended news using WordPress&#8217; excerpts.</li><li>Parse BBCode and replace e107 constants in news excerpt.</li><li>Use internal WordPress library (kses) to parse HTML in the image upload step.</li><li>Do not upload the same images more than once.</li><li>Add a new enhanced BBCode parser on top of the one from e107. Make it the default parser.</li><li>Each time we alter the original imported content, we create a post revision.</li></ul> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/04/e107-importer-1-2-enhanced-bbcode-parser/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>e107 Importer 1.1 available !</title><link>http://kevin.deldycke.com/2011/03/e107-importer-1-1/</link> <comments>http://kevin.deldycke.com/2011/03/e107-importer-1-1/#comments</comments> <pubDate>Tue, 01 Mar 2011 10:37:09 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[CMS]]></category> <category><![CDATA[e107]]></category> <category><![CDATA[import]]></category> <category><![CDATA[migration]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=2938</guid> <description><![CDATA[A month after the 1.0 release, here is my e107 Importer v1.1 for WordPress ! The biggest new feature is support of e107 forum import to the bbPress WordPress plugin. This plugin is still in alpha and was not released &#8230; <a href="http://kevin.deldycke.com/2011/03/e107-importer-1-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><a href="http://kevin.deldycke.com/2011/01/e107-importer-wordpress-plugin-v1-0-released/">A month after the 1.0 release</a>, here is my <a href="http://wordpress.org/extend/plugins/e107-importer/">e107 Importer v1.1 for WordPress</a> !</p><p><a href="http://kevin.deldycke.com/wp-content/uploads/2011/03/e107-importer-option-panel.png"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/03/e107-importer-option-panel-150x150.png" alt="" title="e107-importer-option-panel" width="150" height="150" class="alignleft size-thumbnail wp-image-2941" /></a> The biggest new feature is support of e107 forum import to the <a href="http://wordpress.org/extend/plugins/bbpress/">bbPress WordPress plugin</a>. This plugin is still in alpha and was not released yet. This mean you have to <a href="http://trac.bbpress.org/browser/branches/plugin?rev=2942">fetch it from its Subversion repository</a>. And be careful to get the recommended version (SVN release 2942).</p><p>Because of the experimental status of forum import, the default option of e107 Importer is to not import forums. I decided to include this feature anyway to get feedbacks. So please don&#8217;t consider forum import as a highly reliable. It may work for you or may not. And please write detailed bug reports.</p><p>Here is a detailed changelog between 1.0 and 1.1:</p><ul><li>Add import of forums and threads to bbPress WordPress plugin.</li><li>Parse BBCode and e107 constants in forums and thread.</li><li>Add forums and threads redirections.</li><li>Make e107 user import optional. This needs you to set a pre-existing WordPress user that will take ownership of all imported content.</li><li>Parse BBCode in titles too.</li><li>Import images embedded in comments and forum threads.</li><li>Description update of existing users is no longer destructive.</li><li>Add an entry in the FAQ regarding script ending prematurely.</li><li>Disable all extra HTML rendering hooks like the one coming from e107 linkwords plugin.</li><li>Allow news and pages import to be skipped.</li><li>Add missing news category redirects.</li><li>Minimal requirement set to WordPress 3.1.</li><li>Some pages are not tied to a user. In this case, default to the current user.</li></ul> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/03/e107-importer-1-1/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Pushing Git to Subversion: the case of WordPress plugin repository</title><link>http://kevin.deldycke.com/2011/02/pushing-git-subversion-wordpress-plugin-repository/</link> <comments>http://kevin.deldycke.com/2011/02/pushing-git-subversion-wordpress-plugin-repository/#comments</comments> <pubDate>Mon, 14 Feb 2011 15:43:51 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Git]]></category> <category><![CDATA[Hosting]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[Subversion]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=2776</guid> <description><![CDATA[Some weeks ago I moved my e107 Importer project from a big fat Git repository to its own. Then I wanted to have my plugin to be available on WordPress.org. In fact, this list is the tip of WordPress plugin &#8230; <a href="http://kevin.deldycke.com/2011/02/pushing-git-subversion-wordpress-plugin-repository/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><a href="http://kevin.deldycke.com/2011/02/moving-git-subtree-repository/">Some weeks ago</a> I moved my e107 Importer project from a <a href="http://github.com/kdeldycke/scripts">big fat Git repository</a> to <a href="http://github.com/kdeldycke/e107-importer">its own</a>.</p><p>Then I wanted to have my plugin to be available on WordPress.org. In fact, <a href="http://wordpress.org/extend/plugins/">this list</a> is the tip of WordPress plugin hosting solution. It means that if you want to have your plugin there, you have to push your code in <a href="http://plugins.trac.wordpress.org/browser">WordPress&#8217; big Subversion repository</a>. And that&#8217;s when I realized I had to sync my Git repository to Subversion&#8230;</p><p>This article details how I managed to push to Subversion all my developments activity taking place in Git.</p><p>Before going further: be careful ! It&#8217;s really easy to mess things up. After all, we&#8217;re trying to push code on a public Subversion repository. We must be certain of what we are doing here. Risks of deleting stuff that are not ours are great.</p><h2>The simulation</h2><p>To prevent any big mistake, we&#8217;ll test our commands on a local subversion repository.</p><p>Let&#8217;s create one:</p><pre class="brush: bash; title: ; notranslate">
$ rm -rf svn-repo
$ svnadmin create ./svn-repo
</pre><p>Now we&#8217;ll launch a local Subversion server with a minimal config:</p><pre class="brush: bash; title: ; notranslate">
$ sed -i 's/# password-db = passwd/password-db = passwd/' ./svn-repo/conf/svnserve.conf
$ echo &quot;kevin = kevin&quot; &gt;&gt; ./svn-repo/conf/passwd
$ kill `ps -ef | grep svnserve | awk '{print $2}'`
$ svnserve --daemon --listen-port 3690 --root ./svn-repo
</pre><p>To test our server, let&#8217;s checkout a local working copy from it:</p><pre class="brush: bash; title: ; notranslate">
$ rm -rf svn-working-copy
$ svn co svn://localhost:3690 svn-working-copy
$ cd svn-working-copy/
$ svn info
</pre><p>To simulate an already active Subversion repository, we&#8217;ll make a first commit with a structure mimicking <a href="http://plugins.trac.wordpress.org">WordPress&#8217; plugin repository</a>:</p><pre class="brush: bash; title: ; notranslate">
$ mkdir -p e107-importer/{trunk,branches,tags}
$ svn add *
$ svn commit -m &quot;Create a WordPress-like repository structure&quot; --username kevin
$ svn up
$ svn info
</pre><p>Now that we have a place to hack, we can experiment on Git side. We start with a copy of my plugin repository:</p><pre class="brush: bash; title: ; notranslate">
$ cd ..
$ rm -rf e107-importer
$ git clone git@github.com:kdeldycke/e107-importer.git
$ cd e107-importer
</pre><p>Thanks to <a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html">git-svn</a>, we can attach a remote Subversion repository:</p><pre class="brush: bash; title: ; notranslate">
$ git svn init --trunk=e107-importer/trunk --branches=e107-importer/branches --tags=e107-importer/tags --username kevin  svn://localhost:3690
</pre><p>Get get a copy of Subversion&#8217;s content:</p><pre class="brush: bash; title: ; notranslate">
$ git svn fetch
r1 = d969aa9a11684a1cd2ba0b3eab0a3ee72a62af51 (refs/remotes/trunk)
</pre><p>Now we will rebase our whole Git tree to Subversion&#8217;s trunk:</p><pre class="brush: bash; title: ; notranslate">
$ git rebase trunk
</pre><p>According gitg, the result of this is 2 parallel trees:</p><ul><li>the first is the untouched original tree;</li><li>the other start on the <code>trunk</code> branch and continue with a copy of the original tree, and is the result of the rebase.</li></ul><p>But the latter has a problem: <a href="http://kevin.deldycke.com/2010/05/initialize-git-repositories/">my initial commit</a> and all my tags are squashed. I tried several methods to rebase my whole Git tree onto the local <code>trunk</code> branch while keeping these. But I failed.</p><p>I resigned myself and passed over this. After all, the initial commit played its role, by taking care of this corner-case.</p><p>As for the tags, I just re-added them by hand. I forced their creation, as Git keeps them attached to the original parallel tree:</p><pre class="brush: bash; title: ; notranslate">
$ git tag -f &quot;e107-importer-0.1&quot; 728ec8689d13350bbfc1f2d9dc17dda2b8a8fdbf
$ git tag -f &quot;e107-importer-0.2&quot; 8049b92265a41f594e97020bae6f3aa74b6a7fb1
$ git tag -f &quot;e107-importer-0.3&quot; 9505aa0656ba61f39cd6cb91c76c1e7279c68473
$ git tag -f &quot;e107-importer-0.4&quot; 0da2d61239c9a9549d197737518705912fd4982d
$ git tag -f &quot;e107-importer-0.5&quot; 561d35b5d1b4d2c35e13c76a3f2a41689c96e991
$ git tag -f &quot;e107-importer-0.6&quot; c6de1a2bf60cad054c5420eab2f30f190092fb68
$ git tag -f &quot;e107-importer-0.7&quot; 6ad4d4a67e8b84da31565383e5eed6ceb5b7d2b2
$ git tag -f &quot;e107-importer-0.8&quot; 47b8efdc82132027b139a2f214f119cee1e9c06c
$ git tag -f &quot;e107-importer-0.9&quot; a82f5d0814db7cf6ac7a1ac171b30c300e1a91d4
</pre><p>Now we are ready to push the code to the remote Subversion repository:</p><pre class="brush: bash; title: ; notranslate">
$ git svn dcommit
</pre><p>Things seems to have worked, as if you go back to your local copy of the simulated remote SVN, you&#8217;ll get all your code base and its history:</p><pre class="brush: bash; title: ; notranslate">
$ cd ..
$ cd svn-working-copy
$ svn up
$ svn log
</pre><p>If commit order is preserved, dates are not, because unlike Git, Subversion only track the commit date, not the author&#8217;s date. This is sad but expected.</p><p>But here I was hoping that Git-svn was smart enough to create tags automatically. They weren&#8217;t, and my <code>tags</code> folder remained empty. That may be due to the nature of tags in Subversion, which are just branches. I don&#8217;t know. At the end I just decided to create tags by hand on Subversion side:</p><pre class="brush: bash; title: ; notranslate">
$ svn copy svn://localhost:3690/e107-importer/trunk@2  svn://localhost:3690/e107-importer/tags/0.1 -m &quot;Tag e107-importer 0.1&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@4  svn://localhost:3690/e107-importer/tags/0.2 -m &quot;Tag e107-importer 0.2&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@5  svn://localhost:3690/e107-importer/tags/0.3 -m &quot;Tag e107-importer 0.3&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@6  svn://localhost:3690/e107-importer/tags/0.4 -m &quot;Tag e107-importer 0.4&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@8  svn://localhost:3690/e107-importer/tags/0.5 -m &quot;Tag e107-importer 0.5&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@9  svn://localhost:3690/e107-importer/tags/0.6 -m &quot;Tag e107-importer 0.6&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@10 svn://localhost:3690/e107-importer/tags/0.7 -m &quot;Tag e107-importer 0.7&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@11 svn://localhost:3690/e107-importer/tags/0.8 -m &quot;Tag e107-importer 0.8&quot;
$ svn copy svn://localhost:3690/e107-importer/trunk@12 svn://localhost:3690/e107-importer/tags/0.9 -m &quot;Tag e107-importer 0.9&quot;
</pre><h2>Real life push to WordPress repository</h2><p>Now that our commit simulation worked somehow, we can perform them in the real world.</p><p>First, initialize a copy of the Git repository:</p><pre class="brush: bash; title: ; notranslate">
$ rm -rf e107-importer-git
$ git clone git@github.com:kdeldycke/e107-importer.git e107-importer-git
</pre><p>Let&#8217;s attach Subversion to Git:</p><pre class="brush: bash; title: ; notranslate">
$ cd e107-importer-git
$ git svn init --trunk=trunk --branches=branches --tags=tags http://plugins.svn.wordpress.org/e107-importer
</pre><p>Here you might want to do a <code>git svn fetch</code> as we did before. But this will take a while. Especially on WordPress plugin repository, as Git will browse all SVN revisions (more than 330.000 currently).</p><p>To speed things up, and <a href="http://www.nkuttler.de/post/using-git-for-wordpress-development/">following a tip from Nicolas Kuttler</a>, we&#8217;ll search for the revision we&#8217;re interested in (the start of our plugin subfolder life), then fetch from here:</p><pre class="brush: bash; title: ; notranslate">
$ svn log --limit 1 http://plugins.svn.wordpress.org/e107-importer
------------------------------------------------------------------------
r333566 | plugin-master | 2011-01-17 17:09:40 +0100 (Mon, 17 Jan 2011) | 1 line

adding e107-importer by Coolkevman
------------------------------------------------------------------------
$ git svn fetch -r333566
r333566 = b850438a98c26a8f55ee2ddd7bdf8816d0390a1b (refs/remotes/trunk)
</pre><p>And now we can send our massive payload, after rebasing our <code>master</code> branch to SVN&#8217;s <code>trunk</code>:</p><pre class="brush: bash; title: ; notranslate">
$ git rebase trunk
$ git svn dcommit --username=Coolkevman
</pre><p>We can then <a href="http://plugins.trac.wordpress.org/log/e107-importer">contemplate our work in the official WordPress plugin repository</a>.</p><p>There is one problem though: git-svn has <a href="http://plugins.trac.wordpress.org/changeset/336234">left empty folders because of renaming</a>. Let&#8217;s fix this:</p><pre class="brush: bash; title: ; notranslate">
$ svn rm http://plugins.svn.wordpress.org/e107-importer/trunk/bbcode -m &quot;Git-svn doesn't delete empty folders on move.&quot; --username=Coolkevman
</pre><p>Last thing to do is to tag our old versions on Subversion, as we did in our simulation:</p><pre class="brush: bash; title: ; notranslate">
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336229 http://plugins.svn.wordpress.org/e107-importer/tags/0.1 -m &quot;Tag e107-importer 0.1&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336231 http://plugins.svn.wordpress.org/e107-importer/tags/0.2 -m &quot;Tag e107-importer 0.2&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336232 http://plugins.svn.wordpress.org/e107-importer/tags/0.3 -m &quot;Tag e107-importer 0.3&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336233 http://plugins.svn.wordpress.org/e107-importer/tags/0.4 -m &quot;Tag e107-importer 0.4&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336235 http://plugins.svn.wordpress.org/e107-importer/tags/0.5 -m &quot;Tag e107-importer 0.5&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336236 http://plugins.svn.wordpress.org/e107-importer/tags/0.6 -m &quot;Tag e107-importer 0.6&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336237 http://plugins.svn.wordpress.org/e107-importer/tags/0.7 -m &quot;Tag e107-importer 0.7&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336238 http://plugins.svn.wordpress.org/e107-importer/tags/0.8 -m &quot;Tag e107-importer 0.8&quot;
$ svn copy http://plugins.svn.wordpress.org/e107-importer/trunk@336239 http://plugins.svn.wordpress.org/e107-importer/tags/0.9 -m &quot;Tag e107-importer 0.9&quot;
</pre><p>But this mean I <a href="http://plugins.trac.wordpress.org/changeset/336466">had to clean up tags</a> too, to remove the remaining empty folder.</p><h2>Pushing new commits</h2><p>All of the above only works with an newly created plugin structure on WordPress plugin repository. What if we want to push new commits to Subversion once we&#8217;ve already pushed part of our Git history ?</p><p>First, let&#8217;s make our life miserable and delete all our local repositories:</p><pre class="brush: bash; title: ; notranslate">
$ cd ..
$ rm -rf e107-importer-git
</pre><p>Now, if we replay the steps above, the <code>git rebase trunk</code> command will ends with loads of conflicts. The procedure is different this time and is <a href="http://eikke.com/importing-a-git-tree-into-a-subversion-repository/">explained by Ikke</a>.</p><p>This involves <a href="https://git.wiki.kernel.org/index.php/GraftPoint">Git&#8217;s graft</a>:</p><pre class="brush: bash; title: ; notranslate">
$ git clone git@github.com:kdeldycke/e107-importer.git e107-importer-git
$ cd e107-importer-git
$ git svn init --trunk=trunk --branches=branches --tags=tags http://plugins.svn.wordpress.org/e107-importer
$ git svn fetch -r333566
$ git show-ref trunk
$ git log --pretty=oneline master | tail -n1
$ echo `git log --pretty=oneline master | tail -n1 | cut -d ' ' -f 1` `git show-ref trunk | cut -d ' ' -f 1` &gt;&gt; .git/info/grafts
$ git svn dcommit
</pre><p>The last command will not end well, with Git complaining about unmerged differences. This is <a href="http://plugins.trac.wordpress.org/changeset/336352">likely due to my additional commit</a> removing the empty folder left by git-svn. Fortunately Git suggest something in its log:</p><pre class="brush: plain; title: ; notranslate">
If you are attempting to commit  merges, try running:
  git rebase --interactive --preserve-merges  refs/remotes/trunk
Before dcommitting
</pre><p>Well, that&#8217;s what I exactly did:</p><pre class="brush: bash; title: ; notranslate">
$ git rebase --interactive --preserve-merges refs/remotes/trunk
$ git svn dcommit
</pre><p>And it magically fixed the issue ! <img src='http://kevin.deldycke.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>I&#8217;m quite happy now to have a clearly identified workflow to push my Git updates to Subversion ! <img src='http://kevin.deldycke.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/02/pushing-git-subversion-wordpress-plugin-repository/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>e107 Importer WordPress plugin v1.0 released !</title><link>http://kevin.deldycke.com/2011/01/e107-importer-wordpress-plugin-v1-0-released/</link> <comments>http://kevin.deldycke.com/2011/01/e107-importer-wordpress-plugin-v1-0-released/#comments</comments> <pubDate>Mon, 24 Jan 2011 11:52:08 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[Blog]]></category> <category><![CDATA[CMS]]></category> <category><![CDATA[e107]]></category> <category><![CDATA[importer]]></category> <category><![CDATA[migration]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=2739</guid> <description><![CDATA[After 3 years in limbo, here is a new stable version of my e107 Importer plugin for WordPress, proudly numbered 1.0 ! This is the first time this plugin is available on the official WordPress plugin repository. This means easy &#8230; <a href="http://kevin.deldycke.com/2011/01/e107-importer-wordpress-plugin-v1-0-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><a href="http://kevin.deldycke.com/wp-content/uploads/2011/01/e107-importer-configuration-screen.png"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/01/e107-importer-configuration-screen-150x150.png" alt="" title="e107-importer-configuration-screen" width="150" height="150" class="alignleft size-thumbnail wp-image-2835" /></a> After <a href="http://kevin.deldycke.com/2008/01/e107-to-wordpress-migration-v09-plug-in-released/">3 years in limbo</a>, here is a new stable version of my e107 Importer plugin for WordPress, proudly numbered 1.0 ! <img src='http://kevin.deldycke.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>This is the first time this plugin is <a href="http://wordpress.org/extend/plugins/e107-importer/">available on the official WordPress plugin repository</a>. This means easy upgrades for you ! <img src='http://kevin.deldycke.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>I&#8217;ve heavily updated the plugin to use the latest WordPress import framework, so everything is now cleanly integrated.</p><p>This version was tested with <a href="http://e107.org/news.php?item.877">e107 v0.7.24</a> and <a href="http://wordpress.org/news/2011/01/wordpress-3-1-release-candidate-3/">WordPress 3.1-RC3</a>.</p><p>Here is the changelog:</p><ul><li>Upgrade e107 code from <a href="http://e107.org/news.php?item.877">e107 v0.7.24</a>.</li><li>Minimal requirement set to WordPress 3.0.0.</li><li>Use new WordPress importer framework.</li><li>Add an e107 to WordPress 301 redirector plugin (support news, pages, users and feeds).</li><li>Disable the URL rewriting feature <a href="http://kevin.deldycke.com/2008/01/e107-to-wordpress-migration-v09-plug-in-released/">introduced in v0.9</a>.</li><li>Make image import optional.</li><li>Add an option to upload images from allowed domains only.</li><li>Align naming conventions with other WordPress importer.</li><li>Add a complete WordPress plugin hosting compatible <a href="https://github.com/kdeldycke/e107-importer/blob/master/readme.txt">readme file</a> with full metadatas.</li><li>Add <a href="http://wordpress.org/extend/plugins/e107-importer/screenshots/">screenshots</a>.</li><li>List all <a href="http://wordpress.org/extend/plugins/e107-importer/other_notes/">versions of e107 and WordPress I tested this plugin with</a>.</li><li>Add a <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&#038;hosted_button_id=XEXREDEHXSQUJ">PayPal donation link</a>.</li><li>Add a minimal <a href="http://wordpress.org/extend/plugins/e107-importer/faq/">FAQ</a>.</li><li>Add an overview of features in description.</li><li>Update <a href="https://github.com/kdeldycke/e107-importer">source code repository</a> location.</li><li>Remove patching of Kubrick theme to support comments on static pages.</li></ul><p>A note for developpers: the <a href="https://github.com/kdeldycke/e107-importer">reference code base</a> is now located on GitHub. That&#8217;s were all new code must be commited. <a href="http://plugins.trac.wordpress.org/browser/e107-importer/">WordPress&#8217; Subversion repository</a> is only a mirror.</p><p>If any question, <a href="http://wordpress.org/extend/plugins/e107-importer/faq/">please read the FAQ first</a>.</p> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/01/e107-importer-wordpress-plugin-v1-0-released/feed/</wfw:commentRss> <slash:comments>19</slash:comments> </item> <item><title>New blog header and tiny WordPress theme customizations</title><link>http://kevin.deldycke.com/2011/01/new-blog-header-and-tiny-wordpress-theme-customizations/</link> <comments>http://kevin.deldycke.com/2011/01/new-blog-header-and-tiny-wordpress-theme-customizations/#comments</comments> <pubDate>Tue, 18 Jan 2011 22:48:58 +0000</pubDate> <dc:creator>Kev</dc:creator> <category><![CDATA[English]]></category> <category><![CDATA[artwork]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[maomium]]></category> <category><![CDATA[twentyten]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[WordPress]]></category><guid isPermaLink="false">http://kevin.deldycke.com/?p=2742</guid> <description><![CDATA[I maintain a bunch of websites for friends on my server. In this context, Maomium&#8216;s owner owed me some bucks for his .com domain name. Here is the envelope I received yesterday with a check: Now that&#8217;s what I call &#8230; <a href="http://kevin.deldycke.com/2011/01/new-blog-header-and-tiny-wordpress-theme-customizations/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>I maintain a bunch of websites for friends on my server. In this context, <a href="http://maomium.com">Maomium</a>&#8216;s owner owed me some bucks for his <code>.com</code> domain name. Here is the envelope I received yesterday with a check:<br /> <a href="http://kevin.deldycke.com/wp-content/uploads/2011/01/maomium-thank-you-artwork.jpg"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/01/maomium-thank-you-artwork-432x288.jpg" alt="" title="maomium-thank-you-artwork" width="432" height="288" class="aligncenter size-large wp-image-4102" /></a></p><p>Now that&#8217;s what I call a personalized letter ! This original artwork is so great that I had to share it.</p><p>The hours he put creating this original artwork mirror the effort I invested maintaining his digital properties (a <a href="http://maomium.com">WordPress blog</a>, a <a href="http://www.ubercart.org">Drupal-based online store</a> and a <a href="http://maomium.com/zenphoto/">ZenPhoto gallery</a>). That&#8217;s the best thank you note I have received so far ! <img src='http://kevin.deldycke.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Jim from Maomium is a really talented artist and really deserve attention. He used to have an <a href="http://shop.maomium.com">online shop</a> where you can buy his paintings and customized furnitures. But we shut it down some weeks ago. Its replacement is not available yet, so if you want to buy him unique hand-made piece of art, don&#8217;t hesitate to get in touch with him at <a href="mailto:jim@maomium.com">jim@maomium.com</a>.</p><p>And with Jim&#8217;s approval, I now use his letter&#8217;s artwork as my blog image header. It&#8217;s much better than the default theme image ! <img src='http://kevin.deldycke.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p>Talking about this , here is a quick tip to make minimal design changes to a WordPress theme. The idea is to put custom CSS directives in a widget, as below:<br /> <a href="http://kevin.deldycke.com/wp-content/uploads/2011/01/wordpress-widget-with-inline-css-customizations.png"><img src="http://kevin.deldycke.com/wp-content/uploads/2011/01/wordpress-widget-with-inline-css-customizations-238x300.png" alt="" title="wordpress-widget-with-inline-css-customizations" width="238" height="300" class="aligncenter size-medium wp-image-2745" /></a></p><p>As widgets are site-wide, all these CSS customizations will be applied everywhere. Here is for example the code I applied on this site to hide blog&#8217;s name and description from <a href="http://wordpress.org/extend/themes/twentyten">TwentyTen</a>&#8216;s header:</p><pre class="brush: xml; title: ; notranslate">
&lt;style type=&quot;text/css&quot;&gt;&lt;!--
#header {
  padding-top: 0;
}
#site-title a, #site-description {
  display: none;
}
--&gt;&lt;/style&gt;
</pre><p>This quick and dirty hack is perfect for tiny customizations. It will make your CSS easier to maintain as you don&#8217;t have to modify the core style files or create a child theme.</p> ]]></content:encoded> <wfw:commentRss>http://kevin.deldycke.com/2011/01/new-blog-header-and-tiny-wordpress-theme-customizations/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 2/45 queries in 0.017 seconds using apc
Object Caching 1117/1216 objects using apc

Served from: kevin.deldycke.com @ 2012-02-08 10:52:12 -->
