bool_from_yn() – Ja/Nein in boolschen Wert umwandeln

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.