Sessioner och WordPress – ”det som går” är inte alltid rätt…

Webbutveckling - Wibergs Web -Bäst i Skövde

Vad är sessioner?

Sessioner (eng. sessions) är ett sätt att hantera data på en webbplats  för varje specifik besökare på sin webbplats i ”bakgrunden”. När sessioner används på en webbplats så försvinner denna data inom en viss tid. Hur lång tid denna tid är beror på en inställning som görs på server-nivå.

Ett exempel på detta är att hålla reda på vilka varor det finns i en varukorg i sin webbshop för varje besökare. Skulle man skicka den här typen av information via url’n / webbadressen skulle det kunna se ut så här: http://snyggakalsonger.se/webbshop/salming-traningsklader-tee/?current_products=5&userid=4098230498

Med hjälp av sessioner
 behöver man inte skicka med dessa parametrar i url’en (nödvändig data hanteras i bakgrunden) och då skulle ovanstående adress se ut så här istället:  http://snyggakalsonger.se/webbshop/salming-traningsklader-tee/

Att använda sig av sessioner blir både mer hanterbart, ser ”snyggare” ut i både adressfältet i webbläsaren och i googles sökresultat.

Sessioner i PHP

I sin enklaste form i PHP kan det se ut så här när man jobbar med sessioner:

Sidan där sessionen skapas:

<?php
session_start(); //Start med att hantera sessioner
$_SESSION['nr_products'] = 7;

Sidan där man vill hämta informationen:

<?php
session_start(); //Start med att hantera sessioner
echo $_SESSION['nr_products']; //Skriver ut 7

Givetvis finns det vissa specifika saker att tänka på med sessioner (precis som all annan programmering) men grunden att hantera s.k. sessions (sessioner) i PHP är relativt enkelt – enligt det koncept som finns ovan i exemplet. Ett annat mycket vanligt tillämpningsområde för sessioner är hantering av login. Hur ska man annars få någon säkerhet i det hela? Att skriva användarnamn och lösenord i klartext i webbläsaren är inte bara dumt, det är idiotiskt.

Sessioner i WordPress

Av någon anledning så har skaparna / utvecklarna av WordPress valt att inte ha support för sessioner / sessions som standard. Ett argument för att inte använda sessions är att man kan använda annat för att uppnå samma resultat och det kan man i de flesta fall, men det är inte alltid möjligt. Med tanke på att WordPress bygger på PHP och MySQL och de ändå måste ha något sätt att hantera inloggade användare (som görs med hjälp av sessioner) så tycker jag personligen det är mycket märkligt.  WordPress är fantastiskt på alla sätt och vis, men att ”aktivera”  sessionshantering  i WordPress känns onödigt krångligt.

Aktivera sessioner i WordPress

För att kunna använda sessions i WordPress finns tre olika grundläggande sätt att ”aktivera” sessioner:

1. Lägg in kod i wp-config.php (de första raderna)

if (!session_id())
session_start();

Detta är kanske det allra enklast sättet att aktivera sessioner i WordPress men det förutsätter att man har tillgång och möjlighet att ändra i den filen. Ingår din WordPress-site i en multisite-installation för WordPress bör du också undvika detta, då du troligtvis inte vill aktivera sessioner för alla sajterna.

2. Lägg in kod i en plugin (tillägg) 

<?php
add_action('init', 'mySession', 1);
function mySession() {
if(!session_id()) {
session_start();
}
}

Ska du skapa ett tillägg för WordPress så får du använda dig av ovanstående metod eller ännu hellre med ett objektorienterat förhållningssätt:


<?php
$mysessionObj= new mySessionHandler();
class mySessionHandler {

public function __construct() {
add_action( 'init', array( $this, 'mySession' ) );
}

function mySession() {
if(!session_id()) {
session_start();
}
}

}

3. Använd befintlig sessionshanterings-plugin

Det är inte lätt att hitta någon befintlig sessionshanteringsplugin i Wordpres men WP Session Manager är en stabil plugin som hanterar sessioner på ett bra sätt.

För att hantera sessioner med detta plugin/tillägg så kan man göra så här:


<?php
global $wp_session;
$wp_session = WP_Session::get_instance();
$wp_session['nr_products']=7;

och i en mall/template så kan sedan hämta denna session så här:


<?php
global $wp_session;
$wp_session = WP_Session::get_instance();
$wp_session['nr_products']=7;

Att göra på ovanstående sätt är inte speciellt flexibelt och risken för att ovanstående kod ska bli ”spretig” / ”rörig” är stor och kommer lätt bli svår att förstå och underhålla. Även om det går att göra på ovanstående sätt så betyder det inte alltid att ”det som går” är ”det som är rätt”.

Använd (alltid) ett objektorienterad förhållningssätt:
Om man t.ex. vill spara det man skrivit in i ett formulär så skulle man kan göra en ”FormHandler”-klass.


<?php
class FormHandler {
public $wp_session = null; //Use of Plugin WP Session manger, so we can handle sessions

public function __construct() {
$this->wp_session = WP_Session::get_instance();
}

public function get_current_formvalues() {
return $this->wp_session['formvalues'];
}
   
public function set_formvalues($formvalues) {
if ($this->wp_session === null) {
$this->wp_session = WP_Session::get_instance();
}
$this->wp_session['formvalues'] = $formvalues;
}

public function get_current_formvalues() {
return $this->wp_session['formvalues'];
}
}

Skapa sedan instansen av objektet och lägg in värden från ett postat formulär:

$form = new FormHandler();
$name = $_POST['company']; //Name of company
$phone = $_POST['phone']; //Phonenr to company
$formdata = array('name' => $name, 'phone' => $phone);
$form->set_formvalues($formdata);

Detta kan tyckas vara ett krångligt sätt att göra det på, men finessen (som all annan objektorienterad webbutveckling) är att det blir lätt att ”bygga på” utifrån en grund på ett flexibelt sätt.

Här är ett exempel där man skapar ett kontaktformulär och ett formulär för intresseanmälan:

Kontaktformulär


<?php
class Contactform extends FormHandler {
public __construct() {
        parent::__construct();
        //Do something that applies to the contactform only
        }
        public function set_values() {
            //Set values into the wp_sessions object
            //based on posted form values for this form
            $this->set_formvalues($postformvalues);
        }
        public function display() {
            $formvalues = $this->get_current_formvalues();
            //Show the interestform with current $formvalues from session;
            //Validate fields/handle errors for contactform
        }
}

Intresseanmälan

class InterestForm extends FormHandler {
public __construct() {
        parent::__construct();
        //Do something that applies to the interestform only
        }
        public function set_values() {
            //Set values into the wp_sessions object
            //based on posted form values for this form
            $this->set_formvalues($postformvalues);
        }
        public function display() {
            $formvalues = $this->get_current_formvalues();
            //Show the interestform with current $formvalues from session;
            //Validate fields/handle errors for contactform
        }
}

Vill man sedan visa ett kontaktformulär skriver man så här:

$form = new ContactForm();
$form->display();

Och intresseanmälan så här:

$form = new InterestForm();
$form->display();

Fördelen med detta är att dels att du kan återanvända funktioner (som finns i FormHandler), det blir struktur och det blir lättare att bygga på vad som krävs enbart för kontaktformuläret eller intresseformuläret. Det finns ingen anledning att inte använda objektorienterat – inte ens i WordPress. Det kan tyckas krångligare till en början men på lång sikt är det betydligt lättare att underhålla och förstå vad som sker i koden.

Ha alltid detta i åtanke vid all typ av webbutveckling och när jag tänker efter – vid all typ av programmering:  ”Det som går” är inte alltid det som är rätt….

Författare till detta inlägg (till denna blogg som handlar om webbdesign, webbutveckling och SEO)

Jag heter Gustav Wiberg och driver Skövdes genuina webbyrå Wibergs Web. Kontakta mig genom att klicka här.