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?

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.


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);

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.


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).


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ść).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.