How to ajaxify your WordPress theme

When building a custom WordPress based website for a client I needed to include AJAX based page transitions into the website. In this video I’ll explain a little about how I did it.

In the video I’ll explain some simple principles I followed like graceful degration and don’t break the back button.

Here is the code that makes it happen.

These are the ajax checks inside page.php to serve only the content to an ajax call:

if(!$GET['ajax']) 
   getheader();

// code to get the content

And here is the javascript:

Edit: This is a small revision of the code in the video, it only contains code to make the transitions happen. You can find the original code in the video here.

/* Author: Mike van Rossum */
$(function(){
  var $footer = $('#footer'),
    url = $footer.data('url'),
    $book = $('#innerBook'),
    speed = 200,
    $menu = $('.menu');
  if(Modernizr.hashchange) {
    var baseLength = url.split('/').length,
      ajaxPage = function() {
        $book.children().fadeOut(speed);
        $.get(location.href.replace(/#/,") + '?ajax=true', function(data) {
          //insert the data into the page and fade it in
          $book.html(data).children().hide().fadeIn(speed);
          if($('#pageData').data('title') === 'Portfolio') {
            $book.addClass('portfolio');
            log('a');
          } else {
            $book.removeClass('portfolio');
            log('b');
          }
        });
      }
    if(location.hash)
      ajaxPage();
    // if a direct page get's loaded we want to reload the homedir and ajax it:
    //    http://website.com/page
    // to
    //    http://website.com/#page
    var loc = location.href;
    if(loc != url && !/#/.test(loc)) {
      var redirect = location.href.split('/');
      redirect[baseLength -- 1] = '#' + redirect[baseLength -- 1];
      redirect = redirect.join('/');
      location = redirect;
    }
    // convert all links to the website from
    //    http://website.com/page
    // to
    //    http://website.com/#page
    $menu.find('a').add('.ajax').each(function() {
      $(this).attr('href', function() {
        var url = $(this).attr('href').split('/');
        url[baseLength -- 1] = '#' + url[baseLength -- 1];

    return url.join('/');
  });
});
// bind ajax to hashchange
$(window).on('hashchange', function() {
  ajaxPage(location.href.replace(/#/,'') + '?ajax=true');
});

Fotoblog mijnrealiteit.nl vernieuwd

You’ve found a dinosaur, this post is only here for archiving purposes. The content is outdated and is not applicable anymore.

Ik heb onlangs mijn fotoblog mijnrealiteit vernieuwd. Ik heb de website ontworpen met de simpliciteit van een aantal tumblr blogs in mijn achterhoofd. Op de site plaats ik foto’s die ik zelf maak (voornamelijk met mijn iPhone). Van opvallende dingen tot instagram achtige foto’s.

Ik heb bij het ontwerpen van de website zoveel mogelijk rekening gehouden met verschillende platformen (eerlijk gezegd alleen met PC, iPad en iPhone) door gebruik te maken van media queries.

De website draait op WordPress, dit lijkt misschien onnodig in verband met de enorm simpele website maar heeft voor mij een groot voordeel: Je kan publishen op een wordpress site door gebruik te maken van de native iPhone app. Dit kan ik niet alleen ter plekke gelijk na het maken van de foto, ook wordt de geolocatie gelijk opgeslagen.

Alle code van het wordpress thema staat op github.

Nieuw WordPress Theme: mijnrealiteit

You’ve found a dinosaur, this post is only here for archiving purposes. The content is outdated and is not applicable anymore.

Vorige week heb ik snel een nieuw WordPress thema gemaakt voor mijn fotoblog mijnrealiteit.nl. Ik maakte al een tijdje gebruik van een verouderd thema waar ik eigenlijk nooit tevreden over ben geweest. Vorige week had ik eindelijk tijd om hier eens voor te zitten.

In plaats van om van scratch te beginnen leek het me slim om een boilerplate te gebruiken (zoals de html 5 boilerplate). Dit is een html reset (lege pagina) waarin een hele hoop al voor je geregeld is, er zitten ook scriptjes bij die automatisch alles voor je minify’en en je plaatjes comprimeren. Kortom een perfect startpunt.

Ik kwam er al snel achter dat iemand deze boilerplate al had ingebakken in een leeg wordpress thema. Vanwege het enorm simplistische thema en de html5 boilerplate als startpunt was ik ook bijzonder snel met het complete thema klaar, compleet HTML5.

Ik gebruik redelijk wat jQuery voor wat animatie effectjes (niet te fancy) om bijvoorbeeld als je ergens overheen hovert al het overige uit te faden en te blenden. Ook gebruik ik de google maps API om foto’s aan geo locatie’s te koppelen.

Hier is het eindresultaat en je kan alle code bekijken op github.

Binnekort zal ik een korte tutorial schrijven over hoe je dit thema zelf kan gebruiken (inclusief de ingebakken koppeling met google Maps).

Twitter stijl reactie

You’ve found a dinosaur, this post is only here for archiving purposes. The content is outdated and is not applicable anymore.

Bloggen draait om communiceren, reactie’s spelen hier dan ook een grote rol bij. Zonder een reactie formulier onderaan je blogposts hoor je er al jaren niet meer bij, maar “threaded comments” (ofwel geneste reactie’s ala youtube) wordt toch ook steeds vaker verwacht.

Zelf vind ik twitter stijl reactie’s heel gaaf en beter bij dit blog passen: Je kan reageren op een post door gewoon het formulier te gebruiken, als je wilt reageren op iemand anders reactie klik je op reageer en wordt er automatisch een link naar die reactie toegevoegd met @[naam van poster] (test het hieronder uit op een reactie).

Ik gebruik PHP (en WordPress) om een reactie link te maken bij elke reactie, deze link krijgt een id mee die de gegevens bevat die ik nodig heb (comment id zodat ik ernaar toe kan linken en de naam van de poster). Dit id lees ik uit met jQuery en maak hier een link van en stop hem in het formulier.

PHP Elke link krijgt de klasse comment-reply-link en een uniek id mee.

Javascript Ik maak de link stuk (preventDefault) en gebruik de focus functie zodat je gelijk kan typen. (Op deze manier werkt alles ook zonder Javascript). Ik lees het id uit en stop de naam en het comment nummer in een string die ik vervolgens in het formulier (id#comment) stop.

$(document).ready(function() {
    $('a.comment-reply-link').click(function(event) {
        event.preventDefault();
        var str = $(this).attr('id').slice(6);
        var id =  str.slice(0,str.indexOf('-'));
        var name = str.slice((str.indexOf('-'))+1);
        $('#comment').val('+ id + '">@' + name + ' ' + $('#comment').val()).focus();
    });
});

JavaScript Dynamisch inladen waar nodig is

You’ve found a dinosaur, this post is only here for archiving purposes. The content is outdated and is not applicable anymore. Also note that it is almost always faster to load one (minified) file with all your javascript over your whole site.

Als je op een gegeven moment merkt dat je heel veel JavaScript plugins gebruikt kan je gaan denken om ze alleen in te laden wanneer nodig met Ajax. Als je met een CMS werkt waar je elke plugin niet op elke pagina nodig hebt kan je hier gebruik van maken om je website sneller te maken.

jQuery biedt voor dit doeleinde een makkelijke functie waarmee je dit kan bereiken:

$(document).ready(function() {
    $.getScript('link naar script',function(){
        //uit te voeren functie
    }
});

Met de functie getScript kan je een script inladen alsof je hem in de html had aangeroepen met , je houdt natuurlijk wel de dynamiek die JavaScript biedt om eerst te checken of je de plugin wel echt nodig hebt.

De uit te voeren functie is niet verplicht maar deze is vaak handig om gelijk een call te doen naar een plugin die je net hebt ingeladen, deze functie wordt pas uitgevoerd zodra het script helemaal is ingeladen.

In mijn blog gebruik ik een JavaScript gebaseerde syntax highlighter die mijn code (zoals hierboven) mooi opfleurt en kleurt. SHJS heb ik alleen op pagina’s nodig waar ik überhaupt code laat zien. Ik zet altijd al mijn code in

 blokken (onder andere een vereiste voor SHJS), ik wil dus checken of er op de pagina een pre is en alleen dan het script uitvoeren.

$(document).ready(function() {
    if ($('pre').length > 0))
    {
        $.getScript('shmain.min.js',function(){
                shhighlightDocument('/shjs/', '.min.js');
            })
    }
});

Ik moet ook de lengte van pre checken om te verifieren dat hij er echt is. jQuery geeft namelijk altijd een object terug, dit is de makkelijkste manier om te checken iets aanwezig is op de pagina.

Ik ga nog een stapje verder door alleen te checken of er een pre is op een post pagina, en niet op alle andere plekken van mijn website (WordPress only)

if (is_single()) {
    echo '';
}