Jak mogę szybko ponownie zapisać wszystkie węzły w mojej witrynie (aby wyzwolić regułę, która aktywuje się po aktualizacji zawartości)?

24

Popełniłem kilka błędów podczas konfigurowania określonego typu treści w mojej witrynie. Aby naprawić te błędy, wprowadziłem regułę, która wykonuje pewne działania „po zaktualizowaniu istniejącej zawartości”. Nie chcę jednak przeglądać mojej witryny i ręcznie zapisywać wszystkich węzłów jeden po drugim. Czy istnieje sposób na użycie reguł lub widoków Operacje zbiorcze, aby szybko ponownie zapisać wszystkie węzły?

Patrick Kenny
źródło

Odpowiedzi:

22

VBO ma akcję „Wykonaj kod PHP”. Uruchom go i wpisz „node_save ($ entity);” (bez cudzysłowów) w polu tekstowym. To załatwi sprawę, jednocześnie zajmując się limitami czasu dla Ciebie.

Bojan Zivanovic
źródło
1
Ach, o wiele szybciej :)
Clive
5
W VBO dostępna jest opcja „Zapisz zawartość”, która zrobi to samo bez konieczności pisania własnego PHP.
stevenw00,
Nie mogłem znaleźć opcji „Zapisz treść”, ale wspomniana metoda php działała świetnie! Dzięki!
hockey2112
Wypróbowałem metody php i vbo bez powodzenia. W moim przypadku tylko ręczne zapisywanie poprawnie aktualizuje etykiety pola tabeli. Dziwne ...
Bisonbleu,
14

Nie wiem o regułach ani VBO, ale możesz użyć krótkiego fragmentu kodu, aby uzyskać ten sam wynik:

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

Jeśli masz wiele węzłów, które mogą zająć trochę czasu, więc jeśli Twój serwer na to pozwala, dobrym pomysłem byłoby przedłużenie limitu czasu na początku tego kodu, być może nieograniczony, jeśli jest to jednorazowy :

set_time_limit(0);
Clive
źródło
12

Możesz użyć funkcji node_mass_update () :

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

Jest bardzo dobry, ponieważ nie musisz się martwić o limit czasu. Proces wsadowy aktualizacji węzłów rozpocznie się automatycznie, jeśli jest więcej niż 10 węzłów.

Milkovsky
źródło
5
Doskonale działał na ponad 200 000 węzłów. Obsługuje partię dla Ciebie. Jeśli masz włączony moduł devel, możesz po prostu wkleić powyższy kod na stronie „/ devel / php”
2pha
1
Świetne rozwiązanie, działa w tle, więc nie ma szans na przekroczenie limitu czasu lub zabicie wydajności strony
Daniel Waters
5

Aktualizacja: Właśnie utworzyłem Resave All Nodes . Na razie zawiera tylko formularz, aby uruchomić proces wsadowy w celu ponownego zapisania wszystkich węzłów wybranych typów węzłów. Obecnie w wersji alfa. Planuję dodać polecenie Drusha (beta) i niektóre testy (stabilne).

Drupal Resave All Nodes z zrzutu ekranu


węzły Resave . Jest przeznaczony do stosowania na biegach crona. Ale możesz także uruchomić go ręcznie. Po prostu wybierz, które węzły typu treści powinny zostać ponownie zapisane.

Zanim będziesz mógł uruchomić ręczne ponowne zapisywanie, naciskając „Resave Nodes Now”, musisz kiedyś „Save Configuration” (wybrać typ crona i typ zawartości).

leymannx
źródło
2

Przejdź do admin / content i filtruj według typu zawartości - tylko opublikowane. Wybierz wszystko, a następnie wybierz „zmień wartość” z listy rozwijanej operacji. Kliknij „wykonaj”. Na następnej stronie wybierz „status” z właściwości i pozostaw opublikowany. Kliknij „dalej”. Wszystkie opublikowane węzły zostaną ponownie zapisane bez zmian.

Powtórz dla niepublikowanych węzłów (ale wybierz niepublikowane jako właściwość).

Robb Davis
źródło