Я бы определенно пошел на field_attach_update
.
Идея проста. Просто загрузите узел и сохраните его, используя field_attach_update.
Пример:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Это не изменит никакую временную метку или любой другой хук, который обычно вызывает node_save. Загрузка узла также вызовет некоторые хуки, поэтому, вероятно, это не так эффективно.
Если у вас есть nid и если структура узла очень проста, вы также можете сделать это следующим образом:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
В любом случае, если вы пытаетесь обновить что-либо кроме полей, это не сработает (статус комментария, опубликованный статус и т. Д.). Также, если вы используете node_save, кеш для конкретного узла будет очищаться автоматически для разных методов, нам нужно очистить его с помощью entity_get_controller.
Обновление:
Похоже, что вам также следует вызвать field_attach_presave()
другие модули, чтобы они правильно обрабатывали поля. Файловый модуль, например, использует его, чтобы установить постоянный статус файла с помощью этой ловушки. Я обновил 2 моих примера выше.
field_attach_update
?node_save
кfield_attach_update
и отEntityFieldQuery
кdb_query_range
было весьма полезным. С 3ч обновление до 40 минут.Если вы не хотите сохранять полевые данные, не вызывая стандартных событий и действий, вы можете использовать drupal_write_record .
Вот пример для вставки Hello World в поле body для узла типа article с идентификатором 1.
Если ваш сайт мультиязычный, вы должны будете использовать «en» или язык вашего контента вместо «und».
Если вы делаете доработку, вам нужно быть осторожным, чтобы вставить правильный идентификатор ревизии, иначе вы можете просто вставить то же значение, что и entity_id.
Обратите внимание, как эти данные вставляются в две таблицы field_data_ * и field_revision_ *. Вы должны вставить в оба, чтобы убедиться, что сайт работает как нужно.
После этого вам необходимо очистить кеши для полей, которые будут отображаться в зависимости от того, как настроено ваше кеширование.
источник
Для такого простого обновления, как это, где нужно обновить множество узлов, я всегда использую оператор обновления MySQL. Да, кеширование необходимо принимать во внимание, но вы можете просто очистить кеш после того, как закончите, и это все хорошо. Вы, конечно, должны быть знакомы со структурой данных, но в Drupal 6 это относительно просто (хотя в Drupal 7 это ужасно)
источник
Я
field_attach_update
тоже предлагаю , а не прямой SQL-запрос, потому что sql не обновляет объект кэша узла, и в следующий разnode_load
вы не загрузите обновленное значение поля, вы загрузите старое значениеfield_attach_update
это намного лучше, чем прямой запрос SQL.источник
stdClass
объект без загрузки. Знаете ли вы, что может произойти, если я попытаюсь обновить узел таким образом, не устанавливая все поля? Будут ли они перезаписаны нулями или значениями по умолчанию? Может, они будут проигнорированы при обновлении?Перепробовав все подходы, упомянутые в других ответах, я получил очень медленное время обновления (около 7 дней для 700 000 узлов типа узла с 20+ полями), пока не нашел эту статью: http://www.drupalonwindows.com/en/ blog / only-update-changes-fields-or-properties-entity-drupal .
После реализации чего-то вроде приведенного ниже кода в hook_update я сократил время обновления до 2 часов, что я считаю управляемым.
источник
У меня даже было такое же требование обновления поля для всех узлов определенного типа контента. Я использовал node_load_multiple и field_attach_update .
Я пробежал по нему, и это было довольно быстро.
источник
Рассматривали ли вы сделать эти обновления непосредственно в базу данных, используя MySQL? Это, наверное, самый простой и быстрый способ достичь того, чего вы хотите.
Вот простой пример. Вы можете выполнить такую команду на вкладке «SQL» в phpMyAdmin. Представьте, что у вас есть тип контента, который называется Профиль участника. В нем есть поле с именем «Тип участника» (например, компания, частное лицо, организация). Допустим, вы хотите обновить все вхождения для «КОМПАНИЯ» на «компания». Следующая команда сделает это.
ОБНОВЛЕНИЕ content_type_member_profile SET
field_type_of_member_value
= 'company' WHEREfield_type_of_member_value
= 'COMPANY';Кроме того, оформить заказ Начало работы с MySQL
источник