Onzichtbaar een WordPress website debuggen
Oké, iedereen weet wel dat het niet slim is om dingen als print_r() of andere echo varianten te gebruiken op een live website. Zeker niet als bezoekers het kunnen zien, dat staat erg onprofessioneel.
Maar soms wil je snel even iets checken, dus hoe kunnen we dit nu zo snel maar onzichtbaar mogelijk doen?
Een Wordpress-vriendelijke print_r() functie
Wat we nodig hebben is een WordPress-vriendelijk php functie die de waarde van een variabele kan printen (zoals print_r), maar zonder dat onze websitebezoekers het kunnen zien!
Om het simpel en in stijl van deze website te houden heb ik het de naam print_ar() gegeven. In de meest simpele vorm zag het er zo uit:
1
2
3
4
56
| function print_ar( $Data ){ if ( is_user_logged_in() && current_user_can('delete_pages') ) { print_r( $Data); }} |
De if statement if ( is_user_logged_in() && current_user_can('delete_pages') ) checkt of de huidige gebruiken een admin is. Is dan zo dan, en alleen dan, wordt de waarde van de variabele geprint.
Dit is een leuk begin, maar het kan nog beter. Een handige toevoeging is om de geprinte in <pre> tags in te sluiten. Zodoende wordt een array ook mooi weergegeven.
Wat we ook kunnen doen is om het geheel een CSS class te geven zodat we makkelijk het uiterlijk kunnen aanpassen. Bijvoorbeeld door het goed opvallend te maken voor onszelf.
Een andere toevoeging is om te kijken wat voor type variable we geprint hebben. Want als print_r als resultaat 13 geeft, dan weet je niet of die 13 een string of een integer is. En dat kan een groot verschil maken in de rest van de code.
Als we dit alles toepassen krijgen we zoiets als dit:
1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 | function print_ar( $Data ){ if ( is_user_logged_in() && current_user_can('delete_pages') ) { echo'<div class="ar_var_dump">'; if( is_object( $Data ) ){ echo'<b>OBJECT RESULT:</b><br/>'; echo'<pre>'; print_r( $Data ); echo'</pre>'; }else if( is_array( $Data ) ){ echo'<b>ARRAY RESULT:</b><br/>'; echo'<pre>'; print_r( $Data); echo'</pre>'; }else if( is_int( $Data ) ){ echo'<b>NUMBER RESULT: '.$Data.'</b><br/>'; }else if( is_string( $Data ) ){ echo'<b>STRING RESULT: '.$Data.'</b><br/>'; }else{ echo'<b>RESULT: '.$Data.'</b><br/>'; } echo'</div>'; } } |
Het resultaat staat nu in een div met een class zodat we de kleur en dergelijk kunnen aanpassen aan onze wensen.
Daarna volgt een if/else statement waar we uitzoeken om wat voor variabele het gaat. En wanneer we dat weten dan printen we dat samen met de waarde van de variabele.
Print de naam van de variabele
Ik was al erg blij met het resultaat tot nu toe, maar ik miste nog één ding: de naam van de variable, zodat je snel kan zien wat welke waarde heeft.
Helaas gaat dat boven mijn programmeerkennis..., maar gelukkig niet boven mijn Googlekunde. Op stackoverflow.com heb ik een bruikbaar stukje code gevonden. En met wat aanpassingen van mijn kant is dit mijn uiteindelijke WordPress vriendelijke print functie:
1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 28 29 3031 32 33 34 3536 37 38 39 | function print_ar( $Data ){ if ( is_user_logged_in() && current_user_can('delete_pages') ) { echo'<div class="ar_var_dump">'; if( ini_get('allow_url_fopen') ) { $backtrace= debug_backtrace(); $backtrace= $backtrace[0]; $fh= fopen( $backtrace['file'], 'r' ); $line= 0; while ( ++$line <= $backtrace['line'] ) $code= fgets( $fh ); fclose( $fh ); preg_match( '/' . __FUNCTION__ . 's*((.*))s*;/u', $code, $name ); $varName= trim( $name[1] ); }else $varName= 'VARIABLE'; if( is_object( $Data ) ){ echo'<b>OBJECT RESULT OF '.$varName.':</b><br/>'; echo'<pre>'; print_r( $Data ); echo'</pre>'; }else if( is_array( $Data ) ){ echo'<b>ARRAY RESULT OF '.$varName.':</b><br/>'; echo'<pre>'; print_r( $Data); echo'</pre>'; }else if( is_int( $Data ) ){ echo'<b>NUMBER RESULT: '.$varName.' = '.$Data.'</b><br/>'; }else if( is_string( $Data ) ){ echo'<b>STRING RESULT: '.$varName.' = '.$Data.'</b><br/>'; }else{ echo'<b>RESULT: '.$varName.' = '.$Data.'</b><br/>'; } echo'</div>'; } } |
Ik gebruik deze print_ar nu al een tijdje en het bevalt me perfect. Wie weet, misschien gebruik ik het wel nu op deze pagina zonder dat je het ziet! 😉
Om af te sluiten, laten we kijken hoe het resultaat er uit ziet (met mijn CSS styling). We gaan een array en een string printen op deze manier:
1
2
3
4
5 | $testArray= array( 'this', 'is', 'an', 'array'); $testString= 'This is a string'; print_ar( $testArray ); print_ar( $testString ); |
En zo ziet dit er dan uit: