Dans mon plugin actuel, je récupère la colonne order by
comme entrée utilisateur. J'ai donc pensé à utiliser wpdb->prepare
pour y échapper.
$wpdb->get_results($wpdb->prepare("Select id from $wpdb->posts order by %s %s", $order_by_col, $order_by);
Cela ne fonctionne pas car il est transformé en
select id from wp_posts order by 'post_date' 'asc'
(Notez les citations)
Alors, y a-t-il moyen de supprimer les guillemets? Aussi, est-ce une bonne façon d’utiliser $ wpdb-> prepare ()? Dois-je manuellement y échapper moi-même?
Vous ne pouvez pas utiliser prepare
pour les noms de colonne et vous ne pouvez pas non plus l'utiliser pour l'ordre de tri. prepare
citera toujours la chaîne. Vous devrez échanger les valeurs vous-même. Plutôt que d'essayer de "désinfecter" les données, j'utiliserais une approche de liste blanche.
$orderby = array(
'date' => 'post_date',
// etc
);
$sortorder = array(
'asc' => 'ASC',
'desc' => 'DESC',
);
$orderbycol = 'ID'; // just a default
if (isset($_GET['orderby'])
&& isset($allowed[$_GET['orderby']])) {
$orderbycol = $allowed[$_GET['orderby']];
}
$order = 'ASC';
if (isset($_GET['order'])
&& isset($sortorder[$_GET['order']])) {
$order = $sortorder[$_GET['order']];
}
$sql = "Select id from $wpdb->posts order by $orderbycol $order";
echo $sql;
Cependant, je me demande pourquoi vous n'utilisez pas WP_Query
pour cela.
La liste blanche est une bonne option pour 'ASC' 'DESC', mais pour les noms de table sur votre clause ORDERBY, WordPress a une fonction intégrée juste pour vous!
https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby
$order_by_col = sanitize_sql_orderby( $order_by_col );