wpdb->insert: нужно ли защищаться от SQL-инъекций?
Нужно ли использовать wpdb prepare перед wpdb->insert?
Если я вставляю значения в таблицу WordPress используя wpdb->insert, нужно ли мне "очищать" данные перед вставкой или этот метод (wpdb->insert) делает это за меня?

Нет, вам не нужно подготавливать или экранировать данные, это делается автоматически классом wpdb
.
Из справочника по классу wpdb:
data:
(массив) Данные для вставки (в формате столбец => значение). Ни названия столбцов, ни значения в $data не должны быть экранированы для SQL.
Однако, если бы вы писали собственный SQL-запрос вместо использования метода insert
, то да, вам следовало бы использовать экранирование через prepare
.

Следующее предупреждение относится к классу wpdb.
https://codex.wordpress.org/Class_Reference/wpdb
Предупреждение
Некоторые функции в этом классе принимают SQL-запрос в качестве входных данных. Вы должны экранировать все ненадежные значения, которые включаются в SQL-запрос, чтобы предотвратить атаки SQL-инъекций. Проверьте документацию, чтобы узнать, экранирует ли функция, которую вы планируете использовать, SQL-запрос автоматически или ожидает, что он будет предварительно экранирован.
Я понимаю это так - класс wpdb не подготавливает и не экранирует данные автоматически.
Я почти уверен, что если вы не можете на 100% доверять источнику данных в вашем коде, то я рекомендую использовать метод prepare().
Не думайте, что использование prepare() исправит ситуацию без его правильного применения. Я довольно новичок в этом, поэтому, пожалуйста, оставляйте исправления в ответах, если я не прав.
$wpdb->prepare( "SELECT * FROM table WHERE ID = %d AND name = %s", $id, $name );
В приведенном выше выражении есть два дополнительных параметра. Один для ID, другой для имени. Насколько я понимаю, каждый из них соответствует по порядку элементам в вашем запросе. Также %s = строка, %d = целое число и %f = число с плавающей точкой.
Кроме того, из моих чтений, если вы не укажете дополнительные параметры, prepare() фактически ничего не сделает. Будет выведено предупреждение, но если вы его отключите, возможно, вы не узнаете об этом.
Вот пример из самой документации класса, где они добавляют prepare() в INSERT:
https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
$wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s ) ", array( 10, $metakey, $metavalue ) ) );
Моя озабоченность в том, что популярный ответ неверен согласно той же странице, на которую никто не ссылается. Я предполагаю, что следует использовать prepare(), но не другие стандартные методы экранирования PHP, потому что я тоже считал этот ответ правильным... пока не копнул глубже.
В любом случае... возможно, с момента первоначального ответа что-то изменилось.

Принятый ответ верный. Когда вы используете функции типа $wpdb->insert()
, $wpdb->update()или
$wpdb->delete(), данные должны быть RAW. В ситуации, когда вы используете, например,
$wpdb->query()` и передаёте SQL-запрос как входные данные, вы должны экранировать ненадёжные данные.

нмр, кажется, теперь я понял. Чтобы уточнить... для моего спокойствия... то, что вы использовали в качестве примера — это 'метод insert' и 'метод delete' в отличие от моих примеров с использованием 'метода query' (%wpdb->query). Мне удалить свой ответ? Или оставить?

Нет, вам не нужно защищаться от SQL-инъекций при использовании функций wpdb insert или wpdb delete.
Смотрите следующие ссылки:
https://codex.wordpress.org/Data_Validation#Database
https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
