@khodos_dmitry

Что плохого в прямых запросах к БД в Wordpress?

У меня задача получить метаполя записи определенного типа поста.
Я получил вот так:
SELECT `post_id`, `meta_value` FROM `wp_postmeta` WHERE `post_id` IN (SELECT `id` FROM `wp_posts` WHERE `post_type` = 'bank' AND `post_status` = 'publish') AND `meta_key` = 'cpl_bank_title'

то есть одним запросом к SQL.
Cредствами Wordpress у меня получилось так:
$query = new WP_Query( array( 'post_type' => 'bank' ) );
foreach($query as $que) {
	$meta_value = get_post_meta($que->ID, 'cpl_bank_title');
	$arr[$que->ID] = $meta_value[0];
}

что делает запросов во много раз больше.
Некоторые разработчики избегают прямых запросов к БД. Я понимаю, что из-за того, что структура БД может поменяться и прямые запросы перестанут работать. Или из-за чего?
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 2
mihdan
@mihdan
WordPress-евангелист, ведущий РНР - разработчик
Если вы знакомы с понятие API, то такие вопросы НЕ должны возникать. Вы работаете с абстракцией и вам совершенно должно быть по барабану, что там внутри и как устроена база, которая в последних версиях значительно изменилась и будет менять в будущем.

Например, не так давно появилась новая таблица wp_termmeta - для хранения метаинформации по терминам, раньше эта информация лежала в wp_options.

В прямых запросах нет ничего плохого, если вы знаете что и зачем вы делаете, как защитить запрос от неверных данных, от инъекций, отфильтровать параметры.

В обычной ситуации WP_Query вам хватит с головой. А ваш кейс решается простым прочтением документации в виде функции get_post_meta().

Если второй параметр у функции опустить, то будут получены все произвольные поля поста. Если вы хотите работать напрямую с SQL в обход API, в котором 2000 готовых функций, зачем вам тогда WordPress? Пишите на чистом коде.

Удачи в прочтении Кодекса WordPress!
Ответ написан
Ничего плохого, просто если с какой-то версии изменится структура БД, то Вам придется переписывать запросы. А если Вы будете работать с объектом wp_query то этого делать не придется, т.к. разработчики его поправят под другую структуру
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы