Dynamisk sökväg för WordPress child themes

Dynamisk kanske är lite fel ord att använda, men det beskriver nog bäst den funktionen som knackades ihop igår och jag tänkte dela med mig av.

Problemet ligger i att jag alltid använder mig av ett child theme till ett egenknackat huvudtema, i temat ingår en del bilder – logotyp, bakgrund, favikon, knappar eller vad det nu kan vara och det vore trevligt med en fallback. Det känns väldigt bekvämt att slippa kopiera in samma bilder på två ställen men ändå snabbt ha en möjlighet att byta ut den enbart genom att droppa in en ny med samma namn i sitt nya tema. Läs hela inlägget →

Ändra storlek på bilder on-the-fly med WordPress

Hittade precis en trevlig liten funktion som, i likhet med timthumb.php, ändrar storleken på bilder direkt när du behöver det men använder WordPress inbyggda funktionallitet snarare än att bygga ihop en ny funktion. Användbarheten är enorm – speciellt när du vill visa bilder och beskära eller ej. Extra trevligt är det eftersom den verkar komplettera det som saknas i vanliga fall då man definierar egna storlekar mot the_post_thumbnail();.

Tips när ni uppdaterar MAMP

Snabbt tips om ni skulle få för er att uppdatera MAMP (Mac Apache MySQL PHP), gör det inte utan att ta en backup på alla databaser ni har internt. Mina försvann just nu vilket kommer ge mig en massa mer jobb de närmsta dagarna. Jippie, tjo och tjim…

“Behöver inte kunna PHP, jag har WordPress”

Ett citat som jag fick för någon dag sedan som jag har funderat en del över. Tar verkligen WordPress kål på behovet att kunna programmera PHP? Tvärtom skulle jag vilja påstå.

Läs hela inlägget →

WWW-prefix ska inte spela någon roll

Idag 2009 ska man väl inte behöva bry sig om www framför webbadressen? Om en webbplats vill använda www, kör på, men lös ändå ändå en 301-redirect ifall någon som skriver adressen utan www-prefixet.

Om jag skriver example.com och får fram ett fel så är det föga troligt att jag testar med www före. Det behövs nog inte påpekas hur många besökare och eventuella intäkter som kan gå förlorade på detta.

Studentkåren Sundsvall är ett dåligt exempel

Studentkåren Sundsvall är ett dåligt exempel

Att lösa problemet är inte svårt, om man kör med Apache och har mod_rewrite aktiverat så är det enbart lägga in ett par rader i sin .htaccess:

[sourcecode language="plain"]RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L][/sourcecode]

ASP.NET användare kan kolla in Response.Status och Response.Addheader, kör du PHP så fungerar header() fin-fint för en redirection.

Enkelt, smidigt och klart mer tillgängligt.

Relaterade poster i WordPress utan att förstöra kommentarerna

relaterade-poster

Ett par timmar har gått åt till att få igång en egen relaterade poster funktion till WordPress. Själva scriptet är inte ett dugg konstigt utan kan hittas lite överallt även om jag ville sätta en egen twist på det hela.

Målet var att skapa en funktion som visar bilder samt titeln på inlägget istället för en vanlig tråkig lista. Koden jag använde (utan CSS) blev till slut följande.

[code language="php"]
$tags = wp_get_post_tags($post->ID);
if ($tags) {
$tag_ids = array();
foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;

$args=array(
'tag__in' => $tag_ids,
'post__not_in' => array($post->ID),
'showposts'=>3, // Number of related posts that will be shown.
'caller_get_posts'=>1
);
$my_query = new wp_query($args);
if( $my_query->have_posts() ) {
echo '<div class="related-posts"><h3>Möjligen relaterat innehåll</h3><ul>';
while ($my_query->have_posts()) {
$my_query->the_post();
?>
<li>
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">
<img src="<?php echo get_bloginfo('template_url'); ?>/thumb.php?src=<?php echo catch_that_image('default2') ?>&w=150&h=100&zc=0&q=100" alt="<?php the_title(); ?>"/>
<span><?php the_title(); ?></span></a>
</li>
<?php
}
echo '</ul></div>';
}
}

Jag använder helt enkelt den klassiska funktionen catch_that_image(), med en lite twist för att få olika storlekar på defaultbilden, och thumb.php för att visa bilden och sen är resten som vanligt.

Problemet som visade sig var att även att wp_query() kallades med new, vilket i min bok kallas för en ny instans av objektet, så sattes alla kommentarsvariabler till den senaste relaterade posten med kommentarer. Detta är en sidoeffekt som direkt inte är önskvärd.

Lösningen är väldigt enkel: spara variabler och återanvänd dem. Innan jag börjar min nya loop så sparar jag ner ett par variabler från den gamla loopen.

[code language="php"]
$old_comment = $comments; $old_id = $id; $old_post = $post; $old_withcomments = $withcomments;

Och efter loopen återställer jag helt enkelt värdena som de var innan.

[code language="php"]
$comments = $old_comment; $id = $old_id; $post = $old_post; $old_widthcomments = $withcomments;

Nu får vi fram exakt den effekten som önskades från början, allt som krävs är lite CSS-magi. Resultatet kan du se under detta inlägget.

Smidigaste sättet eller är jag fel ute?

Prestanda, PHP-sidor och HTML-sidor

Det började som en frågeställning när jag gjorde mitt första WordPress tema och jag såg att PHP startades, och stängdes av och gick över till HTML för att sedan gå tillbaka till PHP vilket jag ser som ytterst ineffektivt. Vad är då mest effektivt? Att enbart göra hela sidan i PHP eller växla fram och tillbaka?

Anledningen till frågan är att jag läste en bloggpost som skrev att A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts.

Visst jag kan köpa detta, men när jag lärde mig PHP så var det så att för varje gång man körde en start- och sluttagg så initierades respektive avslutades PHP-modulen vilket betyder att man bör minimera start och avslut för att effektivisera och öka prestandan.

Vad är då snabbare av kodning-sätten:

[code language="php"]
<?php $comment_type = get_comment_type(); ?>
<?php if($comment_type == 'comment') { ?>

<?php if ($i%2) { echo '
<div class="comment-even">'; } else { echo '
<div class="comment-odd">'; } ?>
<?php echo get_avatar( $comment, 42 ); ?>
<span><?php comment_author_link() ?> tycker ...  </span>
<div><?php comment_text() ?></div>
</div>
<br class="dirtyLittleTrick" />
<?php } else { $trackback = true; } /* End of is_comment statement */ ?>
<?php endforeach; /* end for each comment */ ?>

Eller:

[code language="php"]
<?php $comment_type = get_comment_type();
if($comment_type == 'comment') {

if ($i%2) { echo '
<div class="comment-even">'; } else { echo '
<div class="comment-odd">'; }
echo get_avatar( $comment, 42 );
echo '<span>'.comment_author_link().' tycker ...  </span>
<div>'.comment_text() .'</div>
</div>
<br class="dirtyLittleTrick" />';
} else { $trackback = true; }
endforeach;  ?>

Exemplet  är från ett WordPress tema och jag föredrar den sista, men är det den rätta vägen att gå?

Lär dig PHP, OOP-style!

php_oop
Nettuts har en helt excellent artikel om hur man kan börja lära sig objektorienterad php-programmering. Exemplet de går igenom är hur man hanterar bilder enkelt men kan omsättas till andra scenarion.

Att koda objektorienterat hjälper verkligen då man för det första gör ett projekt som fler än en person är involverad i eller gör ett projekt som är större och behöver riktig struktur. Det är också enklare när projektet kanske behöver editeras senare av en tredje part.

Typografera dina förkortningar med CSS och PHP

Enligt Typografisk Handbok (Hellmark) så kan versala ord se ut som fläckar i din text. Detta kan avhjälpas genom att spärra dem smått och sätta de i kapitäler. Jag tänkte gå igenom ett snabbt tips hur man enkelt kan lösa detta med hjälp av PHP och CSS.

Flera versaler efter varandra i löpande text blir ofta påträngande […]. Det kan avhjälpas genom att man sätter versalerna en punkt mindre än den övriga texten och spärrar dem lite […].

För det första är denna koden ganska generell och det reguljära uttrycket är på inget sätt optimerat då mina kunskaper inom det fortfarande är ganska låga, det finns säkert en smartare sträng som löser uppgiften.
Först antar vi att din text är i en string:
[code language="php"]$str = "Hej en förkortning kan se ut som detta CSS eller HTML-kod samt PHP";

Sen behöver vi reguljära uttryck och en replace på de förkortningar som finns:
[code language="php"]$pattern = array(
"/s([A-Z][A-Z0-9]{2,})s/",
"/s([A-Z][A-Z0-9]{2,}+)/"
);
$replace = array(
" $1 ",
" $1"
);
$str = preg_replace( $pattern, $replace, $str);

Detta byter ut alla förekomster av förkortningar med tre tecken eller mer i den löpande texten. Att vi har två reguljära uttryck är eftersom en förkortning kan finns som ensamstående, HTML, eller som del av ett ord, HTML-koden.

Det som är kvar är att sätta en stilmall på den nya layouten:
[code language="css"]abbr {
letter-spacing: 0.1em;
font-variant: small-caps;
font-size: 11px;
}

Att vi väljer dessa regler är ganska enkelt. En förkortning ska enligt Hellmark spärras med ungefär 10%, alltså blir det 0.1em. Istället för att använda versaler som ser konstigt ut så kan man istället använda kapitäler som har samma x-höjd som resterande text. Det kan också vara en bra idé att minska textstorleken med 1pixel (eller punkt i print) för att linjera texten ytterligare.

Sammanfattning

[code language="php"]$str = "Hej en förkortning kan se ut som detta CSS eller HTML-kod samt PHP";
$pattern = array(
"/s([A-Z][A-Z0-9]{2,})s/",
"/s([A-Z][A-Z0-9]{2,}+)/"
);
$replace = array(
" $1 ",
"
$1"
);
$str = preg_replace( $pattern, $replace, $str);

Och CSS:
[code language="css"]
abbr {
letter-spacing: 0.1em;
font-variant: small-caps;
font-size: 11px;
}

Lägg in din bloggyfeed med simpleXML och PHP

Gjorde som flera andra och skaffade mig ett konto på mikrobloggsiten bloggy.se tidigare och tänkte det vore snyggt att visa vad man gör på den sidan via sin blogg. Skrev därför ihop en snabb klass i PHP med hjälp av simpleXML som hämtar RSS-feeden från sidan och skriver ut den på bloggen.

bloggy.

Delar med mig av koden som skrevs här:

[code language="php"]&lt;?php
class Bloggy {
function connect($feed) {
return @simplexml_load_file($feed);
}
function getAvatar($feed) {
$sxml = $this-&gt;connect($feed);
return $sxml-&gt;channel[0]-&gt;image[0]-&gt;url[0];
}
function getFeed($feed, $limit = 10) {
$sxml = $this-&gt;connect($feed);
$x = 0;
while ($x &lt; = $limit &amp;&amp; isset($sxml-&gt;channel[0]-&gt;item[$x])) {
$return[$x] = array(
'date' =&gt; $sxml-&gt;channel[0]-&gt;item[$x]-&gt;pubDate[0],
'permLink' =&gt; $sxml-&gt;channel[0]-&gt;item[$x]-&gt;link[0],
'title' =&gt; utf8_decode($sxml-&gt;channel[0]-&gt;item[$x]-&gt;title[0])
);
$x++;
}
return $return;
}
}
?&gt;

Hur man använder klassen finns här under:

[code language="php"]
$rss = 'http://drago.bloggy.se/rss';
$bl = new Bloggy;
echo '&lt;img src=&quot;'.$bl-/&gt;getAvatar($rss).'&quot; alt=&quot;bloggy avatar&quot; /&gt;';

foreach ($bl-&gt;getFeed($rss) as $value) {
echo '&lt;div&gt;';
echo $value['date'];
echo '&lt;a href=&quot;'.$value['permLink'].'&quot;&gt;'.$value['title'].'&lt;/a&gt;';
echo '&lt;/div&gt;';
}

Kom ihåg att det är en "first draft", det vill säga en snabbt skriven klass, det vill säga - alla funktioner finns inte än samt att den kanske inte är snyggast i Sverige. SimpleXML bör finnas i varje hem som kör PHP5.x.

Håll till godo.

Enklaste sättet att sätta upp en server med PHP, MySQL och Apache2

Många är frågorna som kommer till min IM klient. Men de flesta brukar handla om den enkla frågan “Varför fungerar inte min PHP med apache?”. Svaret jag brukar ge är att kasta bort all manuell installation om du inte vet vad du gör, det finns så mycket enklare alternativ. Wampserver är en bundle-pack som sköter allt åt dig.

Så här installerar du en WAMP-server (Windows Apache MySQL PHP/Perl) på din dator på enklaste sättet.

1. Börja med att gå till http://wampserver.com, förstår du inte franska så tryck på den lilla engelska flaggan på höger sida.

2.  Klicka på download i menyn och klicka på download igen på sidan (eller på direktlänken här).

3. Leta upp exe-filen på din dator och starta installationen. Följ stegen och klicka dig igenom, inga extra uppgifter eller kunskaper behövs egentligen för en fungerande grundinstallation.

wamp_3

4. För att PHP ska fungera med alla script så rekommenderar jag att du ställer om short open_tags till on. Detta gör du med ett musklick (vänsterklick) på den lilla ikonen som dykt upp i aktivitetsfältet, väljer PHP, PHP settings och trycker på “short open tags“. Detta gör att du inte behöver <?PHP i php-filerna utan kan nöja dig med <?. Den här inställningen är oftast inte rekommenderad – men lata programmerare finns det gott om.

wamp_4

Grattis! Nu ska det fungera! Navigera med din favoritläsare till http://localhost/ och du ska se en startsida. Filerna finner du i c:\wamp\www (om du inte ändrat sökvägen vid installationen).

Extra tips som kan behövas är att aktivera mod_rewrite för snygga urls samt att ändra din sökväg till din webbroot.

För att aktivera mod_rewrite, gå in i Wampserver-menyn igen, gå till Apache -> httpd.conf. Sök efter mod_rewrite och ta bort kommentaren framför raden (#). Apache behöver nu startas om, tryck på Restart all Services om du inte vill göra fler ändringar.

Vill du ändra katalogen för din webbroot så navigerar du in httpd.conf igen, navigera nedåt i dokumentet tills du hittar “DocumentRoot”, ändra till din sökväg och byt ut backslashes mot vanliga slashes. Kopiera den slutgiltiga sökvägen och gå ner en liten bit till, du ser en kommentar som det står:

#
# This should be changed to whatever you set DocumentRoot to.
#

Byt ut den befintliga med din sökväg igen. Starta om Apache och allt ska nu vara klart!

Något ni saknar? Ska jag ta upp något annat? Berätta gärna!