In der Options API arbeitet WordPress stark mit “Yes” und “No” Werten, die sogar in die Datenbank geschrieben werden. Wie aber werden diese Werte in boolsche Werte umgewandelt? Das steht hier.
Ja/Nein
Ich halte es zwar für eine schlechte Idee, yes/no-Werte in die Datenbank abzuspeichern aber WordPress nutzt es trotzdem. Vor allem in der Options-API im Feld autoload. Warum und wieso, weiß ich nicht und wollte es – ehrlich gesagt – auch gar nicht recherchieren. Am Ende ist es auch egal, denn es ist, so wie es ist und die Entwickler müssen damit klarkommen.
Nicht selten kommen mir aber auch Plugins unter, die mit yes/no oder der Kurzform y/n arbeiten. Wie bekommt man diese Werte in ein boolsches true/fals umgewandelt?
Möglichkeit 1: If-Vergleich (Nicht optimal)
Natürlich kommt Ihnen sofort ein if-Vergleich in den Sinn:
$val = 'yes'; var_dump( 'yes' == $val ); // ergibt true
Das klappt zumindest so lange wie das “yes” klein geschrieben wurde:
$val = 'Yes'; var_dump( 'yes' == $val ); // ergibt false
Möglichkeit 2: WordPress Funktion (Nicht optimal)
Deutlich einfacher (aber trotzdem nicht optimal) geht das mit bool_from_yn(). Es überprüft ob an erster Stelle ein “y” steht. Wenn ja, wird true zurückgegeben. Folgende Fälle wären damit abgedeckt:
var_dump( bool_from_yn( 'Yes' ) ); // false var_dump( bool_from_yn( 'yes' ) ); // false var_dump( bool_from_yn( 'y' ) ); // true var_dump( bool_from_yn( 'Y' ) ); // true
Wie man sieht ist das auch nicht optimal. Denn einige Werte werden nicht gekannt. Evtl. wäre eine vorheriger Aufruf von strtolower() innerhalb der Funktion besser gewesen.
Möglichkeit 3: PHP-Funktion
Besser schaut’s da mit der Hauseigenen boolval()-Funktion von PHP aus. Es erkennt nichnur alle oben genannten Fälle sondern noch viele weitere.
var_dump( boolval( 'Yes' ) ); // true var_dump( boolval( 'yes' ) ); // true var_dump( boolval( 'y' ) ); // true var_dump( boolval( 'Y' ) ); // true
Allerdings ergibt:
var_dump( boolval( 'false' ) ); // true
Möglichkeit 4: PHP-Funktion
Wer auch boolsche-Wert im String-Format richtig interpretiert haben will, der kann auf filter_var() zurückgreifen:
var_dump( filter_var( 'Yes', FILTER_VALIDATE_BOOLEAN ) ); // true var_dump( filter_var( 'yes', FILTER_VALIDATE_BOOLEAN ) ); // true var_dump( filter_var( 'y', FILTER_VALIDATE_BOOLEAN ) ); // false var_dump( filter_var( 'Y', FILTER_VALIDATE_BOOLEAN ) ); // false var_dump( filter_var( 'false', FILTER_VALIDATE_BOOLEAN ) ); // false
Die optimale Lösung:
Wie man sieht, gibt es die optimale Lösung nicht. Höchstens, wenn man sich einen eigenen Callback baut:
$a = filter_var( 'false', FILTER_CALLBACK, array( 'options' => function ( $v ) { if ( 'y' === strtolower( $v ) ) { return true; } return boolval( filter_var( $v, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) ); }, ) ); var_dump($a); // false
Damit wäre vieles abgedeckt. Und es funktionieren auch Werte wie “off” oder “no”.
Was sagt uns das? Nicht immer müssen die WordPress-Funktionen die besten Lösungen bieten.