Intereting Posts
pagenavi показывает много страниц, рассчитанных из всех сообщений на сайте с помощью query_posts Исключить категорию из запроса, который включает его родительскую категорию Количество сообщений в категории Как предоставить несколько культур одного и того же изображения в теме? Тип и тип почтового сообщения WordPress Пользовательская роль не может удалить пользовательский тип сообщения Все пользовательские виджеты не отображаются одновременно в области виджетов Поиск слова заголовка через query_posts (не точное совпадение) Архивные листинги, отобранные по дате Значения в пользовательском поле / сообщение Meta? Добавление rel = "nofollow" к внешним ссылкам в сообщениях? WP_Query и использование переменной для 'cat' => в массиве args = WP Bug? Подписчики на сообщения Как реализовать разбиение на страницы в обратном порядке, например. первая – 20 – 19 – 18 – … – 3 – 2 – 1 – последняя Как эхо get_post_meta (Fluent-Framework) В чем разница между крючками, фильтрами и действиями?

$ wpdb-> обновлять несколько строк, например IN в обычном SQL

Мне было интересно, можно ли использовать $ wpdb-> update для обновления значений для нескольких строк, таких как IN в «нормальном» SQL. Я хочу сделать что-то вроде этого примера;

UPDATE [table] SET [column_1] = [updated_value] WHERE [column_2] IN ([comma_separated_ids]) 

Я искал вокруг, как это будет работать, но я еще не нашел другого вопроса, задающего этот или любой ответ / сообщение в блоге, объясняющее, можно ли это сделать или нет.

На данный момент я использую запрос вместо этого, но было бы лучше с простым одним лайнером

Заранее спасибо, Людвиг Шёбек

Solutions Collecting From Web of "$ wpdb-> обновлять несколько строк, например IN в обычном SQL"

Как вы можете видеть в исходном коде, знак = жестко закодирован в wpdb::update() , поэтому по умолчанию невозможно использовать IN для метода обновления.

wpdb::query() способ сделать трюк – использовать wpdb::query() с вашим sql-запросом, просто убедитесь, что вы wpdb::query() все значения

Пример:

 function wpdb_update_in( $table, $data, $where, $format = NULL, $where_format = NULL ) { global $wpdb; $table = esc_sql( $table ); if( ! is_string( $table ) || ! isset( $wpdb->$table ) ) { return FALSE; } $i = 0; $q = "UPDATE " . $wpdb->$table . " SET "; $format = array_values( (array) $format ); $escaped = array(); foreach( (array) $data as $key => $value ) { $f = isset( $format[$i] ) && in_array( $format[$i], array( '%s', '%d' ), TRUE ) ? $format[$i] : '%s'; $escaped[] = esc_sql( $key ) . " = " . $wpdb->prepare( $f, $value ); $i++; } $q .= implode( $escaped, ', ' ); $where = (array) $where; $where_keys = array_keys( $where ); $where_val = (array) array_shift( $where ); $q .= " WHERE " . esc_sql( array_shift( $where_keys ) ) . ' IN ('; if( ! in_array( $where_format, array('%s', '%d'), TRUE ) ) { $where_format = '%s'; } $escaped = array(); foreach( $where_val as $val ) { $escaped[] = $wpdb->prepare( $where_format, $val ); } $q .= implode( $escaped, ', ' ) . ')'; return $wpdb->query( $q ); } 

Затем используйте его так:

 wpdb_update_in( 'posts', // table array( 'post_author' => '1', 'post_status' => 'draft' ), // data array( 'post_author' => array( '2', '3', '4', '5' ) ), // where array( '%d', '%s' ), // format '%d' // where format ); 

Выполненный SQL будет

 UPDATE wp_posts SET post_author = 1, post_status = 'draft' WHERE post_author IN (2, 3, 4, 5)