La lista bianca è utile a rammentare cosa consentire.
Il parametro è già filtrato e se il valore stringa non è una sintassi speciale per il database va più che bene. Comunque è buona norma utilizzare i Prepareted Statement con il proprio charset il 4 parametro del costruttore PDO (dopo dbname) o in alternativa tramite opzione (dopo la pass) PDO::MYSQL_ATTR_INIT_COMMAND => 'Set Names UTF8'; o a proprio rischio direttamente Set Names UTF8 se il proprio PHP non imposta la preferenza del charset (solitamente accade se fù costruito prima del PHP 5.3.1 poiché il charset non dovrebbe essere ignorato direttamente nel costruttore). La terza sintassi ti espone comunque a rischi però è limitato poiché filtrato dalla lista bianca. Maggiore informazioni https://www.php.net/manual/en/mysqli...ts.charset.php
Inoltre considera che precedentemente WordPress utilizzava UTF8 che poi è stata aggiunta la possibilità di crearlo in utf8mb4, se il database tabelle e campi non hanno o tutti UTF-8 o utf8mb4 si presenterà qualche problema 
Se effettuo una richiesta http e quindi esegue il codice php è comunque l'esito del programmatore effettuare la query, Se esiste il valore in $_POST e $_GET è una ripetizione diretta o indiretta, va utilizzato per un metodo altrimenti scrivi codice OOP ma per le debolezze del codice procedurale.
Per mio gusto personale è più efficiente effettuare la query anche se non esiste il valore tramite uno dei due metodi http, cioè:
Codice PHP:
$hide_error = true;
$allowed_list = array('position');
//if(!empty($_GET['orderby'])) //se non è una stringa vuota o array vuoto, la struttura di controllo successiva rende l'idea più chiara
if(isset($_GET, $_GET['orderby']) && is_string($_GET['orderby']) && '' !== $_GET['orderby']) {
$key = array_search($_GET['orderby'], $allowed_list, true);
if($key === 0)
$hide_error = false; //Non mostrare errore a chiunque, se true in questo contesto è utile per capire che non è 'position' === 'position' e che quindi per comprendere meglio l'imprevisto non per generare e lanciare un'eccezione
}
$orderby = 'position'; //implicito
var_dump($orderby);
Perché generare un'eccezione se comunque ho solo bisogno di una richiesta http, poiché il codice dovrà essere eseguito? Semplicemente lo imposto esplicitamente.
Altre info per PDO https://phpdelusions.net/pdo
PS. Se $_GET['orderby'] non esiste php assegna automaticamente il valore NULL, quindi la tua funzione imposta comunque
Codice PHP:
$orderby = 'position';
che è il valore della lista bianca.