Как я могу быстро повторно сохранить все узлы на моем сайте (чтобы активировать правило, которое активируется при обновлении контента)?

24

Я сделал несколько ошибок при настройке определенного типа контента на моем сайте. Чтобы исправить эти ошибки, я создал правило, которое выполняет некоторые действия «при обновлении существующего контента». Однако я не хочу просматривать мой сайт и вручную снова сохранять все узлы один за другим. Есть ли способ использовать правила или просмотры групповых операций для быстрого повторного сохранения всех узлов?

Патрик Кенни
источник

Ответы:

22

VBO имеет действие «Выполнить код PHP». Запустите его и введите «node_save ($ entity);» (без кавычек) в текстовом поле. Это сработает, пока вы справитесь с таймаутами.

Боян Живанович
источник
1
Ааа, намного быстрее :)
Клайв
5
В VBO есть опция «Сохранить содержимое», которая будет делать то же самое без необходимости писать собственный PHP.
stevenw00
Я не смог найти опцию «Сохранить содержимое», но упомянутый вами метод php работал отлично! Благодарность!
hockey2112
Пробовал оба метода php и vbo безуспешно. В моем случае только ручное сохранение корректно обновляет метки для поля таблицы. Странно ...
Bisonbleu
14

Я не знаю о правилах или VBO, но вы можете использовать короткий фрагмент кода, чтобы получить тот же результат:

$nids = db_query('SELECT nid FROM {node}')->fetchCol();
foreach (node_load_multiple($nids) as $node) {
  node_save($node);
}

Если у вас есть много узлов, на которые может потребоваться некоторое время, поэтому, если ваш сервер это позволяет, было бы неплохо продлить ограничение времени в начале этого кода, возможно, до неограниченного, если оно отключено. :

set_time_limit(0);
Клайв
источник
12

Вы можете использовать функцию node_mass_update () :

module_load_include('inc', 'node', 'node.admin');
$nids = db_query('SELECT nid FROM {node}')->fetchCol();
node_mass_update($nids, array());

Это очень хорошо, так как вам не нужно заботиться об ограничении времени. Пакетный процесс обновления узлов начнется автоматически, если имеется более 10 узлов.

Мильковский
источник
5
Отлично работал на более чем 200 000 узлов. Обрабатывает партию для вас. Если у вас включен модуль devel, вы можете просто вставить приведенный выше код на странице '/ devel / php'
2pha
1
Brilliant решение, работает в фоновом режиме , так что никаких шансов на тайм - аут или убийство производительности сайтов
Daniel Waters
5

Обновление: я только что создал Resave All Nodes . На данный момент он содержит только форму для запуска пакетного процесса, чтобы сохранить все узлы выбранных типов узлов. В настоящее время в альфа. Я планирую добавить команду Drush (бета) и некоторые тесты (стабильные).

Скриншот формы Drupal Resave All Nodes


Есть Resave Nodes . Он предназначен для использования на cron. Но вы также можете запустить его вручную. Просто выберите, какой тип контента должен быть сохранен.

Прежде чем вы сможете запустить ручное восстановление, нажав «Восстановить узлы сейчас», вам нужно «Сохранить конфигурацию» (выбрать тип cron и тип содержимого).

leymannx
источник
2

Зайдите в admin / content и отфильтруйте по типу контента - только для публикации. Выберите все, а затем выберите «изменить значение» из выпадающего списка операций. Нажмите «выполнить». На следующей странице выберите «статус» из свойств и оставьте опубликованным. Нажмите «Далее». Все опубликованные узлы будут сохранены без изменений.

Повторите эти действия для неопубликованных узлов (но выберите неопубликованные в качестве свойства).

Робб Дэвис
источник