czy możliwe jest programowe zregenerowanie ślimaków po zmianie tytułów postu? Liczne tytuły postów zostały zaktualizowane, a ślimak nie został zaktualizowany tytułem, więc muszę zregenerować wszystkie te ślimaki.
Musiałem to zrobić kilka razy i stwierdziłem, że między różnymi środowiskami serwerowymi, w których nie może on obsługiwać dużych tablic (z ustawionymi liczbami nieograniczonymi), ani też wielokrotnego wywoływania wp_update_post przy dużym zużyciu pamięci, które dzielą go na wywołanie WP_Query z paginacją i używaniem $ wpdb, że jest łatwiejszy w zarządzaniu i bardziej wydajny. I pod warunkiem, że przykładowy kod na podobnym stanowisku .
codearachnid
Odpowiedzi:
17
Tak to mozliwe.
Przykładowy kod musi zostać przetestowany i dopracowany:
// get all posts
$posts = get_posts( array ('numberposts'=>-1));foreach( $posts as $post ){// check the slug and run an update if necessary
$new_slug = sanitize_title( $post->post_title );if( $post->post_name != $new_slug ){
wp_update_post(
array ('ID'=> $post->ID,'post_name'=> $new_slug
));}}
Właśnie to wymyśliłem, prawdopodobnie są jakieś błędy i np. Przypadki, ale powinno to dać ci pomysł. Może to także chwilę potrwać, więc warto podzielić aktualizację na mniejsze części.
Hmmm ... z mojego doświadczenia, to nie działa. post_nameArgumentem jest ignorowany przez wp_update_post, co najmniej w wersji rdzenia 3,9
Alexandre Bourlier
Obecnie post_namejest ignorowany w ramach wp_update_post()funkcji, ale jest brany pod uwagę, gdy post z aktualizacją wywołuje wp_insert_post()funkcję: oznacza to, że przekazanie nowego ślimaka do aktualizacji spowoduje efektywną zmianę go dla aktualizowanego postu.
Próbowałem metody zaproponowanej przez Toscho, która jest „instynktowna”, ale w wielu przypadkach nie działa (por. Kod podstawowy, aby uzyskać to, co rozumiem przez „wiele przypadków”).
Przeglądając kod, znalazłem wp_insert_post_datahak filtra, wywołany przez wp_update_postfunkcję tuż przed wstawieniem postu iunto do bazy danych.
Po wywołaniu tego filtra i zmianie wartości $data['post_name']udało mi się sprawić, aby działał poprawnie. Wordpress jest fajny, ale tak źle udokumentowany ...
Czy możesz wskazać, dlaczego wp_update_post nadpisuje nazwę post? jedyny powód, dla którego to widzę, jest taki, że jeśli użytkownik próbuje zmodyfikować nazwę postu, jest tylko współautorem (lub tym samym poziomem), w którym to przypadku nie powinien zezwalać temu użytkownikowi na zmianę ślimaka, czy znalazłeś inne przypadki, w których post_name jest nadpisany?
jnhghy - Alexandru Jantea
Tak, jest to właściwy sposób, aby to zrobić. Dziękuję @Alexandre
user88731,
-1
możesz to zrobić bezpośrednio w mysql, jeśli potrzebujesz. (nasza strona woocommerce zawiera setki tysięcy produktów):
update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title),'"',''),"'",''),",",'-')," ",'-'),"&",''),";",''),"@",''),".",''),":",''),"/",''),"+",''),"(",''),")",''),"--",'-'),"---",'-'),"--",'-'),"--",'-'),'-', id)where post_type ='product';
gdzie post_type = 'product' - dzięki temu Twoja aktualizacja będzie zawierać tylko produkty woocommerce; powinieneś dowiedzieć się, jakie ograniczenia chcesz zachować dla tego zapytania.
Odpowiedzi:
Tak to mozliwe.
Przykładowy kod musi zostać przetestowany i dopracowany:
Właśnie to wymyśliłem, prawdopodobnie są jakieś błędy i np. Przypadki, ale powinno to dać ci pomysł. Może to także chwilę potrwać, więc warto podzielić aktualizację na mniejsze części.
źródło
post_name
Argumentem jest ignorowany przezwp_update_post
, co najmniej w wersji rdzenia 3,9post_name
jest ignorowany w ramachwp_update_post()
funkcji, ale jest brany pod uwagę, gdy post z aktualizacją wywołujewp_insert_post()
funkcję: oznacza to, że przekazanie nowego ślimaka do aktualizacji spowoduje efektywną zmianę go dla aktualizowanego postu.Ta wtyczka wykonuje również zadanie: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Jednak, podobnie jak w przypadku postów, które nie mają jeszcze ślimaka, jeśli chcesz zregenerować ślimaki, edytuj następujący wiersz we wtyczce:
if ($post->post_name == "") {
na przykład możesz zmienić to na:
if (true) {
źródło
Próbowałem metody zaproponowanej przez Toscho, która jest „instynktowna”, ale w wielu przypadkach nie działa (por. Kod podstawowy, aby uzyskać to, co rozumiem przez „wiele przypadków”).
Przeglądając kod, znalazłem
wp_insert_post_data
hak filtra, wywołany przezwp_update_post
funkcję tuż przed wstawieniem postu iunto do bazy danych.Po wywołaniu tego filtra i zmianie wartości
$data['post_name']
udało mi się sprawić, aby działał poprawnie. Wordpress jest fajny, ale tak źle udokumentowany ...Zredagowałem dokumentację , aby w razie potrzeby więcej osób mogło znaleźć to obejście.
źródło
możesz to zrobić bezpośrednio w mysql, jeśli potrzebujesz. (nasza strona woocommerce zawiera setki tysięcy produktów):
gdzie post_type = 'product' - dzięki temu Twoja aktualizacja będzie zawierać tylko produkty woocommerce; powinieneś dowiedzieć się, jakie ograniczenia chcesz zachować dla tego zapytania.
źródło