WordPress. Насколько безопасен данный запрос к базе данных

Первый раз делаю сайт и пишу что то на php. Пробовал использовать стандартный поиск wordpress и добавить поиск по метаполю. Все работало, но не смог сделать сортировку по другому метаполю. В итоге решил просто сделать запрос к базе данных. Сейчас все работает как нужно, но ввиду того, что я начинающий в php хотел узнать насколько такой запрос безопасен.

global $wpdb;
$category_name = 'category';
$meta_key_1 = 'keys';
$meta_key_2 = 'likes';

// search
$search_all = '%';
$get_s = explode(" ", trim($_GET['s']));
if( $get_s ) {
    foreach ( $get_s as $s ) {
        $like = $wpdb->esc_like( $s );
        $search_all .= $like . '%' ;
    }
}

// category
$get_cat = explode(",", trim($_GET['category']));
$get_cat_all = '';
if( $get_cat ) {
    foreach ( $get_cat as $get_c ) {
        $like = $wpdb->esc_like( $get_c );
        $get_cat_all .= $like . ',' ;
    }
}

// placeholders for category
$placeholders = array_fill( 0, count($get_cat), '%s' );
$format = implode( ', ', $placeholders );

$args = $meta_key_1 . ',' . $meta_key_2 . ',' . $category_name . ',' . $get_cat_all . $search_all . ',' . $meta_key_1 . ',' . $category_name . ',' . $get_cat_all . $search_all;

$args_all = explode(",",  $args);
print_r( $args_all);

$sql = "SELECT DISTINCT * FROM $wpdb->posts AS p
LEFT JOIN $wpdb->postmeta AS pm1 ON (p.ID = pm1.post_id AND pm1.meta_key = %s)
LEFT JOIN $wpdb->postmeta AS pm2 ON (p.ID = pm2.post_id AND pm2.meta_key = %s)
LEFT JOIN $wpdb->term_relationships AS tr ON (ps.ID = tr.object_id)
LEFT JOIN $wpdb->term_taxonomy AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
LEFT JOIN $wpdb->terms AS t ON (tt.term_id = t.term_id)
WHERE ps.post_type = 'post'
AND ps.post_status = 'publish'
AND tt.taxonomy = %s
AND t.slug IN ($format)
AND ps.post_title LIKE %s
OR psm1.meta_key = '%s'
AND tt.taxonomy = %s
AND t.slug IN ($format)
AND psm1.meta_value LIKE %s
AND ps.post_status = 'publish'";

if( $_GET['sort'] === 'popular'){
    $sql .= " ORDER BY psm2.meta_value +0 DESC";
}else if( $_GET['sort'] === 'oldest' ){
    $sql .= " ORDER BY ps.post_date ASC";
}else{
    $sql .= " ORDER BY ps.post_date DESC";
}
if ( $sql ){
    $query = $wpdb->get_results( $wpdb->prepare ( $sql,  $args_all));
}

Ответы (1 шт):

Автор решения: KAGG Design

В принципе, поскольку в самом конце используется $wpdb->prepare(), то запрос можно считать безопасным. Но что там будет выполнено, предсказать сложно, поскольку входные данные почищены неправильно. Функции esc_ предназначены для очистки вывода на экран, а для очистки вводимых данных надо использовать sanitize_ или filter_input. Подробнее здесь.

Кроме того, входные данные не проверены с помощью nonce.

→ Ссылка